Použití příkazu VERIFY místo ASSERT
Předpokládejme, že když spustíte ladicí verze aplikace knihovny MFC, nebyly zaznamenány žádné problémy.Verzi stejné aplikace, dojde k chybě, vrací nesprávné výsledky nebo vykazuje některé neobvyklé chování.
Tento problém může dojít při umístění důležitých kódu v příkazu ASSERT, chcete-li ověřit, že provádí správně.Vzhledem k tomu, že vyhodnocení výkazů jsou zakomentovány ve vydané verzi aplikace knihovny MFC, kód nelze spustit ve vydané verzi.
Používáte-li k potvrzení, že volání funkce úspěšně ASSERT, zvažte použití VERIFY místo.Makro ověřit vyhodnocuje vlastní argumenty obě a vydaná sestavení aplikace.
Jiné upřednostňované technika je návratová hodnota funkce přiřadit dočasnou proměnnou a poté otestovat proměnné v příkazu ASSERT.
Prozkoumejte následující fragment kódu:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Tento kód se spustí zcela v ladicí verze aplikace knihovny MFC.Pokud volání calloc( ) se zobrazí diagnostickou zprávu, která obsahuje soubor a číslo řádku, se nezdaří.Nicméně v maloobchodní sestavení aplikace knihovny MFC:
volání calloc( ) nikdy nedošlo, opustit buf inicializovat, nebo
strcpy_s( )kopie "Hello, World" do náhodné část paměti, případně selhání aplikace nebo příčinou systém přestane reagovat, nebo
free()se pokusí uvolnit paměť, která byla přidělena nikdy.
Chcete-li správně použít ASSERT, by měl být změněn ukázkový kód následující:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Nebo můžete použít místo ověřit:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );