Utilizzo di VERIFY invece di ASSERT
Si supponga che quando si esegue la versione di debug dell'applicazione MFC, non ci sono problemi. Tuttavia, la versione di rilascio della stessa applicazione si arresta in modo anomalo, restituisce risultati non corretti e/o presenta altri comportamenti anomali.
Questo problema può essere causato quando si inserisce codice importante in un'istruzione ASSERT per verificare che funzioni correttamente. Poiché le istruzioni ASSERT sono impostate come commento in una build di versione di un programma MFC, il codice non viene eseguito in una build di versione.
Se si usa ASSERT per confermare che una chiamata di funzione ha avuto esito positivo, è consigliabile usare VERIFY . La macro VERIFY valuta i propri argomenti nelle build di debug e versione dell'applicazione.
Un'altra tecnica preferita consiste nell'assegnare il valore restituito della funzione a una variabile temporanea e quindi testare la variabile in un'istruzione ASSERT.
Esaminare il frammento di codice seguente:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Questo codice viene eseguito perfettamente in una versione di debug di un'applicazione MFC. Se la chiamata a calloc( )
non riesce, viene visualizzato un messaggio di diagnostica che include il file e il numero di riga. Tuttavia, in una compilazione definitiva di un'applicazione MFC:
la chiamata a
calloc( )
non si verifica mai, lasciandobuf
non inizializzato, ostrcpy_s( )
copia "Hello, World
" in una parte casuale di memoria, possibilmente arrestando l'applicazione o causando l'arresto anomalo del sistema ofree()
tenta di liberare memoria che non è mai stata allocata.
Per usare correttamente ASSERT, l'esempio di codice deve essere modificato nel modo seguente:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
In alternativa, è possibile usare VERIFY:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );