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 :

Traiter une erreur "Segmentation Fault"


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Traiter une erreur "Segmentation Fault"
    Bonjour,

    Je vous explique mon problème :

    Je porte une classe que j'avais développée en vb.net pour gérer des fichiers logs en Linux C++. Jusque la pas de soucis. Je suis +- débutant on peut dire en C++.

    Mon problème vient lorsque je tente d'initier mon fichier log, si le chemin du fichier se trouve dans un répertoire ou j'ai les droits, pas de soucis, mais si je mets comme chemin un répertoire ou je n'ai pas les droits, je reçois "Segmentation Fault". Qq part logique, mais j'aimerai pouvoir traiter cette erreur avec un try catch, mais il ne la prends pas.

    Si je lance avec sudo ./main la ca marche sans problème.

    Qqn a une idée ou a déjà expérimenté ce problème ?

    voici un bout de code :

    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
    bool CLogfile::Initlogfile()
    {
         try
         {
             if(!FileExist(m_filepath))
             {
               FILE *myfile;
               myfile=fopen(m_filepath, "w+t");
               fprintf(myfile, "Initiation of log file- %s\n", m_filepath); // c'est ici que le Segmentation fault apparait
               fclose(myfile);
               return true;
              }
          }
          catch(...)
          {
              printf("An error has occured!\n");
              return false;
          }
    }
    Merci d'avance,

    Looney

  2. #2
    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
    Bonjour,

    En fait, c'est juste que tu ne verifie pas si fopen ouvre correctement le fichier.
    Comme pour les fichiers dont tu n'as pas le droit d'ouverture, le fopen() va echouer, donc te renvoyer un pointeur NULL. ( Que tu va essayais d'utiliser ) => donc segmentation fault.

    Pour cela se produit, c'est que la fonction FileExist te renverra true, même si tu n'as pas le droit d'ouvrir, car le fichier existe.

    Donc pour eviter le segmentation fault , il faut que tu verifie après le fopen() si myfile == NULL.

    Sinon, le try catch ne marcherai pas , car fopen ne renvoie pas d'exception. D'ailleurs, si tu fais du C++ ( try catch ce n'est qu'en C++ pas en C ) tu devrais utiliser les flux. ( fstream ). Car fopen est une fonction C, et donc comme les exceptions sont C++ , fopen ne renverra jamais d'exception.
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonjour Monsieur Littlewhite,

    Merci pour ta réponse rapide, effectivement en testant myfile, je vois bien qu'il est ==NULL donc ca marche.

    Avant de mettre resolved, j'avais qd mm une derniere petite question, suivant tes conseils pr écrire en c++ j'ai remplacé mon fopen par un ofstream

    voici un petit bout de code pr test :

    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
    try
    	{
    		const char* m_filepath;
    		m_filepath="/usr/test.log";
     
    		ofstream myfile(m_filepath, ios::app);
     
    		if(myfile!=NULL)
    			myfile << "Initiation of log file - " << m_filepath << "\n";
    		else
    			printf("Could not create file\n");
    	}
    	catch(...)
    	{
    		printf("An error has occured while opening or writing to file\n");
    	}
    Je m'attendais avant de mettre mon test sur myfile!=NULL a sortir une exception, mais même pas. Alors y a-t-il moyen comme en vb.net de voir la raison pr laquelle le fichier n'a pas pu etre ouvert/écrit ou je pense encore trop vb.net ?

    D'avance je vous remercie,

    Looney

  4. #4
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Le code dans ton try ne peut lèver aucun exception.
    En C++, une exception ne peut être levée qu'avec throw.

    Invoquer des comportements indéfinis ne lève pas des exceptions, ça fait des comportements indéfinis (ça peut marcher, corrompre ton disque, ou planter).
    Boost ftw

  5. #5
    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
    Pour tester si le fichier est ouvert, en C++, on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ( ! myfile.isOpen() )
      // Fichier pas ouvert ...
    Je n'utilise pas de try catch, pour ces commandes, peut être que je devrai, mais la verification avec isOpen() me semble suffire.
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Ok ben ca marche, et un grand merci pour vos lumières en tous cas.

    Je marque le sujet en résolu.

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

Discussions similaires

  1. ferror renvoie une erreur de segmentation
    Par Deallyra dans le forum Débuter
    Réponses: 7
    Dernier message: 01/12/2008, 08h19
  2. erreur de segmentation fault
    Par barbarello dans le forum wxWidgets
    Réponses: 1
    Dernier message: 23/11/2008, 20h06
  3. Erreur de "Segmentation fault"
    Par tripleaix dans le forum x86 32-bits / 64-bits
    Réponses: 0
    Dernier message: 31/10/2008, 10h29
  4. Debuger une erreur de segmentation
    Par Z-fly dans le forum Réseau
    Réponses: 8
    Dernier message: 14/08/2008, 02h56

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