Безопасность пустых значений (также известная как безопасность пустых значений ) — это гарантия в объектно-ориентированном языке программирования , что ни одна ссылка на объект не будет иметь пустых или недействительных значений.
В объектно-ориентированных языках доступ к объектам осуществляется через ссылки (или, что эквивалентно, указатели ). Типичный вызов имеет вид:
хф(а, ...)
где f обозначает операцию, а x обозначает ссылку на некоторый объект. Однако во время выполнения ссылка может быть void (или null ). В таких случаях вызов выше будет void call , что приведет к исключению времени выполнения , часто приводящему к ненормальному завершению программы.
Безопасность Void — это статическая (во время компиляции) гарантия того, что вызов void никогда не возникнет.
В своем выступлении в 2009 году Тони Хоар проследил связь изобретения нулевого указателя с его разработкой языка ALGOL W и назвал это «ошибкой»:
Я называю это своей ошибкой на миллиард долларов. Это было изобретение нулевой ссылки в 1965 году. В то время я проектировал первую всеобъемлющую систему типов для ссылок в объектно-ориентированном языке (ALGOL W). Моей целью было гарантировать, что все использование ссылок должно быть абсолютно безопасным, с проверкой, выполняемой автоматически компилятором. Но я не мог устоять перед искушением ввести нулевую ссылку, просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и сбоям системы, которые, вероятно, нанесли миллиард долларов боли и ущерба за последние сорок лет. [1]
Бертран Мейер ввел термин «пустотная безопасность». [2]
Ранней попыткой гарантировать безопасность пустоты стала разработка языка программирования Self .
Язык Eiffel является void-безопасным в соответствии со стандартом ISO - ECMA ; механизм void-безопасности реализован в EiffelStudio , начиная с версии 6.1, и использует современный синтаксис, начиная с версии 6.4.
Язык Spec#, исследовательский язык от Microsoft Research, имеет понятие "необнуляемого типа", направленное на безопасность void. Язык F# , функционально-первый язык от Microsoft Research, работающий на .NET Framework, является void-безопасным, за исключением случаев взаимодействия с другими языками .NET. [3]
С 2011 года несколько языков поддерживают типы объединения и типы пересечения , которые можно использовать для обнаружения возможных нулевых указателей во время компиляции, используя специальный класс Null, значение которого null является его уникальным экземпляром.
Безопасность null, основанная на типах, впервые появилась в Ceylon , а вскоре за ней последовал TypeScript .
Язык C# реализует проверку безопасности null во время компиляции, начиная с версии 8. Однако для обеспечения совместимости со старыми версиями языка эта функция включается отдельно для каждого проекта или файла. [4]
Язык Dart от Google реализует его с версии 2.0, в августе 2018 года [5] [6]
Другие языки, которые по умолчанию используют типы, безопасные для значений null, включают Kotlin от JetBrains , [7] Rust , [8] и Swift от Apple .