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 :

Catcher une access violation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Catcher une access violation
    Bonjour

    J'ai fait un programme qui provoque un access violation. C'est bien sur fait exprès. Je voudrais savoir la commande qui me permet de catcher une telle exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int *e=new (int[3]);
     
    	int *p=e;
    	int *p1=e+1;
    	int *p2=e-1300;
    	try{
    	*p2=4;
    	}
    	catch(...){
    		cout<<"error";
    	}
    merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    De base, un signal ne déclenche mais d'exception.
    Mais il est possible de surcharger le traitement par défaut comme ça :

    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
    #include <iostream>
    #include <signal.h>
     
    void catch_segv(int sig) {
      signal(SIGSEGV, catch_segv);
      throw strsignal(sig);
    }
     
    int main() {
      signal(SIGSEGV, catch_segv);
     
      int *e=new (int[3]);
      int *p=e;
      int *p1=e+1;
      int *p2=e-1300;
     
      try {
        *p2=4;
      } catch( char* msg ) {
        std::cout << "Catched: " << msg << std::endl;
      }
    }
    Nécessite une compilation avec l'option -fnon-call-exceptions.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok merci
    mais ce n'est pas un exception C++, alors est-ce bien de la catcher?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pourquoi est-ce que ça serait un risque ?
    Qu'envisagez-vous de faire dans votre "catch" ?

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Bonjour,

    J'avais posé la même question mais je n'avais pas eu beaucoup de réponse :
    http://www.developpez.net/forums/d10...p/#post5844773

    Sous visual, tu peux spécifier l'option \EHa (prop. du projet->C/C++->Code Generation->Enable C++ Exception->Yes with SEH Exception) qui te throw une exception en cas de segfault, mais pas pour g++.

    Le problème d'utiliser les signaux, c'est que tu n'es jamais sûr que quelqu'un d'autre n'utilise pas déjà le signal pour autre chose (on ne peut affecter qu'une seule action par signal si je me souviens bien).

    Après, je dirais que d'essayer de cacher un segfault sous le tapis est dangereux car tu ne sais pas dans quel état se trouve la mémoire à ce moment là (même si dans 99% des cas elle n'a subit aucun dommage), et donc tu ne sais pas si ton programme pourra continuer normalement.

    La meilleur chose à faire serait de trouver la source du problème, mais bon dans la vrai vie on peut pas toujours...

  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
    Salut,

    Le gros problème, c'est que tu ne peux avoir strictement aucune idée de ce qui se trouve à e-1300, ni de l'usage qui en est fait...

    Tu peux, tout aussi bien, te trouver au milieux d'une chaine de caractères à afficher (qui sera tronquée, dans le meilleur des cas), au beau milieu d'une fonction hyper sensible (qui, manque de bol, sera appelée si tu attrape le problème ) ou ... entre deux membres d'une structure personnelle.

    Il t'est donc particulièrement difficile de déterminer le "moins mauvais" traitement à effectuer si tu arrive à attraper cette erreur

    Ne crois tu pas que le mieux (en dehors de résoudre le problème de logique sous jascent, bien sur) serait dés lors de... laisser planter purement, simplement et brutalement l'application
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/12/2008, 15h58
  2. Access violation lors d'une exécution
    Par demonia dans le forum C++
    Réponses: 1
    Dernier message: 26/11/2007, 23h29
  3. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  4. Réponses: 9
    Dernier message: 08/11/2005, 09h56
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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