Dans le langage C, les variables sont initialisées différemment selon le spécificateur de stockage :
Exemple de différences :
void example() { int a; // automatique, non initialisée static int b; // initialisée à 0 printf("a=%d, b=%d ", a, b); } int c; // globale, initialisée à 0
Les erreurs proviennent d'une mauvaise hypothèse concernant l'initialisation. Pour des raisons de sécurité, initialisez toujours les variables explicitement.
Une variable locale automatique est-elle initialisée à 0 si elle est déclarée au niveau de la fonction en dehors d'un bloc ?
Réponse :
Non ! Même si la variable est déclarée au début de la fonction mais sans initialisation explicite, elle contiendra une valeur indéterminée :
void f() { int x; printf("%d ", x); // UB : x non initialisée }
Histoire
Dans un logiciel bancaire, un compteur de fonction non initialisé a parfois conduit à des valeurs très négatives — résultat : des bonus erronés étaient crédités au client, et le bug n'a été découvert qu'avec des données réelles.
Histoire
Un processeur multimédia d'images partait du principe que les tableaux statiques étaient toujours remplis de zéros. Après le passage à un autre compilateur (avec un environnement non standard), un segfault a été découvert — une partie de la mémoire n'avait pas été physiquement allouée au processus.
Histoire
Dans une bibliothèque de cryptographie, un développeur n'a pas initialisé un tampon temporaire de mots de passe, pensant que le tampon de la section globale était rempli de zéros, mais un problème de mémoire a conduit à la présence d'anciennes données sensibles. Cela a entraîné une fuite de mots de passe lors d'un dump.