ProgrammationDéveloppeur Embedded C

Comment les variables de différents types de stockage (automatiques, statiques, globales) sont-elles initialisées en C ? Quelles en sont les conséquences sur la sécurité et la justesse du programme ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Dans le langage C, les variables sont initialisées différemment selon le spécificateur de stockage :

  • Variables automatiques (locales) : elles ont une valeur non initialisée (valeur indéterminée) si aucune valeur initiale n'est spécifiée. Leur contenu provient de la pile qui était là auparavant.
  • Variables locales et globales statiques (static, extern) : elles sont toujours initialisées à zéro (pour les scalaires — 0, pour les pointeurs — NULL) ou à une valeur spécifiée lors de l'étape d'édition des liens.

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.

Question piège

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 }

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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.