LINUX.ORG.RU

История изменений

Исправление 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 никак.