Použití příkazu VERIFY místo ASSERT
Předpokládejme, že při spuštění ladicí verze aplikace MFC nejsou žádné problémy. Verze stejné aplikace se ale chybově ukončí, vrátí nesprávné výsledky a/nebo vykazuje jiné neobvyklé chování.
Tento problém může být způsoben tak, že do příkazu ASSERT umístíte důležitý kód, který ověří, že funguje správně. Vzhledem k tomu, že příkazy ASSERT jsou okomentovány v sestavení vydané verze programu MFC, kód se nespustí v sestavení vydané verze.
Pokud k potvrzení úspěšného volání funkce používáte ASSERT, zvažte místo toho použití funkce VERIFY . Makro VERIFY vyhodnocuje své vlastní argumenty v sestaveních ladění i vydané verze aplikace.
Další upřednostňovanou technikou je přiřazení návratové hodnoty funkce k dočasné proměnné a následné otestování 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 dokonale spustí v ladicí verzi aplikace MFC. Pokud volání calloc( )
selže, zobrazí se diagnostická zpráva, která obsahuje soubor a číslo řádku. V maloobchodním sestavení aplikace MFC však:
k volání, ke kterému
calloc( )
nikdy nedojde, opuštěníbuf
neinicializované nebostrcpy_s( )
zkopíruje "Hello, World
" do náhodné části paměti, pravděpodobně dojde k chybě aplikace nebo způsobí, že systém přestane reagovat, nebofree()
pokusy o uvolnění paměti, která nebyla nikdy přidělena.
Pokud chcete použít příkaz ASSERT správně, měl by se vzorový kód změnit na 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 místo toho použít funkci VERIFY:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );