Bug C du jour

Qu’affiche le code suivant ?

char* states[] = {
    "PLOP",
    "PLIP",
    "BOUHHH",
    "CROTTE",
    "DINGDING",
    "CAFE",
    "UB40"
    "GWB",
};
char * others_string[] = {
    "ROGER",
    "RABBIT",
};
[...]

printf("State %s\n", states[7]);

Je précise que je compile toujours en -Wall et que je n’avais aucun warning bien sûr !

[edit 6 décembre 2018]

Si c’est un compilateur GCC pour ARM sur APF6 (j’ai pas toutes les options en tête) la fonction printf affiche :

State ROGER

Par contre sur un pc (debian) sans aucune option spécifique :

State (null)

Et oui ça n’est pas vu comme un bug … puisque ça compile en -Wall et que ça s’exécute sans problème (enfin pour l’exécution il y a quand même une histoire de pointeur qui va trifouiller au mauvais endroit de la mémoire sur la version «embarquées»).

Tout simplement car deux chaînes de caractères côtes à côtes sont considérées comme une seule et même chaîne.
Ici « UB40 » et « GWB » ne sont pas deux chaînes de caractères distinctes mais une seule et même chaîne : « UB40GWB ». Il n’y a pas d’index numéro 7 et donc on déborde sur la suite … qui est également un tableau de pointeurs sur chaînes de caractères. Du coup ça ne le dérange pas de l’afficher.
cqfd

Ce contenu a été publié dans informatique, programmation, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

3 réponses à Bug C du jour

  1. Jonathan dit :

    Il manque une virgule …
    😉

  2. Juju dit :

    Le seul bug est entre le clavier et l’écran 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *