Skyduino:~#
Articles
arduino, Autre, C/C++, Corrigé, programmation

GCC is trolling you … Problem ? It’s not a bug ! It’s a feature !

Bonjour tout le monde !

Edit: Juste pour remettre les pendules à l’heure :
– je suis au courant que le backslash en fin de ligne est une commande pré-processeur visant à étendre deux ligne en une seule,
– je fais cet article dans le but d’éviter aux personnes qui ne le savent pas de galérer plusieurs heures à chercher une erreur qui n’existe pas,
– je n’aurais jamais cru qu’un commentaire uni-ligne pouvait être étendu sans générer de warning (merci GCC …).

Comme on est dimanche, que demain c’est la reprise, tout ça …
Je vous est préparé un petit article avec de gros morceaux de troll dedans !

Tentez de compiler le sketch suivant, et de l’uploader sur votre carte arduino 😉

void setup() {
  Serial.begin(9600);
  Serial.println("Have you been trolled today ?");
}

void loop() {
  //                               . .  IMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM                        
  //                        .IMMMMMMMMMMMMMM8I            .  ...  .          =MMMM                     
  //                    :MMMMMMMMMZ .       7MMMMZ   .         7MD .            IMMD .                 
  //                 MMMMM. .     .            .      .~           .M,  .         MMM .                
  //              MMMM,   N.  .IDMMMO777ZNMMMMMO               =MM   . M:.         NMM.                
  //          . ZMMM        .                      .  :7NMMDI=    . MM   IM         MMM                
  //           MMM           IMM77IDMMM,           . M8         ..MM   M   ,N        MMM               
  //           M8         M                         M .               M  ,O . 7.      MM               
  //          .M8        D            ,.          ...                   M  7           MM              
  //          MM.       7              =            .      ~MMMMMN,       .            7MM             
  //         MMM       ..              N.              MMMMMMMMMMMMMMMO.                MMM            
  //       .MMM            MMMMMMMMM+.              ZMMMZ   $MMMMMMMMMMM..               MMM           
  //      MMMD. .      ..ZMMM78MMMMMMMMM           MMM. .. DMMMMMMMMMMM8MM  MM7        . OMMMM .       
  //     MMM  MM:. .       MMMMMMMMMMMMMMMMM      IMM   MMMMMMO    .DMMMMM..  .        .  +O MMM.      
  //   .MMM ?D                       OMMMMM       .,MMMMM+     MM              MMMMMMMM.     ?.MM..    
  //   MMM M :M. .7M8                  MM             .         MMMN    .. =MMMMM.  . :MMM    :.MMM.   
  //   MMM.  8. MMMMMMMMMZ.            MM                         MMMMMMMMMMMM~   M      MM.     MM$   
  //  .MMOM  M .   ..   MMMMMM$     . MMM                                     .   MM     .MM      MM   
  //   NMMM  M      8M  O88I        MMMM             7~ .                  . .:MMMMMM     MM      MM   
  //    MMM  $ .    MM     .      MMM~             ~MMMMMMM                MMMMM=.7MMMM   MM   .  MM   
  //    NM7I   M   MMM:         MMMMM                   MM             MMMMMM  .  MMMZMMM.MM. 8   MM   
  //     MM MM   .+MMMM      =M  M,MMD        MMMMMMM  $MM         DMMMMMM..     ZMM.   .MM  .8..MMM.  
  //      MM?  :M MMMMMM .. .     .  MM .  .     .    MMM     .MMMMMMMI=MM      MMMM     M   N  MMM    
  //      .MM     MMMMMMMMM           8MMMM             .ZMMMMMM?  .   MMM. ,MMMMMM      . =.  MMM     
  //       MMM.   MMMM MMMMMMM8   .     MM  .     :MMMMMMMMM          NMMMMMMMMMMM          .MMM.      
  //       .MM   IMMM= MM   ?MMMMMMMMMMMMMMMMMMMMMMM8   . MM     .  MMMMMMM . MMN         8 MM8        
  //        MM   7MMM  MM   .MM     $MMMMM7  .MM..       .MM.  MMMMMMMMMMD.  MM~          MMM          
  //        7M ..=MMMMMMM?. MMI      MMM      MM        . ?MMMMMMMMMM  MM  .MMI .        MMM.          
  //         M=   MMMMMMMMMMMMMMN~  .8M=      MM    7MMMMMMMMMMMM,     MM8MMM          .,MM            
  //         M=   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM8          MMMM .          MM.            
  //        =M    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+   8MM         MMM$            MM              
  //       .8M.   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM          MM .    =MMMM.            7MM.             
  //        MM     MM.MM  MM.ZMMMM7=MMMM   .    MM          ZMM   MMMMM              MMM.              
  //        MM      MMZMM ~MM  MMM  ..~MM       MM           MMMMMMM  .            $MM$                
  //        MM      ~MMM,  MMM  MM=.   MM       MM         MMMMMMZ     .M7  .MM  ~MMM                  
  //       ,MM        MMMMMMMMD. MM    MM       MMO~.7MMMMMMMM=..   NM..  MM   DMMM                    
  //       MMI         .  =MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM~.     .M?.  ,MM   =MMMM                      
  //       MM.        D.     .      ..       .   .  .        .M= . ZMD  . MMMM                         
  //       MM.   M     M .       .8MMMMMMMMMMMMM.         MZ   MM? .  =MMMM                            
  //       MM.   I      .MM                   ...   .MM=  .MM.     ZMMMM                               
  //       MM     ,N        . ,+777---,   ...        ?MM        MMMMM                                  
  //       MM.       MMO. ..        . .    . 7MO   .        ?MMMM                                      
  //       MMZ           .. .==~=. . .                    MMMM.                                        
  //        MM                                    .  . MMMM                                            
  //         MMM ..                           MMMMMMMMMM                                               
  //          .MMM7                      ZMMMMMMMMN:                                                   
  //             DMMMMMMMMMMMMMMMMMMMMMMMM?  . .                                                       
  //             .   7MMMMMMMMMMMMZ.   . ..                                                            
  //                  . \
  Serial.println("Problem ?");
}

