language agnostic - ¿Qué es un desbordamiento de pila?
language-agnostic stack (5)
¿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?
De wikipedia , de couse:
En el software, se produce un desbordamiento de pila cuando se usa 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
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 principal llamada WriteCustomerDetails y la llamada PrintToConsole para escribir bits de datos individuales que la función WriteCustomerDetails buscó:
''======= top of stack =====================''
Función: PrintToConsole
Arg: John Smith, 34 Acacia Avenue, 23 años
''------------------------------------------------- ---------- ''
Función: WriteCustomerDetails
Arg: John Smith
''------------------------------------------------- ---------- ''
Función: Principal
''====== fondo de pila ===================''
Se produce un desbordamiento de 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.
Un desbordamiento de pila ocurre cuando usa mucho espacio de pila. En general, hay dos situaciones cuando esto sucede:
El primero 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;
}
}
El segundo es cuando tienes 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.
ja, tu inglés es un poco difícil de entender, pero creo que entiendo lo que preguntas.
un desbordamiento de pila ocurre cuando está usando 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.
De la Wikipedia :
En el software, se produce un desbordamiento de pila cuando se usa 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.
La pila es una estructura de datos que mantiene el registro del punto al que deben devolver las subrutinas de un programa cuando finalizan la ejecución. Las direcciones de retorno se insertan en la pila a medida que se invocan las subrutinas, cuando la subrutina termina su ejecución, la dirección de retorno se saca 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á previsto 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 DrawSquare
desde otra subrutina llamada DrawSquare
. Espero que esta imagen ayude a comprender mejor la estructura de la pila.
Hay dos causas principales de un desbordamiento de pila: recursiones de funciones profundas y variables de pila excesivamente grandes . 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.
Contribución de Guffa : 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.