Compartilhar via


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, deixando buf não inicializada ou

  • strcpy_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 ou

  • free() 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 );

Confira também

Corrigindo problemas do build de versão