(Copier aussi les commentaires, ils ne sont pas là que pour faire jolie)

Pour les féniasse du copier/coller, j’ai mis le .ino en DDL sur mon compte dropbox : trollSketch.ino

C’est bon vous avez envoyé le sketch sur votre carte arduino ?
Alors que se passe-t-il ?

Normalement vous devriez avoir ceci (en toute logique) :
Have you been trolled today ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?
Problem ?

On est bien d’accord ?

Mais alors pourquoi en réalité on obtient :
Have you been trolled today ?

Et puis plus rien !?
HéHé ! Mystère !

Le pourquoi du comment

Quand je fait :

  // \
  Serial.println("Problem ?");

En réalité après le processus de pré-processing (qui ici réduit les deux lignes en une seule) le code ressemble à ceci :

  // Serial.println("Problem ?");

Y a comme qui dirait, un soucis !

J’ai pas réussi à savoir s’il s’agissait d’un bug ou d’une fonctionnalité prévu par gcc …
En tout cas ce « problème » est présent dans TOUTES les versions de gcc …
Edit: C’est un avis perso mais ce genre de choses devraient donner un warning absolument tout le temps !
Pas juste quand on spécifie -Wall …
Une extension de ligne n’a de sens que sur une ligne de code, ou sur une macro, pas sur un commentaire (uni-ligne de sur-crois) !

Exemple plus simple (pour pc) :

#include <stdio.h>

int main(void) {
  // \
  puts("Hello World\n");
  return 0;
}

Hello World ne s’affichera jamais …

Pourquoi je trouve que c’est un ÉNORME problème :

– Si on veut commenter une ligne dans une macro multi-ligne, en fait on commente toute la partie inférieur de la macro sans le savoir …
– Si on travail sur une table ascii (comme c’est mon cas actuellement) on peut avoir des tableaux ayant cette tête :
(Cette table est tirée d’un code d’exemple fourni par sparkfun, comme quoi …)

