2009-07-10 19 views
33

¿Qué es un error de desbordamiento de pila? ¿Qué tipo de programas/lenguajes de programación es probable que ocurra? ¿Es poco probable que ocurra en el código de la aplicación web?¿Qué es un desbordamiento de pila?

+0

http://en.wikipedia.org/wiki/Stack_overflow –

Respuesta

26

De Wikipedia:

En software, un desbordamiento de pila cuando se utiliza demasiada memoria en la pila llamada. En muchos lenguajes de programación , la pila de llamadas contiene una cantidad limitada de memoria , generalmente determinada al comienzo del programa .

La pila es una estructura de datos que mantiene el registro del punto al que las subrutinas de un programa deben devolver el control cuando finalizan la ejecución. Las direcciones de retorno son presionadas en la pila como se están invocando las subrutinas, cuando la subrutina termina su ejecución, la dirección de retorno es extraída de la pila. Si hay muchas subrutinas y no hay espacio en la pila, ocurre un desbordamiento de pila.

También en la pila está destinado a almacenar variables locales, por lo que si una variable local es demasiado grande es más probable que la pila no tenga espacio para almacenarla, si este es el caso también ocurre un desbordamiento de la pila.

Wikipedia incluye un bonito diagrama que representa la pila cuando se llama a una subrutina DrawLine desde otra subrutina llamada DrawSquare, espero que esta imagen ayude a comprender mejor la estructura de la pila.

stack diagram

Hay dos causas principales de un desbordamiento de pila: recursiones función profundas y excesivamente grandes variables de pila. Dado que estos son términos comunes en casi todos los lenguajes de programación, puede ocurrir un desbordamiento de la pila además de la complejidad del lenguaje.

Guffa aporte: La pila no tiene nada que ver con la recolección de basura.Las aplicaciones modernas tienen una pila más grande, lo que hace que sea ligeramente menos probable que se desborde la pila, pero aparte de eso, no hay diferencia.

+1

Según tengo entendido, esto tampoco sucede (al menos no tanto, no estoy seguro) en idiomas modernos con recolección de basura. – thebrokencube

+1

Por supuesto, puede suceder en un lenguaje de script. Tienen una pila de llamadas, y eso puede desbordarse de forma natural. – Guffa

+1

Sí, puede suceder en Java, por ejemplo, cuando se usa una recurrencia muy profunda http://stackoverflow.com/questions/860550/stack-overflows-from-deep-recursion-in-java –

5

De wikipedia, de couse:

En software, un desbordamiento de pila se produce cuando se utiliza demasiada memoria en la pila de llamadas. En muchos lenguajes de programación, la pila de llamadas contiene una cantidad limitada de memoria, generalmente determinada al inicio del programa. El tamaño de la pila de llamadas depende de muchos factores, incluidos el lenguaje de programación, la arquitectura de la máquina, el multihilo y la cantidad de memoria disponible. Cuando se utiliza demasiada memoria en la pila de llamadas, se dice que la pila se desborda; normalmente resulta en un bloqueo del programa. 1 Esta clase de error de software generalmente es causada por uno de dos tipos de errores de programación

+1

+1 Un poco te deja colgando ... – steamer25

+1

Esto no es respuesta Estoy buscando –

+1

pero esta respuesta es buena, creo que –

1

ha, su Inglés es un poco difícil de entender, pero creo que entiendo lo que su venta.

se produce un desbordamiento de pila cuando está utilizando una pila (duh ...) y hay un problema de asignación/lectura de memoria. en "programas web", como usted dice (supongo que está hablando de HTML, PHP, JS), o bien no usa pilas o el lenguaje utilizado no permite un control de memoria de bajo nivel que previene estos problemas.

+2

La falta de control de la asignación de memoria ** ** no impide que la pila se desborde. –

+2

Casi todos los idiomas tienen una pila de llamadas, es necesaria para que el código pueda regresar a donde estaba después de que termina una subrutina. Esta pila de llamadas normalmente tiene un tamaño fijo, por lo que después de llamar a demasiadas subrutinas sin regresar, la pila se llena y se desbordará. –

18

La pila contiene una cantidad de cuadros de pila y se almacena en la memoria. Cada vez que se llama a una función, se agrega un nuevo marco de pila a la pila. Un marco de pila contiene los argumentos a pasar a la función a la que se llama, y ​​la dirección de retorno, de modo que cuando la función llamada ha finalizado, la CPU sabe a dónde volver para poder continuar ejecutando la función de llamada. El marco de pila también puede contener memoria para ser utilizada por las variables locales de la función a la que se llama.

En este ejemplo, la función llamada principales WriteCustomerDetails y que llama PrintToConsole para escribir bits individuales de los datos que la función WriteCustomerDetails levantó la vista:

'======= parte superior de la pila ==== ================= '
Función: PrintToConsole
Arg: John Smith, 34 Acacia Avenue, edad 23
' ----------- ------------------------------------------------ '
Función: WriteCustomerDetails
Arg: John Smith
'------------------------------------------------ ----------- '
Función: Principal
' ====== fondo de la pila =================== '

Se produce un desbordamiento de la pila si no se reservó suficiente espacio para la pila. Por lo general, una pila se encuentra en un gran bloque contiguo de memoria, por lo que no está dividida en fragmentos, lo que significa que se necesita una gran cantidad de memoria, y esto dificulta el tiempo de ejecución para intentar aumentar el espacio reservado para la pila si se llena

Un desbordamiento de pila a menudo puede ocurrir cuando se escribe accidentalmente una función que se llama a sí misma. A veces está bien que una función se llame a sí misma siempre que haya un 'si' o alguna condición en la función que detenga las llamadas en algún momento. Esto se llama una función recursiva. Pero, si no se detiene y la función sigue llamándose a sí misma, o tal vez dos o más funciones continúan llamándose entre sí, rápidamente comerán toda la memoria de la pila. Cuando no queda nada, obtienes un desbordamiento de pila y el programa falla.

Es posible que esto suceda en cualquier programa, no necesariamente tienen que ser complejos, y puede suceder en el código que ejecuta un sitio web. Y, también puede ocurrir en lenguajes de scripting.

+1

Muy buena respuesta, +1 –

7

Se produce un desbordamiento de la pila cuando utiliza demasiado espacio de pila. En general, hay dos situaciones cuando esto sucede:

La primera es cuando tiene un error en el código, lo que causa un bucle recursivo sin una salida. Por ejemplo, una propiedad que lee de sí misma:

public int Length { 
    get { 
     return Length; 
    } 
} 

La segunda es cuando tiene un bucle recursivo que es demasiado profundo. Como el espacio de la pila es limitado, solo puede anidar un algoritmo una cierta cantidad de veces. Si su algoritmo está anidado demasiado profundo para que se quede sin espacio de pila antes de que exista, se obtiene un desbordamiento de la pila. Ejemplo:

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

Si llama a este método con un valor demasiado grande, anidará demasiado profundo y provocará un desbordamiento de la pila.

+3

El motivo del desbordamiento de pila en ambos ejemplos es la recursividad. Sin embargo, hay otra razón bastante simple: si una variable (local) o un argumento de función que está asignado en la pila es demasiado grande, normalmente esto ocurriría con las matrices, consulte http://en.wikipedia.org/wiki/Stack_overflow –

Cuestiones relacionadas