c++ - solucion - ¿Por qué el desbordamiento de la pila en algunas máquinas, pero la falla de segmentación en otra?
que es desbordamiento wikipedia (6)
¿Por qué recibo fallas de segmentación?
La falla de segmentación, lo que está viendo, es un efecto secundario del desbordamiento de la pila. La razón es el desbordamiento de la pila, el resultado es una falla de segmentación.
Del artículo de wikipedia para "desbordamiento de pila" ( énfasis mío )
.... Cuando un programa intenta usar más espacio de lo que está disponible en la pila de llamadas (es decir, cuando intenta acceder a la memoria más allá de los límites de la pila de llamadas, que es esencialmente un desbordamiento del búfer), se dice que la pila se desborda, normalmente resulta en un bloqueo del programa.
Solo por curiosidad, intento generar un desbordamiento de pila. Este código genera un desbordamiento de pila de acuerdo con el OP , pero cuando lo ejecuto en mi máquina, genera un error de segmentación:
#include <iostream>
using namespace std;
int num = 11;
unsigned long long int number = 22;
int Divisor()
{
int result;
result = number%num;
if (result == 0 && num < 21)
{
num+1;
Divisor();
if (num == 20 && result == 0)
{
return number;
}
}
else if (result != 0)
{
number++;
Divisor();
}
}
int main ()
{
Divisor();
cout << endl << endl;
system ("PAUSE");
return 0;
}
Además, según this publicación, algunos ejemplos también deberían hacer lo mismo. ¿Por qué recibo fallas de segmentación?
Básicamente estás preguntando: ¿cuál es el comportamiento del comportamiento indefinido?
La respuesta es: el comportamiento indefinido es el comportamiento que no está definido. Cualquier cosa puede pasar
Investigar por qué obtienes cierto comportamiento indefinido en un determinado sistema suele ser ejercicio sin sentido.
Comportamiento indefinido, no especificado y definido por la implementación
En el caso del desbordamiento de la pila, el programa podría sobrescribir otras variables en la RAM, o dañar la propia dirección de retorno de la función en ejecución, o intentar modificar la memoria fuera de su rango de direcciones determinado, etc. Dependiendo del sistema, puede obtener excepciones de hardware y varios errores señales como SIGSEGV (en sistemas POSIX), o bloqueos repentinos del programa, o "el programa parece estar funcionando bien", u otra cosa.
Las otras respuestas publicadas son todas correctas.
Sin embargo, si la intención de su pregunta es comprender por qué no ve un error impreso que indique que se ha producido un desbordamiento de la pila, la respuesta es que algunas bibliotecas en tiempo de ejecución detectan e informan desbordamientos de pila, mientras que otras no, y simplemente bloqueo con segfault.
En particular, parece que al menos algunas versiones de Windows detectan s y los convierten en excepciones, ya que la documentation sugiere que puede manejarlos.
Supongo que estás usando un compilador que no tiene habilitada la comprobación de pila .
La comprobación de pila es un mecanismo bastante simple, mata el programa que indica que se produjo un desbordamiento de pila tan pronto como el puntero de la pila pasa volando. A menudo se deshabilita para fines de optimización, porque un programa casi seguro se bloqueará en un desbordamiento de pila de todos modos.
¿Por qué un segfault? Bueno, sin la comprobación de pila habilitada, su programa no se detiene después de usar la pila, y continúa hacia la memoria no relacionada (y con frecuencia protegida), que intenta modificar para usar como otro marco de pila para una nueva función de invocación. La locura sigue y ocurre un segfault.
Un desbordamiento de pila puede provocar los siguientes errores :
- Señal
SIGSEGV
(violación de segmentación) para el proceso. - Señal
SIGILL
(instrucción ilegal). -
SIGBUS
un acceso a una dirección inválida.
Para más leer las señales de error del programa . Como el comportamiento no está definido, cualquiera de los anteriores puede aparecer en diferentes sistemas / arquitecturas.
Un desbordamiento de pila es una causa, el resultado es una falla de segmentación.
En Linux y otros sistemas tipo Unix, una falla de segmentación puede ser el resultado, entre otras cosas, de un desbordamiento de la pila. No obtiene información específica de que el programa encontró un desbordamiento de pila.
En la primera publicación que está vinculando, la persona está ejecutando el código en Windows que puede comportarse de manera diferente y, por ejemplo, detectar un desbordamiento de pila específicamente.