Void safety (anche nota come null safety) è una garanzia che viene posta nei linguaggi orientati agli oggetti per garantire che nessun riferimento a oggetto abbia un puntatore nullo (o void).
Nei linguaggi orientati agli oggetti, l'accesso agli oggetti e ottenuto tramite riferimenti (o, in modo equivalente, puntatori). Una chiamata tipica è qualcosa nella forma:
x.f(a, ...)
dove f denota un'operazione e x denota un riferimento a qualche oggetto. Durante l'esecuzione, tuttavia, un riferimento può essere void o null ("nullo" in italiano). In questi casi, la chiamata diventa una void call (chiamata "vuota" o "null"), portando a un'eccezione a run-time, causando spesso una terminazione inattesa del programma.
Void (o null) safety è una garanzia (a compile-time) che permette di verificare che una chiamata nulla (o void) non venga mai effettuata.
In un talk del 2009, Tony Hoare ha definito l'invenzione del puntatore null un "errore" quando ha disegnato il linguaggio ALGOL W:
«Lo definisco il mio errore da un miliario di dollari. È stata l'invenzione del riferimento nullo nel 1965. A quel tempo, stavo definendo il primo sistema completo di tipi per riferimenti in un linguaggio orientato agli oggetti (ALGOL W). Il mio obiettivo era assicurare che tutti gli usi dei riferimenti dovessero essere assolutamente sicuri, con controlli effettuati automaticamente dal compilatore. Tuttavia, non ho potuto resistere alla tentazione di creare il puntatore nullo, semplicemente perché era così semplice da implementare. Questo ha portato a innumerevoli errori, vulnerabilità, crash di sistema, cosa che ha probabilmente causato miliardi di dollari di dolore e danni negli ultimi 40 anni. [1]»
Bertrand Meyer ha introdotto il termine "void safety".[2]
Un tentativo iniziale per garantire la void safety è stato fatto durante il design del linguaggio di programmazione Self.
Il linguaggio Eiffel è void-safe secondo i suoi standard ISO-ECMA; il meccanismo di void-safety è implementato in EiffelStudio dalla versione 6.1 e utilizzando una sintassi moderna dalla versione 6.4.
Il linguaggio Spec#, un linguaggio di ricerca creato da Microsoft Research, ha la nozione di "non-nullable type" per rispondere alla void safety. Il linguaggio F#, un linguaggio funzionale creato da Microsoft Research che gira sul framework .NET, è void-safe ad eccezione quando deve interfacciarsi con altri linguaggi .NET.[3]
Dal 2011 vari linguaggi supportano gli union type e gli intersection type, che possono essere utilizzati per trovare possibili puntatori nulli a compile-time, utilizzando una classe speciale Null dove il valore null è la sua unica istanza.
La null safety basata sui tipi è apparsa per la prima volta nel linguaggio di programmazione Ceylon, seguita subito dopo da TypeScript.
Il linguaggio C# implementa i controlli di null-safety a compile-time dalla versione 8. Tuttavia, per rimanere compatibile con le versioni precedenti del linguaggio, è possibile attivare la funzionalità su uno specifico progetto o anche solo su un file.[4]
Nel linguaggio Dart la null safety è implementata dalla versione 2.0, da agosto 2018.[5][6]
Altri linguaggi che usano tipi null-safe di default includono Kotlin sviluppato da JetBrains,[7] Rust,[8] e Swift prodotto da Apple.