PROGMEM prog_uchar asciiTable[] = {
   0x00, 0x00, 0x00, 0x00, 0x00 // 20  
  ,0x00, 0x00, 0x5f, 0x00, 0x00 // 21 !
  ,0x00, 0x07, 0x00, 0x07, 0x00 // 22 "
  ,0x14, 0x7f, 0x14, 0x7f, 0x14 // 23 #
  ,0x24, 0x2a, 0x7f, 0x2a, 0x12 // 24 $
  ,0x23, 0x13, 0x08, 0x64, 0x62 // 25 %
  ,0x36, 0x49, 0x55, 0x22, 0x50 // 26 &
  ,0x00, 0x05, 0x03, 0x00, 0x00 // 27 '
  ,0x00, 0x1c, 0x22, 0x41, 0x00 // 28 (
  ,0x00, 0x41, 0x22, 0x1c, 0x00 // 29 )
  ,0x14, 0x08, 0x3e, 0x08, 0x14 // 2a *
  ,0x08, 0x08, 0x3e, 0x08, 0x08 // 2b +
  ,0x00, 0x50, 0x30, 0x00, 0x00 // 2c ,
  ,0x08, 0x08, 0x08, 0x08, 0x08 // 2d -
  ,0x00, 0x60, 0x60, 0x00, 0x00 // 2e .
  ,0x20, 0x10, 0x08, 0x04, 0x02 // 2f /
  ,0x3e, 0x51, 0x49, 0x45, 0x3e // 30 0
  ,0x00, 0x42, 0x7f, 0x40, 0x00 // 31 1
  ,0x42, 0x61, 0x51, 0x49, 0x46 // 32 2
  ,0x21, 0x41, 0x45, 0x4b, 0x31 // 33 3
  ,0x18, 0x14, 0x12, 0x7f, 0x10 // 34 4
  ,0x27, 0x45, 0x45, 0x45, 0x39 // 35 5
  ,0x3c, 0x4a, 0x49, 0x49, 0x30 // 36 6
  ,0x01, 0x71, 0x09, 0x05, 0x03 // 37 7
  ,0x36, 0x49, 0x49, 0x49, 0x36 // 38 8
  ,0x06, 0x49, 0x49, 0x29, 0x1e // 39 9
  ,0x00, 0x36, 0x36, 0x00, 0x00 // 3a :
  ,0x00, 0x56, 0x36, 0x00, 0x00 // 3b ;
  ,0x08, 0x14, 0x22, 0x41, 0x00 // 3c <
  ,0x14, 0x14, 0x14, 0x14, 0x14 // 3d =
  ,0x00, 0x41, 0x22, 0x14, 0x08 // 3e >
  ,0x02, 0x01, 0x51, 0x09, 0x06 // 3f ?
  ,0x32, 0x49, 0x79, 0x41, 0x3e // 40 @
  ,0x7e, 0x11, 0x11, 0x11, 0x7e // 41 A
  ,0x7f, 0x49, 0x49, 0x49, 0x36 // 42 B
  ,0x3e, 0x41, 0x41, 0x41, 0x22 // 43 C
  ,0x7f, 0x41, 0x41, 0x22, 0x1c // 44 D
  ,0x7f, 0x49, 0x49, 0x49, 0x41 // 45 E
  ,0x7f, 0x09, 0x09, 0x09, 0x01 // 46 F
  ,0x3e, 0x41, 0x49, 0x49, 0x7a // 47 G
  ,0x7f, 0x08, 0x08, 0x08, 0x7f // 48 H
  ,0x00, 0x41, 0x7f, 0x41, 0x00 // 49 I
  ,0x20, 0x40, 0x41, 0x3f, 0x01 // 4a J
  ,0x7f, 0x08, 0x14, 0x22, 0x41 // 4b K
  ,0x7f, 0x40, 0x40, 0x40, 0x40 // 4c L
  ,0x7f, 0x02, 0x0c, 0x02, 0x7f // 4d M
  ,0x7f, 0x04, 0x08, 0x10, 0x7f // 4e N
  ,0x3e, 0x41, 0x41, 0x41, 0x3e // 4f O
  ,0x7f, 0x09, 0x09, 0x09, 0x06 // 50 P
  ,0x3e, 0x41, 0x51, 0x21, 0x5e // 51 Q
  ,0x7f, 0x09, 0x19, 0x29, 0x46 // 52 R
  ,0x46, 0x49, 0x49, 0x49, 0x31 // 53 S
  ,0x01, 0x01, 0x7f, 0x01, 0x01 // 54 T
  ,0x3f, 0x40, 0x40, 0x40, 0x3f // 55 U
  ,0x1f, 0x20, 0x40, 0x20, 0x1f // 56 V
  ,0x3f, 0x40, 0x38, 0x40, 0x3f // 57 W
  ,0x63, 0x14, 0x08, 0x14, 0x63 // 58 X
  ,0x07, 0x08, 0x70, 0x08, 0x07 // 59 Y
  ,0x61, 0x51, 0x49, 0x45, 0x43 // 5a Z
  ,0x00, 0x7f, 0x41, 0x41, 0x00 // 5b [
  ,0x02, 0x04, 0x08, 0x10, 0x20 // 5c \   <- FUFUFU, tout se retrouve décalé car la ligne suivante devient un commentaire !
  ,0x00, 0x41, 0x41, 0x7f, 0x00 // 5d ]
  ,0x04, 0x02, 0x01, 0x02, 0x04 // 5e ^
  ,0x40, 0x40, 0x40, 0x40, 0x40 // 5f _
  ,0x00, 0x01, 0x02, 0x04, 0x00 // 60 `
  ,0x20, 0x54, 0x54, 0x54, 0x78 // 61 a
  ,0x7f, 0x48, 0x44, 0x44, 0x38 // 62 b
  ,0x38, 0x44, 0x44, 0x44, 0x20 // 63 c
  ,0x38, 0x44, 0x44, 0x48, 0x7f // 64 d
  ,0x38, 0x54, 0x54, 0x54, 0x18 // 65 e
  ,0x08, 0x7e, 0x09, 0x01, 0x02 // 66 f
  ,0x0c, 0x52, 0x52, 0x52, 0x3e // 67 g
  ,0x7f, 0x08, 0x04, 0x04, 0x78 // 68 h
  ,0x00, 0x44, 0x7d, 0x40, 0x00 // 69 i
  ,0x20, 0x40, 0x44, 0x3d, 0x00 // 6a j 
  ,0x7f, 0x10, 0x28, 0x44, 0x00 // 6b k
  ,0x00, 0x41, 0x7f, 0x40, 0x00 // 6c l
  ,0x7c, 0x04, 0x18, 0x04, 0x78 // 6d m
  ,0x7c, 0x08, 0x04, 0x04, 0x78 // 6e n
  ,0x38, 0x44, 0x44, 0x44, 0x38 // 6f o
  ,0x7c, 0x14, 0x14, 0x14, 0x08 // 70 p
  ,0x08, 0x14, 0x14, 0x18, 0x7c // 71 q
  ,0x7c, 0x08, 0x04, 0x04, 0x08 // 72 r
  ,0x48, 0x54, 0x54, 0x54, 0x20 // 73 s
  ,0x04, 0x3f, 0x44, 0x40, 0x20 // 74 t
  ,0x3c, 0x40, 0x40, 0x20, 0x7c // 75 u
  ,0x1c, 0x20, 0x40, 0x20, 0x1c // 76 v
  ,0x3c, 0x40, 0x30, 0x40, 0x3c // 77 w
  ,0x44, 0x28, 0x10, 0x28, 0x44 // 78 x
  ,0x0c, 0x50, 0x50, 0x50, 0x3c // 79 y
  ,0x44, 0x64, 0x54, 0x4c, 0x44 // 7a z
  ,0x00, 0x08, 0x36, 0x41, 0x00 // 7b {
  ,0x00, 0x00, 0x7f, 0x00, 0x00 // 7c |
  ,0x00, 0x41, 0x36, 0x08, 0x00 // 7d }
  ,0x10, 0x08, 0x08, 0x10, 0x08 // 7e ~
  ,0x78, 0x46, 0x41, 0x46, 0x78 // 7f DEL
};

