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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    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
    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,

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

  3. #3
    Membre actif
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    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 actif
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Par défaut
    Sinon merci pour ta réponse, effectivement c'est un arithmetic overflow j'avais pas capté x)

  5. #5
    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 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
    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

  6. #6
    Membre actif
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    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 ?

  7. #7
    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
    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.

  8. #8
    Membre émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    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...

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