Delen via


VERIFIËREN gebruiken in plaats van ASSERT

Stel dat wanneer u de foutopsporingsversie van uw MFC-toepassing uitvoert, er geen problemen zijn. De releaseversie van dezelfde toepassing loopt echter vast, retourneert onjuiste resultaten en/of vertoont een ander abnormaal gedrag.

Dit probleem kan worden veroorzaakt wanneer u belangrijke code in een ASSERT-instructie plaatst om te controleren of deze correct wordt uitgevoerd. Omdat ASSERT-instructies als commentaar worden opgenomen in een release-build van een MFC-programma, wordt de code niet uitgevoerd in een release-build.

Als u ASSERT gebruikt om te bevestigen dat een functie-aanroep is geslaagd, kunt u in plaats daarvan CONTROLEREN gebruiken. De macro VERIFY evalueert zijn eigen argumenten in zowel foutopsporing als release-builds van de toepassing.

Een andere voorkeurstechniek is het toewijzen van de retourwaarde van de functie aan een tijdelijke variabele en vervolgens de variabele testen in een ASSERT-instructie.

Bekijk het volgende codefragment:

enum {
    sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Deze code wordt perfect uitgevoerd in een foutopsporingsversie van een MFC-toepassing. Als de aanroep naar calloc( ) mislukt, wordt er een diagnostisch bericht weergegeven dat het bestand en regelnummer bevat. Echter, in een retailversie van een MFC-toepassing:

  • de oproep naar calloc( ) vindt nooit plaats, waardoor buf niet wordt geïnitialiseerd, of

  • strcpy_s( ) kopieert 'Hello, World' naar een willekeurig stukje geheugen, mogelijk crasht de toepassing of zorgt ervoor dat het systeem niet meer reageert, of

  • free() probeert geheugen vrij te geven dat nooit werd toegewezen.

Als u ASSERT correct wilt gebruiken, moet het codevoorbeeld worden gewijzigd in het volgende:

enum {
    sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

U kunt ook VERIFIËREN gebruiken:

enum {
    sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Zie ook

Problemen met releasebuild oplossen