Erreurs les plus courantes

Le langage C par nature est source d’erreurs liées à sa nature.

Off by one, buffer overflow, stack overflow, integer overflow (1u–), fuites mémoire, performance quadratique

L’erreur “manqué de un” (off by one)

Rien n’interdit à un programme de lire en dehors d’un tableau, par exemple

#include<stdio.h>

int main() {
    int toto[3] = {1, 2, 3};

    printf("%d\n", toto[3]); // lecture hors tableau
}

Comme la numération du rang des cases des tableaux commence par zero, il est très courant de lire par erreur une rangée trop loin ou une rangée trop courte de là où on devrait lire. Ce type d’erreur, très courant en C, s’appele un “off by one error” (manqué de un). Pour s’en prémunir on recommande d’écrire du code stéréotypé, par exemple pour afficher tous les éléments d’un tableau on utilisera une boucle for, on commence l’itérateur à zero, qu’on appelle i et on vérifie la borne de manière strictement inférieure.

#include<stdio.h>

int main() {
    int toto[3] = {1, 2, 3};

    // manière stéréotypée et sûre
    for (int i = 0; i < 3; i++) {
        printf("%d\n", toto[i]);
    }

    // manière inhabituelle et difficile à lire
    // d'ailleurs ce code contint une faute, vous
    // apparait-elle de manière évidente et facile à trouver ?
    int it = 0;
    while (it++ <=2) {
        printf("%d\n", toto[it-1]);
    }
}

Activer les options de compilation de debogage peut également aider. Le compilateur ajoutera des cases empoisonées autour de chaque variable et tableau et si ces valeurs sont lues, un SEGFAULT sera lancé avec des informations de débogage utiles.