Esta pregunta está relacionada pero es diferente de this one sobre las matrices de longitud variable en C99.¿Cuántas páginas de memoria usan los compiladores de C en sistemas operativos de escritorio para detectar desbordamientos de pila?
Las respuestas señalan que un peligro al asignar matrices de longitud variable (o solo grandes matrices de un tamaño fijo) en la pila es que la asignación puede fallar silenciosamente, en oposición a, por ejemplo, llamar al malloc
, que explícitamente informa al llamante si la asignación tuvo éxito.
Las plataformas de compilación no incorporadas modernas usan una zona de memoria no válida para detectar algunos desbordamientos de pila sin costo adicional (las comprobaciones son solo las comprobaciones que la MMU ha realizado de forma gratuita). Esto no protege al 100% del problema anterior porque una matriz local muy grande puede hacer que el puntero de la pila salte sobre el área no válida.
¿Alguien sabe cuántas páginas se suelen asignar para esta detección? Supongo que sería al menos 4KiB, pero podría ser más. ¿Es una elección hecha por el compilador o el sistema operativo, y en ambos casos, hay una manera de cambiarlo?
Buena pregunta, pero uno debe comentar que malloc no dice explícitamente en todos los sistemas si la asignación tuvo éxito. Todavía puede fallar después en el primer acceso (al menos en algunos sistemas: consulte asignación optimizada o compromiso excesivo de memoria). – flolo
@flolo Casi comento sobre eso, pero luego decidí omitirlo porque el exceso de memoria es realmente un problema de sistema operativo, no de lenguaje. Como tal, no causa un comportamiento indefinido, causa que el proceso de asignación, u otro proceso, sea asesinado limpiamente. –
Consulte también [Aviso de seguridad de Qualys: The Stack Clash] (http://www.openwall.com/lists/oss-security/2017/06/19/1) en la lista de correo de OSS-Security. Muestra algunos buenos trucos, y es bastante condenatorio de la página de guardia. Es sorprendente la cantidad de OS que arrastraron con él. – jww