Freigeben über


Untersuchen von ASSERT-Anweisungen

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, Sie ÜBERPRÜFEN 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 belegt 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 );

Siehe auch

Referenz

Beheben von Problemen mit dem Releasebuild