Examen des instructions ASSERT
Supposons que vous ne rencontriez pas de problème lorsque vous exécutez la version debug de votre application MFC.Cependant, la version release de la même application se bloque, retourne des résultats incorrects et/ou se comporte anormalement.
Ce problème peut trouver son origine dans la quantité importante de code que vous placez dans une instruction ASSERT pour confirmer sa parfaite exécution.Dans la mesure où les instructions ASSERT sont mises en commentaire dans la version release d'un programme MFC, le code ne s'exécute pas dans une version release.
Si vous utilisez ASSERT pour vérifier qu'un appel de fonction a réussi, pensez à utiliser VÉRIFIER à la place.La macro VERIFY évalue ses propres arguments dans les deux versions debug et release de l'application.
Une autre technique préférable consiste à assigner la valeur de retour de la fonction à une variable temporaire, puis à tester la variable dans une instruction ASSERT.
Examinons 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 la version debug d'une application MFC.Si l'appel à calloc( ) échoue, un message de diagnostic comprenant le fichier et le numéro de ligne apparaît.Cependant, dans la version commerciale d'une application MFC :
l'appel à calloc( ) ne survient jamais, laissant buf non initialisée, ou
strcpy_s( ) copie "Hello, World" dans une partie aléatoire de mémoire, bloquant probablement l'application, entraînant l'arrêt du système ou
free() tente de libérer un espace mémoire qui n'a jamais été alloué.
Pour utiliser ASSERT correctement, l'exemple de code doit être remplacé par celui-ci :
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Sinon, vous pouvez utiliser plutôt VERIFY :
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );