C++Guns – RoboBlog

07.05.2013

safer code

Filed under: Allgemein — Tags: , — Thomas @ 21:05

Was ist das Problem mit folgenden Code?


    Element *ele                // uninitialisierter pointer;
    while(iter->hasNext()) {    // schleife kann auch nicht ausgefuehrt werden
        ele = iter->next();
        ...
    }
    qDebug() << ele;            // segfault
 

Wir nehmen mal an, dass qDebug() hier normalerweise nicht stehen würde. Man wollte sich aber das Element ausgeben lassen und hat vergessen die Debug Ausgabe wieder zu löschen.
Problem ist, dass die Variable ele durch qDebug dereferenziert wird, obwohl der Pointer ins Nirvana zeigen kann, wenn die Schleife nicht ausgeführt wird.
Der erste Fehler ist den Pointer nicht zu initialisieren. Man hätte ihn auf 0 (nulptr) setzen können. Das hätte den segfault aber nicht verhindert, aber das Debuggen erleichtert.
Der eigentliche Fehler ist, dass ele ausserhalb der Schleife deklariert wurde. Das Element darf nur innerhalb der Schleife existieren, da es auch nur dort gebraucht wird. Wie gesagt gäbe es im Normalfall auch keine Debug Ausgabe mit qDebug().

Leider gibt der Compiler in diesem Fall auch kein Warning aus (gcc 4.7 -Wall -Wextra)

Hier der richtige Code. Der Scope von ele wurde verkleinert und der Pointer sofort mit einer gültigen Adresse belegt.


    while(iter->hasNext()) {
        Element *ele = iter->next();
       qDebug() << ele;
    }
 

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress