Skip to main content

¿Qué es una falla de segmentación?

Una falla de segmentación es un error de la computadora que ocurre cuando un programa intenta acceder a una región de memoria de manera no válida. Estos errores pueden ser errores de lectura, cuando se intenta leer datos que no se han inicializado correctamente, o escribir errores, donde un programa intenta escribir datos en una ubicación incorrecta en la memoria. En lenguaje informático, el término a menudo se acorta a segfault. Dado que los segfaults pueden ocurrir tanto en la lectura como en la escritura de datos, pueden ocurrir en una variedad de contextos y con diferentes nombres específicos, incluidos errores de bus, desbordamientos de búfer, fallas de página y violaciones de almacenamiento.

Aunque se puede crear una falla de segmentación en algunos lenguajes de computadora más fácilmente que en otros, las fallas de segmentación no son parte de los lenguajes de computadora en sí. En teoría, cualquier lenguaje de computadora puede causar un error de escritura de datos que genera un defecto de seguridad. Los lenguajes de computadora que permiten que un programador maneje explícitamente la memoria, como C ++, permiten al usuario introducir segfaultos involuntarios con relativa facilidad con una programación deficiente. Los lenguajes que no permiten la gestión explícita de la memoria, como Java, manejan la mayoría de los problemas de memoria sin la interferencia del programador y, por lo tanto, minimizan las fallas de segmentación al no permitirle al programador acceder a áreas fuera de la memoria asignada.

Las formas en que un programador puede crear una falla de segmentación varían, dependiendo de la forma en que se utilizan los datos. Hay ciertas construcciones con las que es más fácil crear este error. Un culpable común de una falla predeterminada es un error de desbordamiento de matriz, en el que los datos específicos están contenidos en ranuras dentro de una ubicación de memoria particular, pero el programador intenta acceder a una ranura que no existe. Los segfaults generados por estas situaciones son a menudo difíciles de rastrear. Algunos lenguajes de computadora tienen verificación de límites, lo que anticipa este tipo de error y no permitirá que el usuario intente acceder a una ranura no válida.

Una forma menos común en la que se pueden generar segfaults ocurre cuando dos lenguajes de computadora pasan datos entre sí mediante un proxy. En este contexto, una falla de segmentación es particularmente difícil de diagnosticar porque no siempre está claro de qué lenguaje o capa de código de programación proviene el error. Incluso si una capa tiene una comprobación de límites implícita y no permite fallas seguras en el 99.9% de los contextos, puede ser un trabajo tedioso y que requiere mucho tiempo determinar de dónde vino el error.

La mejor manera de evitar fallas de segmentación es ser muy cauteloso con la administración de la memoria. La mayoría de las buenas prácticas de programación recomiendan que los usuarios liberen explícitamente cada byte de memoria que se asigna manualmente en un programa. Esto a menudo es difícil de hacer, pero hacerlo correctamente aumenta las posibilidades de un programador de crear un programa robusto y sin errores.