Quiero que esto se cuelgue, pero no lo hace

en serio … soy un viejo pirata informático de los 80 y con algo de tiempo libre en mis manos pensé que sería “C” de qué se trata el alboroto

(Mi fondo es Forth, que hace las cosas al revés, así que aprendo mucho sobre cómo forzar muchos errores)

En este caso, he configurado una pequeña matriz que pensé que tendría 3 elementos de tamaño (0,1,2)

Si ejecuto la comstackción, habría pensado que tendría un error fuera de los límites, pero no, se comstack bien y se ejecuta con dulzura

No hay mucha prisa en esto, pero no es bueno para el calvicie, todo ese rasguño.


int main() { char members[3][16]; // 3 elements, each 15 char long plus null printf("\n enter something.. "); scanf( "%s", members[4]); printf("\n and something else.. "); scanf( "%s", members[5]); printf(" %s ", members[4]); printf(" %s\n", members[5]); return 0; } 

C no hace ninguna comprobación de límites. (Forth tampoco, de modo que no estoy seguro de dónde surgió la expectativa).

Desbordar una matriz es un comportamiento indefinido : está permitido, pero no es obligatorio, fallar. En este caso, los bytes simplemente se encuentran en la misma página de memoria virtual que el marco de stack donde se colocó la variable local. Si el marco estuviera hacia el final de la página, la CPU reconocería una dirección incorrecta y se quejaría del desbordamiento.

Si sale unos pocos kilobytes o megabytes, es probable que vea algo como lo que espera.

El acceso a una matriz fuera de los límites invoca un comportamiento indefinido . Esto significa que cualquier cosa podría suceder, incluso correr sin ningún error aparente.

Normalmente la memoria se asigna en páginas de 4 kB. Por lo tanto, hay algo de espacio adicional después de la última variable, y la saturación del búfer no se detecta. Sin embargo, si hubiera otra variable después de la matriz de sus members y escribiera a los members[4] , se corrompería otra variable.

Las herramientas como valgrind y dmalloc se usan a menudo para detectar desbordamientos de búfer. Funcionan al asignar regiones de protección especial alrededor de sus variables y verificar que nadie haya escrito allí.

Usted pierde la dirección de retorno principal en la stack y probablemente sobrescriba algunos datos no críticos de la persona que llama principal para que su progtwig no se bloquee. Además, en algunas plataformas (como powerpc, por ejemplo), la stack no se utiliza para la función de llamada y la dirección de retorno se almacena en el registro especial (se empuja a la stack cuando es necesario). Por lo tanto, es normal que este progtwig incorrecto no se bloquee.

Actualización: además, en algunas stacks del sistema crece (a las direcciones más altas). Al menos en ARM el crecimiento de la stack es seleccionable.