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 :

Segmentation fault incompr�hensible


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Par d�faut Segmentation fault incompr�hensible
    Salut,

    Aujourd'hui en faisant un petit cout, j'ai eu un segmentation fault que j'ai beaucoup de mal � comprendre.

    En gros ce que j'ai :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float load_avg[3];
    float shiftfloat = (float)(1<<SI_LOAD_SHIFT);
    struct sysinfo  the_info;
    sysinfo(&the_info);
     
    load_avg[0] = ((float)the_info.loads[0]) / shiftfloat;
    load_avg[1] = ((float)the_info.loads[1]) / shiftfloat;
    load_avg[2] = ((float)the_info.loads[2]) / shiftfloat;
     
    cout << "load_1:" << load_avg[0] << "\nload_5:" <<  load_avg[1] << "\nload_15:" <<  load_avg[2] << "\n";
    Ce cout produit une Segmentation Fault. Je ne comprends pas du tout pourquoi mais si je ne passe pas par un tableau, le probl�me ne se pose pas :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    float a, b, c;
     
    a = ((float)the_info.loads[0]) / shiftfloat;
    b = ((float)the_info.loads[1]) / shiftfloat;
    c = ((float)the_info.loads[2]) / shiftfloat;
     
    cout << "load_1:" << a << "\nload_5:" <<  b << "\nload_15:" <<  c << "\n";
    Note : Ce probl�me ne se pose pas sur toutes les machines, mais s'il arrive, c'est en permanence.

    Bref, je voulais savoir si quelqu'un avait une explication concernant ceci ? ^^

    Merci.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par d�faut
    V�rifie que sys_info ne te renvoie pas une erreur ... on ne sait jamais, car s'il renvoie une erreur il se peut qu'il ne mette pas de valeurs dans le tableau. ( et donc ne pas l'allou� ... )

    En fait je ne sais pas trop d'ou cela peut venir. Peut �tre une division par z�ro , mais cela ne peut pas �tre � cause que cela renverrai une erreur illegal operation ...
    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.

  3. #3
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Si tu veux qu'on puisse tester et te dire d'o� �a vient, fournis un code minimal qui compile, qu'on peut simplement copier et envoyer � notre compilateur, et qui a le probl�me.

    Sinon c'est simple, tu utilises valgrind et tu verras clairement o� est le probl�me.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    C'est en lisant quel indice du tableau que la segfault se produit ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Par d�faut
    Citation Envoy� par LittleWhite Voir le message
    V�rifie que sys_info ne te renvoie pas une erreur ... on ne sait jamais, car s'il renvoie une erreur il se peut qu'il ne mette pas de valeurs dans le tableau. ( et donc ne pas l'allou� ... )
    Si sysinfo renvoyait une erreur, le fait de passer par des variables interm�diaires devrait toujours entra�ner une segmentation fault, non ?
    De plus, c'est le cout qui produit la segmentation fault, pas le calcul des valeurs du tableau load_avg.

    Pour le code minimal :
    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
    #include <sys/sysinfo.h>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        float load_avg[3];
        float shiftfloat = (float)(1<<SI_LOAD_SHIFT);
        struct sysinfo  the_info;
        sysinfo(&the_info)
     
        load_avg[0] = ((float)the_info.loads[0]) / shiftfloat;
        load_avg[1] = ((float)the_info.loads[1]) / shiftfloat;
        load_avg[2] = ((float)the_info.loads[2]) / shiftfloat;
     
        cout << "load_1:" << load_avg[0] << "\nload_5:" <<  load_avg[1] << "\nload_15:" <<  load_avg[2] << "\n";
     
        return 0;
    }
    En r�-ex�cutant, le code, je n'arrive plus � reproduire le probl�me donc je ne peux pas voir pour valgrind. Mais j'avais essay� avec gdb, mais il ne savait pas ce qui d�clenchait la segmentation fault.

    Sinon, j'avais essay� de s�parer les 3 cout, et l'erreur se produisait d�s le premier.

  6. #6
    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
    Si c'est au niveau du cout que l'erreur survient, c'est que tu corromps la m�moire avant d'y arriver, donc, vraissemblablement dans la seule partie que tu ne nous a pas donn�e: la fonction sysinfo(sysinfo*) (un constructeur quelconque ), �tant donn� que rien dans le code pr�senter ne semble la justifier, du moins si on consid�re comme juste la valeur de SI_LOAD_SHIFT (que l'on ne peut pas controler ici)

    Il ne serait pas particuli�rement surprenant que l'erreur vienne d'un pointeur mal initialis�

    Mais, l�, sans le code de cette fonction, il nous est difficile d'�tre plus pr�cis

    Au fait... En C++, le fait de d�finir une structure, une classe, une �num�ration ou une union d�clare automatiquement le type concern�...

    Il n'est donc pas n�cessaire de repr�ciser le mot cl� struct lorsque tu souhaite d�clarer une variable du type souhait�

    La ligne de code
    peut donc avantageusement �tre remplac�e par
    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

  7. #7
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    En r�-ex�cutant, le code, je n'arrive plus � reproduire le probl�me donc je ne peux pas voir pour valgrind.
    L'int�r�t de valgrind, c'est que m�me si le probl�me ne g�n�re pas d'erreur, tu le vois...
    Donc ce que tu dis n'a pas de sens.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 24/02/2010, 10h38
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    R�ponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    R�ponses: 2
    Dernier message: 21/09/2004, 06h05
  4. R�ponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    R�ponses: 15
    Dernier message: 08/08/2003, 13h43

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