Usando VERIFY em vez de ASSERT
Suponha que, ao executar a versão de depuração do seu aplicativo do MFC, não haja problemas. No entanto, a versão de lançamento do mesmo aplicativo falha, retorna resultados incorretos e/ou exibe algum outro comportamento anormal.
Esse problema pode ser causado quando você coloca um código importante em uma instrução ASSERT para verificar se ele é executado corretamente. Como as instruções ASSERT são comentadas em um build de lançamento de um programa do MFC, o código não é executado nesse tipo de build.
Se você estiver usando ASSERT para confirmar se uma chamada de função é bem-sucedida, considere usar VERIFY. A macro VERIFY avalia seus próprios argumentos em builds de depuração e lançamento do aplicativo.
Outra técnica preferencial é atribuir o valor retornado da função a uma variável temporária e testar a variável em uma instrução ASSERT.
Considere o fragmento de código a seguir:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Esse código é executado perfeitamente em uma versão de depuração de um aplicativo do MFC. Se a chamada para calloc( )
falhar, uma mensagem de diagnóstico que inclui o arquivo e o número de linha será exibida. No entanto, em um build de varejo de um aplicativo do MFC:
a chamada para
calloc( )
nunca ocorre, deixandobuf
não inicializada oustrcpy_s( )
copia "Hello, World
" em uma parte aleatória da memória, possivelmente ocasionando falha do aplicativo ou fazendo com que o sistema pare de responder oufree()
tenta liberar memória que nunca foi alocada.
Para usar a ASSERT corretamente, o exemplo de código deve ser alterado da seguinte forma:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Ou, em vez disso, você pode usar VERIFY:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );