¿Cuál es la diferencia entre una falla de segmentación y un desbordamiento de pila?

4 minutos de lectura

avatar de usuario
AruniRC

Por ejemplo, cuando llamamos a una función recursiva, las llamadas sucesivas se almacenan en la pila. Sin embargo, debido a un error, si continúa infinitamente, el error es ‘Falla de segmentación’ (como se ve en GCC).

¿No debería haber sido ‘desbordamiento de pila’? ¿Cuál es entonces la diferencia básica entre los dos?

Por cierto, una explicación sería más útil que los enlaces de wikipedia (pasado por eso, pero no hay respuesta a una consulta específica).

  • Las cosas de desbordamiento son sobre cuestiones de programación, las cosas de fallas son sobre servidores. oO

    – P Shved

    21 de abril de 2010 a las 18:13

  • @Pavel: ¿Qué tiene que ver SIGSEGV con los servidores? Aunque las aplicaciones del servidor pueden causar una falla de segmentación, eso realmente no tiene nada que ver con la administración del servidor y sí con la programación.

    –Nathan Osman

    21 de abril de 2010 a las 18:17

  • @Jorge: serverfault.com y zumbido.

    – kennytm

    21 de abril de 2010 a las 18:20

  • Creo que es una limitación de Posix, no es compatible con SIGSTKFLT.

    -Hans Passant

    21 de abril de 2010 a las 18:22

avatar de usuario
kennytm

El desbordamiento de pila es [a] causa, la falla de segmentación es el resultado.


Al menos en x86 y ARM, la “pila” es una pieza de memoria reservada para colocar variables locales y direcciones de retorno de llamadas a funciones. Cuando se agote la pila, se accederá a la memoria fuera del área reservada. Pero la aplicación no solicitó esta memoria al kernel, por lo que se generará un SegFault para la protección de la memoria.

Los procesadores modernos utilizan administradores de memoria para proteger los procesos entre sí. El administrador de memoria x86 tiene muchas funciones heredadas, una de las cuales es la segmentación. La segmentación está destinada a evitar que los programas manipulen la memoria de ciertas maneras. Por ejemplo, un segmento podría marcarse como de solo lectura y el código se colocaría allí, mientras que otro segmento es de lectura/escritura y ahí es donde van sus datos.

Durante un desbordamiento de pila, agota todo el espacio asignado a uno de sus segmentos, y luego su programa comienza a escribir en segmentos que el administrador de memoria no permite, y luego obtiene una falla de segmentación.

  • Bastante seguro de que Unix ha usado este término desde mucho antes de que se acercara a x86…

    – SamB

    1 de diciembre de 2013 a las 6:12

  • @SamB No veo dónde la respuesta dice lo contrario. “El administrador de memoria x86 tiene muchas funciones heredadas, una de las cuales es la segmentación” != “La segmentación inventada por x86”.

    – J Bentley

    25 de enero de 2014 a las 15:22


  • La segmentación utilizada por x86 (los registros de segmento) es completamente diferente a la “segmentación” del espacio de direcciones realizada por el sistema operativo. La falla de segmentación no tiene nada que ver con los registros de segmento. Además, aunque formó parte de x86 durante mucho tiempo, los registros de segmento siguen siendo muy importantes para el funcionamiento de x86 en los sistemas operativos modernos.

    – Caja de jabón

    25 de enero de 2014 a las 15:41

  • No estoy seguro de entender tu punto, SoapBox. La segmentación es un concepto implementado con registros de segmento en x86. Los registros se utilizan para dividir el espacio de direcciones en segmentos, como el segmento de código, el segmento de datos, el segmento de pila y el segmento adicional. Un desbordamiento de pila ocurre cuando su pila “escapa” del segmento de pila. Tengo problemas para identificar la incoherencia que intenta señalar.

    – ajs410

    5 de febrero de 2014 a las 23:47

  • En todos los sistemas operativos modernos, los registros de segmento CS, DS, SS están configurados de una manera que los ignora (los registros adicionales ES, FS, GS pueden ser excepciones que se usan para propósitos especiales). Las fallas de segmentación no son el resultado de sobrepasar un segmento de la CPU, sino de acceder a una página no válida.

    – usuario253751

    21 de mayo de 2015 a las 2:34

La pila de llamadas se está desbordando, sin embargo, el resultado del desbordamiento es que, finalmente, los valores relacionados con las llamadas se insertan en la memoria que no forma parte de la pila y luego: SIGSEGV!

Un desbordamiento de pila puede manifestarse como una excepción de desbordamiento de pila explícita (según el compilador y la arquitectura) o como una falla de segmentación, es decir, acceso a memoria no válido. En última instancia, un desbordamiento de pila es el resultado de quedarse sin espacio en la pila, y un posible resultado de quedarse sin espacio en la pila es leer o escribir en la memoria a la que no debe acceder. Por lo tanto, en muchas arquitecturas, el resultado de un desbordamiento de pila es un error de acceso a la memoria.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad