История изменений
Исправление hateyoufeel, (текущая версия) :
Вариантов, на самом деле, до жопы.
Вариант раз: вместо NULL из функций типа malloc() можно возвращать optional<void*>
. Сишникам тут, конечно, жопы порвёт от необходимости в параметрическом полиморфизме в языке, но им не привыкать к жопной боли.
Вариант два: сделать NULL валидным адресом и замапить куда-нибудь в vDSO или около. При попытке доступа кидать исключение. Нет, не SIGSEGV, а исключение. Сишникам тут опять жопы порвёт, потому что нужно добавить исключения в язык, но им опять же не привыкать.
Бонус: убрать нахрен всё что касается UB вокруг NULL из языка (да и всё остальное UB тоже). Для оптимизаций это не нужно, если конечно не считать удаление проверки на NULL оптимизацией. Аналогично сделать с доступом к неинициализированным переменным: это не должно быть UB никак.
Все эти идеи можно комбинировать в различных формах.
Исходная версия hateyoufeel, :
Вариантов, на самом деле, до жопы.
Вариант раз: вместо NULL из функций типа malloc() можно возвращать optional<void*>
. Сишникам тут, конечно, жопы порвёт от необходимости в параметрическом полиморфизме в языке, но им не привыкать к жопной боли.
Вариант два: сделать NULL валидным адресом и замапить куда-нибудь в vDSO или около. При попытке доступа кидать исключение. Нет, не SIGSEGV, а исключение. Сишникам тут опять жопы порвёт, потому что нужно добавить исключения в язык, но им опять же не привыкать.
Бонус: убрать нахрен всё что касается UB вокруг NULL из языка (да и всё остальное UB тоже). Для оптимизаций это не нужно, если конечно не считать удаление проверки на NULL оптимизацией. Аналогично сделать с доступом к неинициализированным переменным: это не должно быть UB никак.