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++

  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

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par koala01 Voir le message
    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
    Je suis d'accord que le mieux (en fait, le seul comportement raisonnable) est que l'application s'arrête. Il y a des environnements où un arrêt par plantage n'est pas une bonne alternative, et où on peut vouloir tenter (sans aucune assurance de succès, ne pas se baser dessus pour une gestion de sécurité) 2 ou 3 choses avant l'arrêt (sauver un fichier de log, monter un message plus user friendly...)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Je compile sous visual Studio.
    J'ai fait expres que e-1300 tombe dans une zone ou il y a des ?? ?? ?? ??

    Savez a quoi correspondent ces zones?


    Merci

  9. #9
    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
    Citation Envoyé par JolyLoic Voir le message
    Je suis d'accord que le mieux (en fait, le seul comportement raisonnable) est que l'application s'arrête. Il y a des environnements où un arrêt par plantage n'est pas une bonne alternative, et où on peut vouloir tenter (sans aucune assurance de succès, ne pas se baser dessus pour une gestion de sécurité) 2 ou 3 choses avant l'arrêt (sauver un fichier de log, monter un message plus user friendly...)
    Avec le risque (aussi minim soit il ) que la corruption de mémoire se fasse, justement (c'est vraiment pas de bol, je te l'accorde ) dans une des fonctions en charge de la création du fichier log ou de montage du message
    Citation Envoyé par deubelte Voir le message
    Je compile sous visual Studio.
    J'ai fait expres que e-1300 tombe dans une zone ou il y a des ?? ?? ?? ??

    Savez a quoi correspondent ces zones?


    Merci
    Ce sont simplement des zones inaccessibles au débuggeur, sans doute parce qu'elles ne sont pas accessibles depuis les assemblies
    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

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Puisqu'on est dans les généralités, j'en ai un autre qui concerne des formulations que l'on retrouve très souvent dans la Norme, la msdn...

    ce sont les trucs dans ce style:

    declarator:
    direct-declarator
    ptr-operator declarator

    direct-declarator:
    declarator-id
    direct-declarator (parameter-declaration-clause) cv-qualifier-seq_opt exception-specification_opt
    ...
    cv-qualifier-seq:
    cv-qualifier-seq_opt
    cv-qualifier:
    const
    volatile


    J'imagine qu'il s'agit d'une formule théorique, mais ce signifie le _opt (en indice).

    merci

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