Utilisation d'assertions

L'utilisation d'assertion 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 le programme. 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 exemple :

#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 maintenant une version du code renforcé par une assertion :


#include <assert.h>
#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 "assertion failed in file test-assert.c, function main(), line 17" et quitter, ce qui est très pratique pour le programmeur pour retrouver la faute.

Pour plus de détails : man 3 assert

retour à la page complément