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 :

Warning "might be used uninitialzed" lors de l'ajout d'un constructeur


Sujet :

C++

  1. #1
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut Warning "might be used uninitialzed" lors de l'ajout d'un constructeur
    Bonjour à tous,

    Lorsque tente de compiler mon programme, j'ai les warnings suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    In member function : (un truc bien barbare) :
    __top might be used uninitialized in this function
    __tmp might be ... (idem)
    Ces variables sont définie dans un fichier de la STL: stl_tree.h, donc ça ne m'aide pas vraiment pour savoir quoi modifier dans mon code

    Sans vous mettre tous le code, je vais essayer de vous décrire le structure du code :


    Dans le header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    namespace point
    {
        class Vector3D {};
    }
    namespace color
    {
        struct Color32b {};
    }
    namespace object
    {
        typedef std::vector<point::Vector3D> pset_type;
        typedef std::map<color::Color32b,pset_type> pmap_type;
        class Object
        {
            pmap_type pointMap;
            Object(const pmap_type &);
        }
    }
    Donc au final pmap_type c'est : map<Color32b,vector<Vector3D>>

    Dans mon .cpp, je ne fait pas grand chose, mais pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object::Object(const pmap_type & pm):pointMap(pm){}
    Et c'est en rajoutant cette dernière ligne que mes warnings aparaissent...

    Et donc mes questions sont les suivantes :

    1) Qu'y a t-il dans mon code pourrait ne pas initialiser ces 2 variables ?
    2) Vu que ce n'est que des warnings, ce n'est pas trop grave pour l'instant, mais que risque t-il de se passer à l'execution ? Y a t il vraiment un risque d'un comportement "indertéminé" à l'execution ?

    3) Au début, je n'avais qu'une classe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Dans le header :
    class Object
    {
        std::vector<Vector3D> pointSet;
        Object(const std::vector<Vector3D> &);
    }
     
    //Dans le .cpp
    Object::Object(const std::vector<Vector3D> & ps):pointSet(ps);
    Et elle ne déclenchait aucun warning... Donc le problème serait bien sur la map ? Mais pourquoi en faisant pareil avec le vector ça le faisait pas ?

    Bref pleins de questions... Merci de bien vouloirs m'éclairer

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Il doit manquer des éléments de ton problème. Je ne vois pas trop de soucis à ce que tu as écrit.
    Qui plus est, ce code ne produit aucun warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <vector>
    #include <map>
    namespace point
    {
        class Vector3D {};
    }
    namespace color
    {
        struct Color32b {};
    }
    namespace object
    {
        typedef std::vector<point::Vector3D> pset_type;
        typedef std::map<color::Color32b,pset_type> pmap_type;
        class Object
        {
            pmap_type pointMap;
            Object(const pmap_type &);
        };
    }
     
    namespace object{
     Object::Object(const pmap_type & pm):pointMap(pm){}
    }
     
    int main()
    {
        return 0;
    }
    Essaies de reproduire un exemple minimal reproduisant ce warning.

  3. #3
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut, merci de ta réponse, mais :

    incompréhensible... peut-être un bug du compilo alors je ne sais pas.
    Parceque :

    Dans mon projet original, je commente tout au maximum, pour ne garder que l'essentiel -> J'ai donc le warning
    En gros il ne reste que ce que j'ai donné dans mon premier post.
    (Dans mon projet original j'ai un main.cpp, un autre .cpp, et son header).

    J'ouvre un nouveau projet. J'ai donc un main.cpp
    Je crée un autre.cpp et son header
    Je copie exactement sans modifier une ligne de code, sans supprimer un commentaire, rien :
    main.cpp -> main.cpp
    autre.cpp -> autre.cpp
    header -> header

    Donc en théorie ça devrait faire la même chose non ?
    Et bien non !

    Dans le 2ème projet, pas de warnings

    Du coup je ne sais pas quoi dire...
    Je suis désole de t'avoir fait perdre ton temps 3DArchi, mais du coup je sais pas comment faire pour que il y est le warning chez toi aussi


  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Dans ton deuxiéme projet t'as les mêmes flag de compilation?

  5. #5
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Oui -_-

    Mêmes options (les -W et compagnie, je compile avec gcc), mêmes bibliothèques liées, tout quoi...

    C'est à dire : -g -Wall -Wmain -s -O3
    Et en libraries : MinGW\lib\libopengl32.a;libglu32.a;libglut32.a;libglut.a

    Je vois pas ce qui pourrait jouer aussi un rôle...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Pas de différence dans les répertoires de recherche de fichier d'en-tête (un qui pointerait vers une ancienne version) ? Pas de différence entre les directives de précompilation (#define et/ou -D) ?
    A la limite, si tu fais un diff de ton makefile (ou l'équivalent si tu utilises un IDE), quelles sont les différences ?

  7. #7
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Non les mêmes répertoires (j'en ai qu'un de toute façon, enfin je veux dire je n'ai pas plusieurs versions)

    Pas de directives ci ce n'est les #ifndef #define #include, Alors sur 2 fichiers je me suis quand même pas embrouillé sur les ifndef define, et les include c'est que des truc de base : map, vector. Et de toute façon les directives sont les mêmes.

    Pour le makefile, je suis sous Code::Blocks, mais il ne m'en génère pas si ? De toute façon, je n'ai fait aucune modifiaction de ce coté la, que ce soit dans l'un ou dans l'autre, je n'ai fait que taper du code, et ce que j'ai modifié je l'ai déjà dit...

    C'est bizarre...

    EDIT : Ha ha peut être du changement...
    Je prend le projet qui cause un warning => j'en fait un projet template
    Je cré un nouveau projet à partir du template => LA j'ai mon warning !
    Mais il n'en reste pas moins que les deux projets semblent parfaitements identiques... Mais au moins ça me rassure, il doit y avoir un truc que j'ai pas pensé a regarder, mais quoi ?

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Typiquement, l'avertissement que tu obtiens te signale que, dans la fonction dont le nom t'est donné, il y a une variable que tu essaye de modifier alors qu'elle *risque* de n'avoir pas encore été initialisée.

    Si tel est effectivement le cas, le risque encouru est, tout bonnement, d'avoir des résultats aberrants, parce que la (les différentes) valeur(s) de cette variable risque(nt) de correspondre... au "crasses" laissées par une utilisation antérieure de l'adresse mémoire occupée par la variable, c'est à dire à peu près tout et n'importe quoi.

    Cet avertissement est généralement généré lorsque l'on passe l'argument -Wuninitialized comme option à Gcc (g++) et qu'il y a, effectivement, une variable non initialisée.

    Il n'est pas exclu qu'il soit occasionné par un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void function(/* paramètres éventuels */)
    {
        un_type *ptr;
        doSomething(&ptr);
        ptr->machinChose;
    }
    parce que le compilateur remarque que tu ne définis pas explicitement de valeur pour ptr, et qu'il n'est pas forcément en mesure de vérifier que doSomething la définira effectivement...

    Si, dans l'exemple présent, tu as la certitude que doSomething fournit effectivement une valeur correcte et cohérente à ptr, et que cette valeur sera, effectivement, répercutée sur ptr après l'appel, tu peux envisager d'ignorer l'avertissement.

    Par contre, si, pour une raison ou une autre, tu n'es pas en mesure d'apporter cette certitude, il semble des plus opportuns de trouver le "moins mauvais" moyen d'apporter une solution cohérente pour supprimer cet avertissement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut, merci de ta réponse,

    Le problème est (bien q'on ne puisse pas le reproduire...) qye ucu je ne vois pas ce qui pourrait porduire se comportement, et l'avertissement concerne un fichier de la STL...

    En gros la seule chose qui produit un avertissement est l'initialistion par récopie d'une map...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object::Object(type_map & map):myMap(map){}
    Et je ne comprend pas d'ou peut bien sortir le warning...
    Sachant que type_map est quelquechose de tout à fait normal, càd sans pointeur etc...
    C'est simplement srd::map<Couleur,Point>, sachant que couleur à des attribut unsigned char, et que point, des double...

    So ?

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    C'est vraisemblablement un bug du compilateur. Quelle version tu utilises ?

    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22207
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=5035

    MAT.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gtk-WARNING lors de l'ajout d'un GtkEntry
    Par damien.yep dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 01/09/2006, 17h57
  2. Warning lors du this passé dans un constructeur
    Par NicolasJolet dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2006, 09h43

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