Compartir a través de


Examinar instrucciones ASSERT

Actualización: noviembre 2007

Supongamos que, al ejecutar la versión de depuración de la aplicación MFC, no se producen problemas. Sin embargo, la versión de lanzamiento de la misma aplicación termina de forma anormal, devuelve resultados incorrectos o presenta algún otro comportamiento extraño.

Este problema puede surgir al colocar código importante en una instrucción ASSERT para comprobar si funciona correctamente. Como las instrucciones ASSERT se marcan como comentarios en una versión de lanzamiento de un programa MFC, el código no funcionará correctamente.

Si está utilizando ASSERT para confirmar si una llamada a función se realizó correctamente, considere en su lugar el uso de VERIFY. La macro VERIFY evalúa sus propios argumentos tanto en versiones de depuración como en versiones de lanzamiento de la aplicación.

Otra técnica recomendable consiste en asignar el valor devuelto por la función a una variable temporal y, a continuación, probar la variable en una instrucción ASSERT.

Examine el siguiente fragmento de código:

enum {
    sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Este código funciona perfectamente en una versión de depuración de una aplicación MFC. Si la llamada a calloc( ) no se realiza correctamente, aparece un mensaje de diagnóstico que indica el archivo y el número de línea. Sin embargo, en una versión comercial de una aplicación MFC:

  • La llamada a calloc( ) no se produce nunca y buf queda sin inicializar, o bien

  • strcpy_s( ) copia "Hello, World" en una ubicación aleatoria de la memoria y, posiblemente, termina la aplicación de forma anormal o bloquea el sistema, o bien

  • free() intenta liberar memoria que nunca se llegó a asignar.

Para utilizar ASSERT correctamente, el ejemplo de código se debería escribir del siguiente modo:

enum {
    sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

O bien, puede utilizar VERIFY:

enum {
    sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Vea también

Referencia

Solucionar problemas de versiones de lanzamiento