Et passer des heures à chercher une erreur dans son code qui n’existe pas !

Comment j’ai trouvé la source du problème ?

Grâce à -Wall qui m’as affiché ceci :
xxxxx.cpp:nn:nn: attention : commentaire multi-lignes [-Wcomment]

Si j’avais pas tenté une compilation avec un makefile et -Wall je serais encore en train de chercher une erreur dans mon code !

Edit: Je me répète mais bon …
Je ne dis pas qu’il faudrait désactiver les extensions de ligne, mais interdire (ou au moins générer un warning systématiquement) lorsque l’on tente d’étendre une ligne de commentaire faite avec //.

Moralité de l’histoire, toujours compiler avec -Wall, et ne pas faire confiance aux IDE comme l’ide arduino qui n’affichent aucun warning et dont le moteur de coloration syntaxique ne gère pas à 100% tous les petits « trucs » …

Grrrr !

Advertisements

Discussion

3 réflexions sur “GCC is trolling you … Problem ? It’s not a bug ! It’s a feature !

  1. Euh ben c’est quand meme un peu ultra connu que \ en fin de ligne en C, ça sert à la prolonger sur la ligne suivante.
    C’est le moteur de coloration syntaxique qui est buggé et n’en tient pas correctement compte.

    Avec gedit, par exemple :

    Publié par domi | 26 février 2012, 19 h 58 min
    • Je suit au courant pour le backslash 😉
      Je fait cet article pour les personnes qui justement ne savent pas ce que fait le backslash.
      Et apparemment même chez sparkfun (d’ou la table ascii a été repris) on a ce genre de probléme 😉

      C’est un avis perso mais ce genre de chose devrait donner un warning absolument tout le temps …
      Pas juste quand on spécifie -Wall …
      Une extension de ligne n’as de sens que sur une ligne de code ou sur une macro, pas sur un commentaire !

      Pour la colorisation j’ai bien vu, c’est ce qui m’as mis la puce à l’oreille suite au warning.
      (Je suis sous notepad++ au passage, mais la colorisation est la même que gedit)

      Edit: J’ai mis à jour l’article 😉
      Ps: J’avais trouvé un ticket sur le bug-tracker de gcc d’une personne signalant ce comportement, mais j’ai pas gardé le lien …

      Publié par skywodd | 26 février 2012, 20 h 19 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.