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 :

option -O de gcc


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut option -O de gcc
    Bonjour,

    une simple question :

    lorsque je compile un programme avec gcc et l'option -O3 (sensée optimiser) j'ai une erreur de segmentation que je ne rencontre pas avec -O1 ou même sans cette option.

    Est-ce "normal" ou est ce que mon prog cache une erreure non détectée lors de la compilation.

    Et si c'est ce dernier cas, avez vous une idée du genre d'erreur qui peut en etre la cause?

    Merci bien,

    Yan

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    il parait que parfois -O3 provoque des erreurs, et apparemment (presque) personne ne compile les noyaux de linux avec -O3

    mais a priori ça cache un bug! (dépassement de chaine de caractère au hasard ?)

    si tu mets le code ça peut aussi aider d'une manière générale

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour les erreurs de -O3, je vois trois sources possibles:
    • Comportement indéfini qui passe en dans les niveaux inférieurs (-O0, -O1, -O2) mais qui casse en -O3
    • Code ne prenant pas en compte les contraintes supplémentaires de -O3 (notamment des trucs comme le "assume no aliasing" qui peuvent faire très mal).
    • Bug de gcc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    ok donc faiblesses du code qu'on peut casiment considérer comme légitimes.
    Je vais m'en tenir à du O1 même si ça semble pas changer grand chose (par contre O3 c'est sensible).
    Désolé pour le code mais il fait 1000 lignes environs et utilise une bibliothèque que je parie que vous la connaissez pas (Acnuc).

    Merci beaucoup messieurs,

    Yan

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu devrais essayer en -O2. Non seulement c'est plus "safe" que -O3, mais certains warnings, même activés, n'apparaissent qu'à partir de -O2...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    oui he bien là ça pèche, c'est qu'en 02 aussi j'ai un segmentation fault. Vous allez me dire que les erreures doivent-être plus grossière et du coup si vous voulez voir mon code : !!
    Et sinon j'ai aucuns warning à la compilation, même en O3 (mais je n'utilise pas l'option -w)

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    ne pas utiliser -w est dommage je pense
    avec un programme qui compile sans warning par exemple en : -W -Wall -pendantic -ansi
    aura beaucoup moins de probleme a l'execution, de plus si tu test la libefence tu verra peut etre que tu fais des choses pas bien avec la memoire

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Et tu rajoutes -Wwrite-strings pour faire bonne mesure.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Je suis quasi-certain que c'est une erreur memoire (mauvais free, depassement...) et qui par le fruit du hazard fait planter en -O2/-O3 mais pas en -O0/-O1

  10. #10
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    le plus courrant:
    c'est qu'en -O3 (et en -O2 dans une moindre mesure) tu as certaines zones mémoires (tableaux, chaines de caractères...) qui sont placées là où ça optimise, et résultat si tu débordes tu te retrouves à écraser tout et nimporte quoi (entre autre le ret de la fin de fonction qui assure un seg fault, ou des variables de la pile qui contenaient l'index dans un tableau...)
    alors que sans -O tu avais cette zone mémoire gentiment suivie d'une zone mémoire non utilisée

    sinon oui ça peut être un free vers un pointeur dans les choux aussi qui ne fait pas de seg fault sans -O ça m'est déja arrivé

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    wouhaou vous assurez trop!

    Donc je tente de compiler et fixer tous les warnings avec ces options :

    -W -Wall -pendantic -ansi -Wwrite-strings

    J'étudie ça et vous remercie bien fort mersieurs,

    yan

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    Ok donc voici la première inquiétude. Je ne comprend pas bien.
    J'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: initialization discards qualifiers from pointer target type
    Le forum m'a appris que c'est une histoire d'assigner à un pointeur non constant un pointeur constant.. Je savais pas qu'il y avait des pointeurs constant ounon...

    Mais du coup c'est quoi qui va pas là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char* trinuc_arr[] = {  "aaa", "aac", "aag", "aat", "aca", 
    			"acc", "acg", "act", "aga", "agc", 
    			"agg", "agt", "ata", "atc", "atg", 
    			"att", "caa", "cac", "cag", "cat", 
    			"cca", "ccc", "ccg", "cct", "cga", 
    			"cgc", "cgg", "cgt", "cta", "ctc", 
    			"ctg", "ctt", "gaa", "gac", "gag", 
    			"gat", "gca", "gcc", "gcg", "gct", 
    			"gga", "ggc", "ggg", "ggt", "gta", 
    			"gtc", "gtg", "gtt", "taa", "tac", 
    			"tag", "tat", "tca", "tcc", "tcg", 
    			"tct", "tga", "tgc", "tgg", "tgt", 
    			"tta", "ttc", "ttg", "ttt"};
    ???

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char* trinuc_arr[] = {  "aaa", "aac", "aag", "aat", "aca", 
    			"acc", "acg", "act", "aga", "agc", 
    			"agg", "agt", "ata", "atc", "atg", 
    			"att", "caa", "cac", "cag", "cat", 
    			"cca", "ccc", "ccg", "cct", "cga", 
    			"cgc", "cgg", "cgt", "cta", "ctc", 
    			"ctg", "ctt", "gaa", "gac", "gag", 
    			"gat", "gca", "gcc", "gcg", "gct", 
    			"gga", "ggc", "ggg", "ggt", "gta", 
    			"gtc", "gtg", "gtt", "taa", "tac", 
    			"tag", "tat", "tca", "tcc", "tcg", 
    			"tct", "tga", "tgc", "tgg", "tgt", 
    			"tta", "ttc", "ttg", "ttt"};
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char const *trinuc_arr[] = {  "aaa", "aac", "aag", "aat", "aca", 
    			"acc", "acg", "act", "aga", "agc", 
    			"agg", "agt", "ata", "atc", "atg", 
    			"att", "caa", "cac", "cag", "cat", 
    			"cca", "ccc", "ccg", "cct", "cga", 
    			"cgc", "cgg", "cgt", "cta", "ctc", 
    			"ctg", "ctt", "gaa", "gac", "gag", 
    			"gat", "gca", "gcc", "gcg", "gct", 
    			"gga", "ggc", "ggg", "ggt", "gta", 
    			"gtc", "gtg", "gtt", "taa", "tac", 
    			"tag", "tat", "tca", "tcc", "tcg", 
    			"tct", "tga", "tgc", "tgg", "tgt", 
    			"tta", "ttc", "ttg", "ttt"};
    devrait supprimer le warning suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    warning: initialization discards qualifiers from pointer target type

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    Hum en fait je suis coincé en fait car voici le nouveau message d'erreur qui se présente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: assignment discards qualifiers from pointer target type
    pour en fait cette fonction :

    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
    30
    31
    32
    33
    void set_trinucl_index(void) {
     
    	// The 64 possible trinucleotides -- Look at the commented function "print_table_of_all_trinucl" at the bottom of this file
    	char const *trinuc_arr[] = {  
    			"aaa", "aac", "aag", "aat", "aca", 
    			"acc", "acg", "act", "aga", "agc", 
    			"agg", "agt", "ata", "atc", "atg", 
    			"att", "caa", "cac", "cag", "cat", 
    			"cca", "ccc", "ccg", "cct", "cga", 
    			"cgc", "cgg", "cgt", "cta", "ctc", 
    			"ctg", "ctt", "gaa", "gac", "gag", 
    			"gat", "gca", "gcc", "gcg", "gct", 
    			"gga", "ggc", "ggg", "ggt", "gta", 
    			"gtc", "gtg", "gtt", "taa", "tac", 
    			"tag", "tat", "tca", "tcc", "tcg", 
    			"tct", "tga", "tgc", "tgg", "tgt", 
    			"tta", "ttc", "ttg", "ttt"
    	};
     
    	// Initialisation of the dictionnary that will give for a trinucleotide its corresponding index in RFDD-Base
    	hcreate(64);
     
    	// Element of the dictionnary of trinucleotides
    	ENTRY trinuc_dic_e;
    	int i;
     
    	for (i=0; i < 64; i++) {
    		trinuc_dic_e.key = trinuc_arr[i];
    		trinuc_dic_e.data = (void*) i+1;
    		hsearch(trinuc_dic_e, ENTER);
    	}
     
    }
    et comme je me sents pas trop dans l'ame de toucher à la focntion hsearch de la librairie <search.h> , je suis bien embêté.

    Ou alors je fais fit de ce warning ? Mais si ça se trouve c'est lui qui bugg en compilant avec -O3 ?!...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    Et puis l'option -ainsi est assez trash quand même!

    Y'a pas moyen de le rendre silencieux sur les commentaires obliques ?!!!!

  16. #16
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par wonderyan Voir le message
    Et puis l'option -ainsi est assez trash quand même!
    C'est -ansi, et effectivement les commentaires a la C++ ne sont pas acceptes en C90. Tu peux essayer -std=c99 a la place.

    Pour les chaines de caracteres constantes, les warnings sont plutot informatifs qu'autre chose. Si les chaines ne sont pas jamais modifiees, tu es tranquille et la source de ton erreur n'est pas la.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    ok merci je vais chercher.

    J'applique résolu à ce post car si j'ai aps trouvé ce bug en tout cas vous en avez assez fait!
    Bon week end !!!

    Et merci encore, vous irez au paradi,

    Yan

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

Discussions similaires

  1. option -DOS de gcc
    Par Invité dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2009, 20h55
  2. Option linker pthread gcc
    Par Nykoo dans le forum C
    Réponses: 30
    Dernier message: 17/01/2008, 12h17
  3. Options de compilation GCC
    Par oranoutan dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 14/07/2007, 04h10
  4. Option de compilation gcc : sem.h
    Par Luther13 dans le forum Linux
    Réponses: 8
    Dernier message: 29/12/2004, 12h29
  5. Problème avec l'option -static de gcc
    Par lsdInside dans le forum Linux
    Réponses: 2
    Dernier message: 08/05/2004, 01h01

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