Qu'est ce qu'un débordement de pile?

Qu'est Ce qu'une erreur de dépassement de pile? Dans quel type de programmes/langages de programmation est-il susceptible de se produire? Est-il peu probable que cela se produise dans le code d'application web?

34
demandé sur joe 2009-07-10 19:14:43

5 réponses

À Partir De Wikipedia:

Dans le logiciel, un débordement de pile se produit lorsque trop de mémoire est utilisée sur le la pile des appels. Dans beaucoup de programmation langages, la pile d'appels contient un quantité limitée de mémoire, généralement déterminé au début de la programme.

La pile est une structure de données qui enregistre le point auquel les sous-programmes d'un programme doivent retourner le contrôle à la fin de l'exécution. Les adresses de retour sont poussés dans la pile comme les sous-programmes sont appelés, lorsque le sous-programme termine son exécution, l'adresse de retour est tirée de la pile. S'il y a beaucoup de sous-Programmes et qu'il n'y a pas d'espace dans la pile, un débordement de pile se produit.

Aussi dans la pile est destiné à stocker des variables locales, donc si une variable locale est trop grande, il est plus probable que la pile n'ait pas d'espace pour la stocker, si c'est le cas, un débordement de pile se produit aussi.

Wikipedia comprend un joli diagramme illustrant le stack quand un sous-programme DrawLine est appelé à partir d'un autre sous-programme appelé DrawSquare, j'espère que cette image aidera à mieux comprendre la structure de la pile.

diagramme de pile

Il y a deux causes principales d'un débordement de pile: récursions de fonctions profondes et variables de pile excessivement grandes . Comme ce sont des termes communs dans presque tous les langages de programmation, un débordement de pile peut se produire en plus de la complexité du langage.

Guffa contribution: La pile n'a rien à voir avec la collecte des ordures. Les applications modernes ont une pile plus grande, ce qui le rend légèrement moins susceptible d'obtenir un débordement de pile, mais à part cela, il n'y a pas de différence.

26
répondu victor hugo 2017-05-23 11:46:22

La pile contient un certain nombre d'images de pile et est stockée en mémoire. Chaque fois qu'une fonction est appelée, un nouveau cadre de pile est ajouté à la pile. Un cadre de pile contient les arguments à transmettre à la fonction appelée et l'adresse de retour, de sorte que lorsque la fonction appelée est terminée, le processeur sache où retourner afin de continuer à exécuter la fonction appelante. Le cadre de pile peut également contenir de la mémoire à utiliser par les variables locales de la fonction appelée.

Dans cet exemple, la fonction principale appelée WriteCustomerDetails et celle appelée PrintToConsole pour écrire des bits individuels de données que la fonction WriteCustomerDetails a recherchés:

'=======haut de pile====================='
Fonction: PrintToConsole
Arg: John Smith, 34 Acacia Avenue, Âge 23
'-----------------------------------------------------------'
Fonction: WriteCustomerDetails
Arg: John Smith
'-----------------------------------------------------------'
Fonction: Principal
'======en bas de la pile==================='

Un dépassement de pile se produit si suffisamment d'espace pour la pile n'a pas été réservé. Habituellement, une pile se trouve dans un grand bloc de mémoire contigu, donc n'est pas divisée en morceaux, cela signifie qu'un gros morceau de mémoire est nécessaire pour cela, ce qui rend difficile pour l'exécution d'essayer de développer l'espace réservé à la pile si elle se remplit.

Un stack overflow peut souvent se produire lorsqu'une fonction est accidentellement écrit qui s'appelle elle-même. Parfois, il est correct pour une fonction de s'appeler tant qu'il y a un " si " ou une condition dans la fonction qui arrête les appels à un moment donné. Cela s'appelle une fonction récursive. Mais, s'il n'y a pas d'arrêt et que la fonction continue à s'appeler, ou peut-être que deux ou plusieurs fonctions continuent à s'appeler, alors très rapidement, elles vont manger toute la mémoire de la pile. Quand il n'y a pas de gauche, vous obtenez un stack overflow et le programme se bloque.

Il est possible que cela se produise dans n'importe quel programme, ils ne doivent pas nécessairement être complexes, et cela peut arriver dans le code exécutant un site web. Et, il peut se produire dans les langages de script aussi.

18
répondu Scott Langham 2009-07-10 15:47:30

Un débordement de pile se produit lorsque vous utilisez trop d'espace de pile. Il y a généralement deux situations où cela se produit:

Le premier est lorsque vous avez une erreur dans le code, provoquant une boucle récursive sans sortie. Par exemple, une propriété lisant depuis elle-même:

public int Length {
   get {
      return Length;
   }
}

La seconde est lorsque vous avez une boucle récursive trop profonde. Comme l'espace de pile est limité, vous ne pouvez imbriquer un algorithme qu'un certain nombre de fois. Si votre algorithme est imbriqué trop profond pour qu'il soit à court de l'espace de pile avant qu'il existe, vous obtenez un débordement de pile. Exemple:

public bool Odd(int value) {
   if (value == 0) {
      return false;
   } else {
      return !Odd(value - 1);
   }
}

Si vous appelez cette méthode avec une valeur trop grande, elle s'imbriquera trop profondément et provoquera un débordement de pile.

7
répondu Guffa 2009-07-10 15:39:31

À Partir de wikipedia, de couse:

Dans le logiciel, un débordement de pile se produit lorsque trop de mémoire est utilisée sur la pile d'appels. Dans de nombreux langages de programmation, la pile d'appel contient une quantité limitée de mémoire, généralement déterminée au début du programme. La taille de la pile d'appels dépend de nombreux facteurs, y compris le langage de programmation, l'architecture de la machine, le multi-threading et la quantité de mémoire disponible. Lorsque trop de mémoire est utilisée sur la pile d'appels la pile est dit débordement; entraînant généralement un plantage du programme.1 Cette classe de bug logiciel est habituellement causée par l'un des deux types d'erreurs de programmation

5
répondu FerranB 2009-07-10 15:19:08

Ha, votre anglais est un peu difficile à comprendre, mais je pense que je comprends ce que vous demandez.

Un débordement de pile se produit lorsque vous utilisez une pile (duh...) et il y a un problème d'allocation/lecture de mémoire. dans les "programmes web", comme vous le dites (je suppose que vous parlez de HTML, PHP, JS), soit vous n'utilisez pas de piles, soit le langage utilisé ne permet pas un contrôle de la mémoire de bas niveau qui empêche ces problèmes.

1
répondu twolfe18 2009-07-10 15:19:26