teaching / slides > programmation 3 > utilisation d'assertion

utilisation d'assertions

L'utilisation d'assertion losque vous programmez est très important. Cela permet de réduire le risque d'erreur et facilite le debugage.

Une assertion est un petit morceau de code supplémentaire qui va vérifier qu'une condition donnée est vraie. Si la condition n'est pas vraie, l'application va afficher un message d'erreur et quitter. En règle générale, le fait qu'une assertion échoue veut dire que quelque chose que le programmeur n'avait pas prévu s'est produit.

Voici un example simple:

#include <stdio.h>

int main() {
  int i;
  printf("Entrez un nombre: ");
  while (scanf("%d", &i)!=1) {
    printf("Un nombre SVP: ");
    while(getc(stdin)!='\n')
      ;
  }
  if (i%3==0) {
    printf("Le nombre est divisible par 3.\n");
  } else if(i%3==1) {
    printf("Le nombre divisé par trois donne un reste de 1.\n");
  } else {
    printf("Je suis sûr que le nombre divisé par trois donne un reste de 2.\n");
    printf("Vérification: %d \% 3 = %d\n", i, i%3);
  }
  return 0;
}

Ce petit programme a l'air correct, n'est-ce pas ? Malheureusement ce n'est pas le cas. Si le nombre entré en parametre est négatif, le reste de la division sera aussi négatif.

Voici donc une version du code renforcé par une assertion:

#define ASSERT(ex) if (!(ex)) {printf("Assert (%s) failed line %d, file %s\n", __STRING(ex), __LINE__, __FILE__); exit(-1);}
#include <stdio.h>

int main() {
  int i;
  printf("Entrez un nombre: ");
  while (scanf("%d", &i)!=1) {
    printf("Un nombre SVP: ");
    while(getc(stdin)!='\n')
      ;
  }
  if (i%3==0) {
    printf("Le nombre est divisible par 3.\n");
  } else if(i%3==1) {
    printf("Le nombre divisé par trois donne un reste de 1.\n");
  } else {
    ASSERT(i%3==2);
    printf("Je suis sûr que le nombre divisé par trois donne un reste de 2.\n");
    printf("Vérification: %d \% 3 = %d\n", i, i%3);
  }
  return 0;
}

Si l'assertion venait a être négative, alors le programme va afficher "Assert (i%3==2) failed line xx, file yyy.c" et quitter, ce qui est très pratique pour retrouver la faute.