Utilisation de VERIFY au lieu d'ASSERT
Supposons que lorsque vous exécutez la version de débogage de votre application MFC, il n’y a aucun problème. Toutefois, la version de mise en production de la même application plante, retourne des résultats incorrects et/ou présente un autre comportement anormal.
Ce problème peut être dû au fait que vous placez du code important dans une instruction ASSERT pour vérifier qu’il s’exécute correctement. Étant donné que les instructions ASSERT sont commentées dans une build de version d’un programme MFC, le code ne s’exécute pas dans une build de mise en production.
Si vous utilisez ASSERT pour confirmer qu’un appel de fonction a réussi, envisagez d’utiliser VERIFY à la place. La macro VERIFY évalue ses propres arguments dans les builds de débogage et de mise en production de l’application.
Une autre technique préférée consiste à affecter la valeur de retour de la fonction à une variable temporaire, puis à tester la variable dans une instruction ASSERT.
Examinez le fragment de code suivant :
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Ce code s’exécute parfaitement dans une version de débogage d’une application MFC. Si l’appel échoue calloc( )
, un message de diagnostic incluant le fichier et le numéro de ligne s’affiche. Toutefois, dans une build commerciale d’une application MFC :
l’appel à
calloc( )
ne jamais se produire, en laissantbuf
non initialisé oustrcpy_s( )
copie «Hello, World
» dans une partie aléatoire de la mémoire, peut-être bloquer l’application ou provoquer l’arrêt du système de réponse, oufree()
tente de libérer de la mémoire qui n’a jamais été allouée.
Pour utiliser ASSERT correctement, l’exemple de code doit être remplacé par ce qui suit :
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Vous pouvez également utiliser VERIFY à la place :
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );