Untersuchen von ASSERT-Anweisungen
Aktualisiert: November 2007
Angenommen, das Ausführen des Debugbuilds der MFC-Anwendung verläuft ohne Probleme. Die Releaseversion derselben Anwendung wird jedoch nach einer Fehlfunktion beendet, gibt falsche Ergebnisse zurück und/oder weist ein anderes nicht normales Verhalten auf.
Dieses Problem kann entstehen, wenn Sie in eine ASSERT-Anweisung wichtigen Code einfügen, um festzustellen, ob er einwandfrei ausgeführt wird. Da ASSERT-Anweisungen im Releasebuild eines MFC-Programms auskommentiert werden, wird der Code im Releasebuild nicht ausgeführt.
Es wird empfohlen, VERIFY anstelle von ASSERT zu verwenden, um die erfolgreiche Ausführung eines Funktionsaufrufs zu bestätigen. Das VERIFY-Makro wertet seine eigenen Argumente sowohl im Debug- als auch im Releasebuild einer Anwendung aus.
Eine weitere bevorzugte Methode besteht darin, den Rückgabewert der Funktion einer temporären Variablen zuzuweisen und diese Variable dann in einer ASSERT-Anweisung zu testen.
Beachten Sie das folgende Codefragment:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Dieser Code wird in der Debugversion einer MFC-Anwendung fehlerfrei ausgeführt. Wenn der Aufruf von calloc( ) fehlschlägt, wird eine diagnostische Meldung mit dem Dateinamen und der Zeilennummer angezeigt. Im Releasebuild einer MFC-Anwendung geschieht jedoch Folgendes:
Der Aufruf calloc( ) findet niemals statt, wodurch buf nicht initialisiert wird. Oder
strcpy_s( ) kopiert die Zeichenfolge "Hello, World" an eine beliebige Stelle im Arbeitsspeicher, was wahrscheinlich dazu führt, dass das System nach einer Fehlfunktion beendet wird oder hängen bleibt. Oder
free() versucht, Arbeitsspeicher freizugeben, der niemals reserviert war.
Damit ASSERT problemlos verwendet werden kann, sollte das Codebeispiel folgendermaßen geändert werden:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Sie können stattdessen auch VERIFY verwenden:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );