La dificultad proviene esencialmente del hecho de que, en lenguaje C, estás a cargo de la memoria mental de tu propio programa. Lo que significa que tienes acceso completo a la memoria, lo que te permite hacer un programa extremadamente eficiente pero, también, podría terminar en un caos indecible.
En este contexto, verificar que escribe dentro de los límites de un área de memoria ya es un desafío. Especialmente si estos límites se eligen dinámicamente en tiempo de ejecución.
Pero, esto no es suficiente para crear un problema de seguridad, también debe controlar que el Mundo exterior no puede acceder a la capacidad de escribir fuera de estos límites.
Como ha notado en su pregunta, solo ciertos tipos de programas y / o parte del código están involucrados en estos dos problemas. Por lo general, la parte que importa entradas del mundo exterior y las procesa. Y, no hay absolutamente ninguna manera de asegurar que:
-
No habrá escritura fuera de los límites adecuados.
-
Ninguna entrada externa podrá modificar una escritura ilegal para controlarla.
Una vez más, todos estos problemas son causados por el hecho de que desea eficiencia de memoria y, por lo tanto, un acceso completo a ella. Este es el precio a pagar.