IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Pourquoi GCC ne signale pas d'avertissement sur le point virgule après le if


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Pourquoi GCC ne signale pas d'avertissement sur le point virgule après le if
    Bonsoir
    Voila j'ai passé plus de cinq heures à rechercher l'origine de l'erreur de segmentation dans mon programme et à la fin voila l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //fonction getPos dans prog.h
     
    if(c >= 'a' && c <= 'Z'); //l'origine de l'erreur point virgule après le if
    return (int) (c-'a'); 
    return -1;
    //et après dans une autre fonction dans prog.c :
     
    int pos = getPos(c);
    if(pos == -1) return NULL;
    return tab[pos]; //erreur de segmentation
    Le problème que lorsque je lance le programme avec le débogueur tout marche bien et j'ai essayé sur Linux et ça marche avec et sans gdb. Sur un autre PC (sur Ubunutu ) ça marche qu'avec gdb.

    Quelqu'un peut m'expliquer tous ça. Si sans le débogueur il y a une instruction tab[-90] alors normalement elle y est avec le débogueur et pourquoi sur mon linux ça marche sans et avec le débogueur.

    Et le plus important pourquoi gcc n'a pas signalé un avertissement malgré le -Wall.

    J'espère que quelqu'un pourra m’éclairer sur ça et merci d'avance.

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir on va reprendre dans le désordre

    Citation Envoyé par rabah200830 Voir le message
    Et le plus important pourquoi gcc n'a pas signalé un avertissement malgré le -Wall.
    Un bloc vide n'est pas une erreur et si tu désires avoir des warnings sur les blocs vides il faut utiliser -Wempty-body qui n'est pas activé avec -Wall mais qui l'est si tu utilises en plus -Wextra. C'est une bonne pratique que d'activer les deux en phase de développement. Tu aurais eu un warning du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
    Citation Envoyé par rabah200830 Voir le message
    Le problème que lorsque je lance le programme avec le débogueur tout marche bien et j'ai essayé sur Linux et ça marche avec et sans gdb. Sur un autre PC (sur Ubunutu ) ça marche qu'avec gdb.
    Ubuntu c'est linux

    Citation Envoyé par rabah200830 Voir le message
    Quelqu'un peut m'expliquer tous ça. Si sans le débogueur il y a une instruction tab[-90] alors normalement elle y est avec le débogueur et pourquoi sur mon linux ça marche sans et avec le débogueur.
    Pas forcément, le débogueur peut ajouter du code qui va initialiser des variables qui ne le seraient pas normalement, il peut ne pas y avoir le même alignement, enfin tout un tas de raisons diverses ... on peut parler d'heisenbugs dans ces cas.
    Ton code néanmoins contient une erreur, il est par conséquent réellement bugué, et s'il fonctionne quand même c'est qu'il tombe en marche (coup de bol en tab[-90] il y a la bonne valeur par hasard ?) ... ou que les deux plateformes n'ont pas les mêmes bibliothèques (par exemple une machine de développement avec des bibliothèques de dev compilées en mode debug, alors qu'il y a les versions release/strippées sur l'autre machine).

    Mais bon pour avoir une explication plus détaillée il faudrait le code entier.

    En espérant avoir répondu à tes interrogations.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai entendu dire que des fois, les débogueurs initialisaient toute la mémoire à zéro (en tout cas, l’initialisation de la mémoire n'est pas la même qu'en mode release). Donc, si tu accèdes à des cases mémoires de manière aléatoire, tu n'as pas forcément des valeurs aléatoires en retour (en tout cas, pas les mêmes). D'où : ça marche en debug, ça marche pas en release.

    Il faut le savoir : ton débogueur peut te donner l'impression que ton programme marche

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Je supporte ce que dit Bktero, mais je crois que c'est le compilateur qui le fait en mode debug -O0 / -g et non le compilateur. Du moins, c'est ce que j'avais cru remarqué sous Linux.

    Dans tous les cas, il est très important d'initialiser les variables, toujours !
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par rabah200830 Voir le message
    Et le plus important pourquoi gcc n'a pas signalé un avertissement malgré le -Wall.
    Parce que ce n'est pas une erreur.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ce n'est pas une erreur, parce qu'il pourrait y avoir un else, parce que les expressions ont des effets de bord…

    Cela dit, c'est probablement un mauvais signe.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Si je peux me permettre je te conseillerai pour plus de lisibilité de toujours mettre des accolades même pour une seule instruction et de n'avoir qu'un seul return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int res = 0;
     
    if(c >= 'a' && c <= 'Z')
    {
      res = (int) (c-'a'); 
    }
    else
    {
      res = -1;
    }
    return res;
    De plus dans ton cas, l'accolade après le point virgule aurait généré une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int res = 0;
    
    if(c >= 'a' && c <= 'Z');
    {
      res = (int) (c-'a'); 
    }
    else
    {
      res = -1;
    }
    return res;

  8. #8
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    ...
    De plus dans ton cas, l'accolade après le point virgule aurait généré une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int res = 0;
    
    if(c >= 'a' && c <= 'Z');
    {
      res = (int) (c-'a'); 
    }
    else
    {
      res = -1;
    }
    return res;

    Ce code ne génère pas d'erreur à cause du ; avant une { mais à cause d'un else sans if correspondant.

  9. #9
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(c >= 'a' && c <= 'Z') //l'origine de l'erreur point virgule après le if
    return (int) (c-'a'); 
    ELSE
    return -1;
    //et après dans une autre fonction dans prog.c :
    Perso, sans les accoloades, tu peux ne mettre qu'une seule ligne de code, j'aurais donc écrit un truc dans le genre. Par contre, je ne sais pas si tu peux t'en sortir sans la présence du else non?

  10. #10
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par leternel Voir le message
    Ce n'est pas une erreur, parce qu'il pourrait y avoir un else, parce que les expressions ont des effets de bord…

    Cela dit, c'est probablement un mauvais signe.
    Entièrement d'accord avec toi. Je suppose que l'avertissement n'est pas activé par défaut pour éviter trop de messages sur des codes contenant beaucoup de raccourcis du style while (*a++=*b++);.
    À quand les -Wparanoia ou les -Wgive-me-only-meaningfull-warnings-please

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Ce code ne génère pas d'erreur à cause du ; avant une { mais à cause d'un else sans if correspondant.
    Oui tu as tout à fait raison, merci de m'avoir repris, désolé.

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    on a déjà -Wextra pour "quasiment tous les warnings pas encore activés par -Wall"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Bonjour,

    On peut aussi utiliser un autre compilateur que GCC, qui n'est pas franchement connu pour la qualite de ses messages d'erreur.

    Pour faire rapide, GCC essaye de compiler a tout prix, alors que d'autres compilateurs essayent d'etre plus... pragmatique. Dans le cas d'oubli d'une accolade ou parenthese fermante, le message de CLANG est beaucoup plus explicite que celui de GCC.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. XDebug : pas d'arrêt . . . sur les points d'arrêt
    Par kimlee dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 07/08/2014, 21h57
  2. [PDT / Xdebug] Pas de stop sur les points d'arrêts
    Par fadeninev dans le forum Eclipse PHP
    Réponses: 9
    Dernier message: 31/12/2011, 22h59
  3. [MVC3] Pas d'arrêt sur les points d'arrêt
    Par CUCARACHA dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 27/01/2011, 06h10
  4. Réponses: 0
    Dernier message: 03/05/2009, 21h47
  5. Réponses: 9
    Dernier message: 14/09/2006, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo