Error detectado de rotura de pila en C
Este tutorial destaca la causa y soluciona el error de aplastamiento de pila detectado
en C.
Cualquiera que enfrente este problema debe comprender la división de la memoria y el diseño de la pila. Ayudará a identificar las causas de este error al codificar en programación C.
el error stack smashing detectado
en C
Por lo general, el compilador (aquí estamos hablando del compilador GCC) genera este error para defenderse contra el desbordamiento del búfer. El desbordamiento del búfer ocurre cada vez que la entrada del usuario excede la capacidad del búfer (un área de almacenamiento temporal).
En ese caso, el compilador arroja un error que dice se ha detectado un aplastamiento de la pila
. Consulte el siguiente fragmento de código en el que aparece el error Se ha detectado una rotura de pila
si el usuario introduce más de 10 caracteres.
Código de ejemplo:
#include <stdio.h>
int main(int argc, char **argv) {
char array[10];
printf("Please enter your username.");
gets(array);
return 0;
}
Como este error rodea los conceptos de desbordamiento de búfer y pila, es crucial comprender la división de la memoria y el diseño de la pila aquí.
El desbordamiento del búfer es un proceso peligroso, por lo que el compilador obtiene la ventaja de diferentes mecanismos de protección para protegerse contra este error. Uno de los mecanismos se conoce como canary, un valor generado aleatoriamente.
El compilador (GCC) agrega las variables de protección (llamadas canarios) que tienen valores conocidos. El canario se sobrescribe si el búfer se desborda.
Además, el compilador identifica, comparando con valores conocidos, que la pila está comprometida y genera un error que dice: se detectó rotura de pila
.
Para evitar la variable protección de desbordamiento de búfer y tener algunas ideas, podemos desactivar la protección de GCC usando -fno-stack-protector
durante la compilación. Por ejemplo, $ gcc -o filename -fno-stack-protector
.
De esta forma, lo más probable es que obtengamos el error de fallo de segmentación
porque estaremos intentando acceder a la ubicación de memoria ilegal. Recuerde que el fstack-protector
debe estar activado para las compilaciones de lanzamiento porque es una función de seguridad.
Solucione el error Stack Smashing detectado
en C
Ahora, ¿cómo rectificamos este error y ejecutamos el programa sin problemas?
No podemos decir que evitar el protector de pila sea una solución a este problema, pero ayuda a encontrar algunas ideas que podemos usar para corregir este error. También podemos obtener algunos detalles sobre la causa del desbordamiento ejecutando el programa con un depurador.
Valgrind no funcionará bien con los problemas y errores relacionados con la pila, pero un depurador puede ayudarnos a identificar el motivo y la ubicación del bloqueo. Encuentre ese código defectuoso y corríjalo para evitar vulnerabilidades de seguridad graves.