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 :

Catcher un Stack Overflow


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut Catcher un Stack Overflow
    Bonjour à tous,

    peut on catcher un stack overflow comme sur cette exemple (qui ne marche pas) ?


    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
    23
    24
    25
     
    void test8()
    {
    	try
    	{
    		int i = 0;
    		test9(i);
    	}
    	catch(const exception &e)
    	{
    		cout << e.what() << endl;
    	}
    }
     
    void test9(int &i)
    {
    	i++;
    	test9(i);
    }
     
    int main()
    {
    	test8();
    	return 0;
    }

    On m'a envoyé ce lien : http://gcc.gnu.org/onlinedocs/libstd....6/a00469.html et je vois qu'il y a une exception correspondante (overflow_error), comment fait on pour la catcher ?

    merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    std::overflow_error n'est pas du tout une exception lancée dans le cas d'une stack overflow, mais est bien, pour citer le site
    Citation Envoyé par Detailed Description
    Thrown to indicate arithmetic overflow.
    Il s'agit donc d'une exception qui est lancée lorsque tu dépasse une limite arithmétique.

    Le problème du stack overflow est que c'est un signal envoyé par le système d'exploitation lorsque l'on en arrive à essayer de placer dans la pile (stack) plus que ce que la pile ne peut contenir.

    Ce genre de problème arrive généralement parce que l'on en arrive soit à vouloir créer un array de données trop important (un char tab[XXX] )soit lorsqu'on en arrive à avoir trop d'appels de fonctions imbriqués (souvent, par exemple, avec des fonctions récursives... même si c'est de manière indirecte)

    Plutot que d'essayer de récupérer ce genre d'erreur, il me semblerait bien plus intéressant de revoir l'ensemble de la logique qui mène à ce problème

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    std::overflow_error n'est pas du tout une exception lancée dans le cas d'une stack overflow, mais est bien, pour citer le site
    Il s'agit donc d'une exception qui est lancée lorsque tu dépasse une limite arithmétique.

    Le problème du stack overflow est que c'est un signal envoyé par le système d'exploitation lorsque l'on en arrive à essayer de placer dans la pile (stack) plus que ce que la pile ne peut contenir.

    Ce genre de problème arrive généralement parce que l'on en arrive soit à vouloir créer un array de données trop important (un char tab[XXX] )soit lorsqu'on en arrive à avoir trop d'appels de fonctions imbriqués (souvent, par exemple, avec des fonctions récursives... même si c'est de manière indirecte)

    Plutot que d'essayer de récupérer ce genre d'erreur, il me semblerait bien plus intéressant de revoir l'ensemble de la logique qui mène à ce problème
    Ouep je suis conscient de tous ça, j'ai un algo qui agit sur des images et qui marche parfaitement bien (récursivement). Cependant quand l'image est trop grande --> stack overflow
    Donc j'increment un compteur d'appel récursif et quand il est égale à 4000 je return false et je continue mon algo à partir d'un autre point pour au final trouvé le resultat.

    Le truc c'est que j'aimerai bien, au lieu d’incrémenter un compteur, faire en sorte que lorsqu'il y a un stack overflow, il arrête la récursivité et continue l'algo de la même manière que pour le return false.

    Quelqu'un a une idée ?

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Sinon merci pour ta réponse, effectivement c'est un arithmetic overflow j'avais pas capté x)

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir.

    Citation Envoyé par K-LiBR3 Voir le message
    On m'a envoyé ce lien : http://gcc.gnu.org/onlinedocs/libstd....6/a00469.html et je vois qu'il y a une exception correspondante (overflow_error), comment fait on pour la catcher ?
    Je t'ai dirigé sur ce diagramme pour que tu aies un aperçu des exceptions disponibles, si tu voulais tenter de capturer précisément l'erreur provoquée par un stack overflow.
    Mais à condition que tu puisses la capturer simplement avec std::exception.

    De plus, j'avais précisé que je ne connaissais pas d'exception standard permettant de capturer un stack overflow.
    Je pensais que ça t'aurais mis la puce à l'oreille, et que tu aurais regardé d'un peu plus près la documentation...

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par K-LiBR3 Voir le message
    Ouep je suis conscient de tous ça, j'ai un algo qui agit sur des images et qui marche parfaitement bien (récursivement). Cependant quand l'image est trop grande --> stack overflow
    Donc j'increment un compteur d'appel récursif et quand il est égale à 4000 je return false et je continue mon algo à partir d'un autre point pour au final trouvé le resultat.

    Le truc c'est que j'aimerai bien, au lieu d’incrémenter un compteur, faire en sorte que lorsqu'il y a un stack overflow, il arrête la récursivité et continue l'algo de la même manière que pour le return false.

    Quelqu'un a une idée ?
    Heu... ne pas utiliser d'algorithme récursif

    Ou veiller à utiliser un tableau dynamique pour les données, et à ne pas le recopier

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Heu... ne pas utiliser d'algorithme récursif

    Ou veiller à utiliser un tableau dynamique pour les données, et à ne pas le recopier
    En fait au niveau récursivité je ne peux pas faire mieux, la seul chose qui est stocké c'est le pointeur sur programme (aucune variable... rien)


    Et pour ce qui est de ne pas utilisé de récursivité, je ne pense pas que ce soit possible, en fait mon problème est simple :

    J'ai une image blanche, je doit dire si c'est possible d'aller d'un point de départ à un point d'arriver donnés (je peux me déplacer seulement si le voisin est de même couleur). Tu crois que c'est possible avec des boucles ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    578
    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 : 578
    Points : 1 536
    Points
    1 536
    Par défaut
    Et pour ce qui est de ne pas utilisé de récursivité, je ne pense pas que ce soit possible
    Détrompe-toi. Tout algo récurcif peut être écrit avec un algo iteratif (mais pas toujours simplement...), et ce pour 2 bonnes raisons :

    - Raison pratique: le CPU d'un PC fonctionne de manière itérative. Donc au final, ton algo sera toujours executé de manière itérative.

    - Raison théorique: le lambda calcul (en gros la programmation récurcive) est équivalent à la machine de turing (en gros, programation itérative). Tout ce qui est faisable avec l'un est faisable avec l'autre.

    Pour ton problème de stack overflow, tu peux chercher du coté des structured exception (option \EHa pour visual, mais cette option n'existe pas pour gcc). Ca marche pour les invalid pointer exception, mais je ne sais pas si ça marche pour les stack overflow.

  9. #9
    screetch
    Invité(e)
    Par défaut
    sinon, pour ton cas, tu peux stocker la liste des "noeuds" visités lorsque tu trouves des intersections dans une pile/liste C++.
    regarde du côté de http://fr.wikipedia.org/wiki/Algorithme_A* qui fait un traitement similaire

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Sous Unix, tu peux catcher le signal SIGSTKFLT (http://en.wikipedia.org/wiki/SIGSTKFLT).

    Sous Windows, tu peux jouer avec SEH (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx)

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par pyros Voir le message
    Détrompe-toi. Tout algo récurcif peut être écrit avec un algo iteratif (mais pas toujours simplement...), et ce pour 2 bonnes raisons :

    - Raison pratique: le CPU d'un PC fonctionne de manière itérative. Donc au final, ton algo sera toujours executé de manière itérative.

    - Raison théorique: le lambda calcul (en gros la programmation récurcive) est équivalent à la machine de turing (en gros, programation itérative). Tout ce qui est faisable avec l'un est faisable avec l'autre.

    Pour ton problème de stack overflow, tu peux chercher du coté des structured exception (option \EHa pour visual, mais cette option n'existe pas pour gcc). Ca marche pour les invalid pointer exception, mais je ne sais pas si ça marche pour les stack overflow.
    Merci pour ces infos, je vais essayé de pensé mon programme de façon itérative mais ça ne va pas être simple x)

    Citation Envoyé par Emmanuel
    Sous Unix, tu peux catcher le signal SIGSTKFLT (http://en.wikipedia.org/wiki/SIGSTKFLT).

    Sous Windows, tu peux jouer avec SEH (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx)
    Tu crois qu'un catch exception &e suffit pour les SEH ?


    screetch merci pour cet algo, je regarderai plus en détail si celui ci correspond bien à mon problème.

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par K-LiBR3 Voir le message
    Tu crois qu'un catch exception &e suffit pour les SEH ?
    Si tu avais parcouru la doc dont je t'ai filé le lien, tu aurais vu que non. SEH est un mécanisme très particulier, très différent du mécanisme de gestion d'exception du C++.

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Si tu avais parcouru la doc dont je t'ai filé le lien, tu aurais vu que non. SEH est un mécanisme très particulier, très différent du mécanisme de gestion d'exception du C++.
    Je débute en C++ donc cette doc j'ai un peu de mal mais merci

    En gros si j'ai bien compris ça vérifie que le code pourra s’exécuter correctement via des __try ?

    Citation Envoyé par doc
    AbnormalTermination
    Indicates whether the __try block of a termination handler terminated normally.
    Il n'y a pas vraiment d'exemples, donc c'est un peu chaud à comprendre

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par K-LiBR3 Voir le message
    Je débute en C++ donc cette doc j'ai un peu de mal mais merci

    En gros si j'ai bien compris ça vérifie que le code pourra s’exécuter correctement via des __try ?



    Il n'y a pas vraiment d'exemples, donc c'est un peu chaud à comprendre
    Tu peux trouver des exemples en faisait des recherches complémentaires sur le net. Il y a notamment des articles relativement simple à comprendre sur CodeProject

    http://www.codeproject.com/KB/cpp/seexception.aspx
    http://www.codeproject.com/KB/except...ingInVCPP.aspx

    etc...

Discussions similaires

  1. [GNU-Prolog][Mémoire] Local stack overflow
    Par Maxoo dans le forum Prolog
    Réponses: 15
    Dernier message: 04/06/2008, 22h15
  2. stack overflow: question insoluble
    Par coyotte507 dans le forum SDL
    Réponses: 3
    Dernier message: 19/12/2006, 17h50
  3. Stack OverFlow
    Par Goundy dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2005, 21h35
  4. Problème de stack overflow
    Par heider dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2005, 19h50
  5. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16

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