La seguridad nula (también conocida como seguridad nula ) es una garantía dentro de un lenguaje de programación orientado a objetos de que ninguna referencia de objeto tendrá valores nulos o vacíos .
En los lenguajes orientados a objetos, el acceso a los objetos se logra mediante referencias (o, equivalentemente, punteros ). Una llamada típica tiene la forma:
xf(a, ...)
donde f denota una operación y x denota una referencia a algún objeto. Sin embargo, en el momento de la ejecución, una referencia puede ser nula (o void ). En tales casos, la llamada anterior será una llamada void , lo que dará lugar a una excepción en tiempo de ejecución , que a menudo da como resultado la finalización anormal del programa.
La seguridad de vacío es una garantía estática (en tiempo de compilación) de que nunca surgirá una llamada de vacío.
En una charla de 2009, Tony Hoare atribuyó la invención del puntero nulo a su diseño del lenguaje ALGOL W y lo calificó de "error":
Lo llamo mi error de mil millones de dólares. Fue la invención de la referencia nula en 1965. En ese momento, estaba diseñando el primer sistema de tipos integral para referencias en un lenguaje orientado a objetos (ALGOL W). Mi objetivo era asegurar que todo uso de referencias fuera absolutamente seguro, con comprobaciones realizadas automáticamente por el compilador. Pero no pude resistir la tentación de poner una referencia nula, simplemente porque era muy fácil de implementar. Esto ha llevado a innumerables errores, vulnerabilidades y fallas del sistema, que probablemente han causado mil millones de dólares de dolor y daños en los últimos cuarenta años. [1]
Bertrand Meyer introdujo el término "seguridad en el vacío". [2]
Un primer intento de garantizar la seguridad del vacío fue el diseño del lenguaje de programación Self .
El lenguaje Eiffel es seguro contra vacíos según su estándar ISO - ECMA ; el mecanismo de seguridad contra vacíos se implementa en EiffelStudio a partir de la versión 6.1 y utiliza una sintaxis moderna a partir de la versión 6.4.
El lenguaje Spec#, un lenguaje de investigación de Microsoft Research, tiene una noción de "tipo no nulo" que aborda la seguridad frente a los nulos. El lenguaje F# , un lenguaje funcional de Microsoft Research que se ejecuta en el marco .NET, es seguro frente a los nulos, excepto cuando interopera con otros lenguajes .NET. [3]
Desde 2011, varios lenguajes admiten tipos de unión y tipos de intersección , que pueden usarse para detectar posibles punteros nulos en tiempo de compilación, utilizando una clase especial Null cuyo valor null es su instancia única.
La seguridad nula basada en tipos apareció primero en Ceylon , seguida pronto por TypeScript .
El lenguaje C# implementa la comprobación de seguridad de valores nulos en tiempo de compilación desde la versión 8. Sin embargo, para mantener la compatibilidad con versiones anteriores del lenguaje, la función se habilita por proyecto o por archivo. [4]
El lenguaje Dart de Google lo implementa desde su versión 2.0, en agosto de 2018 [5] [6]
Otros lenguajes que utilizan tipos seguros para valores nulos de forma predeterminada incluyen Kotlin de JetBrains , [7] Rust [8] y Swift de Apple .