Ca peut paraitre simple à débugger les gros crashs, mais quand ça plante n'importe où, n'importe quand, et sans raison apparente, alors que le même code tourne sur 3 autres plateformes sans problème, ça fait chier ^^. 
  1. Rendre le bug facilement reproductible. Il a suffit de mettre un seed à la main pour se garantir toujours la même séquence de randoms, et de trouver une séquence qui plus très rapidement ^^
  2. Printf power ! On en met partout, on voit le dernier qui s'affiche avant que ça plante :p
  3. Quand on a isolé un bloc d'à peine quelques lignes, on se pose des questions et on affiche les valeurs des variables ^^ 
Au final, le bug s'est révélé très vicieux : on stocke des lettres dans un char, et on met -1 dedans quand on n'a pas de lettre à stocker. Donc les parties avec de l'affichage à faire sont entourés d'un petit "if (letter != -1)", sauf que là on passait dedans dans tous les cas... En affichant la valeur de letter, la réponse est évident : "Letter : 255". 
Voici donc la citation de GCC correspondante :

Most systems, including x86 GNU/Linux and Microsoft Windows, use signed char, but those based on PowerPC and ARM processors typically use unsigned char. This can lead to unexpected results when porting programs between platforms which have different defaults for the type of char.


On en déduit plusieurs choses :
  • Ne pas trop se fier à tout ce qui est sensé être le "comportement par défaut" si on n'a pas vérifié que c'est le cas DANS TOUS LES CAS. 
  • Toujours mettre un haut niveau de warning, pour avoir les messages de type "comparison between signed and unsigned values". Ils me cassent souvent les couilles et me forcent à mettre des casts, mais ça m'est déjà arrivé de trouver des erreurs comme ça, et dans le cas présent ça m'aurait bien servi ^^
  • Ne pas croire que parce qu'un code marche sur plusieurs plateformes et plusieurs processeurs, on est tranquille ^^ La preuve que non !