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

Langage C++ Discussion :

erreurs de segmentation non détectée


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut erreurs de segmentation non détectée
    Bonjour, voici mon problème, je développe une application en c++, j'ai un bug à un endroit dans le programme. Le programme ne plante pas mais les résultats sont relativement exotiques...

    En fait j'ai fait quelques tests et mon programme ne renvoie pas d'erreur de segmentation, même avec du code qui en toute évidence devraient planter joliment.

    Par exemple le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<int> vect  (1);
                 cout<<"valeur bidon: "<<vect[-1]<<endl;
    me renvoie 1016 en sortie console.

    De même le code suivant qui devrait aussi générer une jolie erreur de segmentation ne fait absolument pas planter le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       int *pointeur, valeur;
       valeur = 3;
       *pointeur = valeur * valeur;
    En allant un peu plus loin dans mon obstination à générer une erreur de segmentation, j'ai écrit le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *super_pointeur=(int *) 10;
    	int vm =*super_pointeur;
    Là non plus pas de plantage...


    Je précise que j'utilise mingw avec gcc-g++ 4.3.0 sous windows XP. Le comportement est le même en debug (en -w et -pg) et en release ( -O3 et -fexpensive-optimization).

    Je ne comprends vraiment pas d'où vient ce comportement pour le moins exotique et j'ai vraiment besoin de savoir d'où vient mon bug (probablement une erreur de segmentation).

    Cordialement,

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Points : 586
    Points
    586
    Par défaut
    Citation Envoyé par Benoit_T Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<int> vect  (1);
                 cout<<"valeur bidon: "<<vect[-1]<<endl;
    me renvoie 1016 en sortie console.
    Normal, il affiche une adresse mémoire censée être à l'emplacement appelé.

    Citation Envoyé par Benoit_T Voir le message
    De même le code suivant qui devrait aussi générer une jolie erreur de segmentation ne fait absolument pas planter le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       int *pointeur, valeur;
       valeur = 3;
       *pointeur = valeur * valeur;
    Ici tu donnes au contenu du pointeur (soit l'entier sur lequel il doit pointer), la valeur 6, qui est bien un entier. Donc normal.
    Si tu cherches à modifier l'adresse mémoire, tu dois faire :


    Si tu veux vraiment une erreur typique de segmentation, crée un tableau de 3 cases et fais une boucle for sur le tableau, de la case 0 à la case 10.

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Il y a plus simple pour faire un seg fault non ?
    Le premier truc qui me vient en tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* tab = 0;
    tab[0] = 0;

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Une segfault provoque un comportement indéfinie... donc, par définition ça peut faire n'importe quoi. marché, planté, effacer le disque etc.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Oui dans le cas où on accède à une adresse totalement aléatoire (comme un pointeur non initialisé, ou bien un débordement de tableau), on peut se retrouver dans son propre espace mémoire (donc pas d'erreur) mais pas à l'endroit où le voulait ce qui donne des valeurs totalement imprévues.

    Mais j'imagine que lorsqu'on essaye d'accéder à l'adresse zéro, tout système nous envoie bouler.

Discussions similaires

  1. Erreur de segmentation non trouvée
    Par Bladelight dans le forum OpenCV
    Réponses: 6
    Dernier message: 31/08/2009, 13h40
  2. [ANTLR] source d'erreur non détectée
    Par cdm1024 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 28/06/2009, 00h43
  3. Erreur de sérialisation non détectée
    Par Redman-31 dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/11/2007, 12h27
  4. Réponses: 3
    Dernier message: 27/06/2007, 11h18
  5. [FLASH MX] Erreur : L'identifiant non sensible à ...
    Par blowdesign dans le forum Flash
    Réponses: 2
    Dernier message: 16/05/2004, 21h10

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