Должно ли это использование nullptr вызвать ошибку компилятора? - PullRequest
1 голос
/ 28 января 2011

Есть ли веская причина, по которой этот код компилируется без предупреждения (и вылетает при запуске) с Visual C ++ 2010:

int a = *((int*)nullptr);

Статический анализ должен сделать вывод, что он будет аварийно завершать, верно?

Ответы [ 2 ]

6 голосов
/ 28 января 2011

Должно ли это использование nullptr вызвать ошибку компилятора?

номер

Разыменование нулевого указателя приводит к неопределенному поведению, но диагностика не требуется.

Статический анализ должен заключить, что он потерпит крах, верно?

Может. Это не обязательно. Было бы неплохо, если бы было сделано предупреждение. Специальный инструмент статического анализа (например, Klocwork), вероятно, выдаст предупреждение.

3 голосов
/ 28 января 2011

Да, статический анализ показал бы, что это всегда приводит к сбою. Однако для этого потребуется, чтобы компилятор фактически выполнил этот статический анализ. Большинство компиляторов этого не делают (по крайней мере, никто из них не знает).

Поэтому вопрос таков: почему компиляторы C / C ++ не выполняют больше статической проверки типов.

Причина, по которой компилятор этого не делает, заключается в основном в традициях и философии, позволяющей сделать компилятор максимально простым.

C (и в меньшей степени C ++) были созданы в среде, где вычислительная мощность была довольно дорогой, и где была важна простота написания компилятора (потому что было много разных архитектур HW).

Поскольку статический анализ проверки типов усложнит написание компилятора и замедлит его компиляцию, в то время он не считался приоритетным. Таким образом, большинство компиляторов не имеют его.

Другие языки (например, Java) делают различные компромиссы, и поэтому в Java многие вещи недопустимы, что разрешено в C (например, недоступный код является ошибкой времени компиляции в Java; в C большинство компиляторов даже не предупреждают). Это действительно сводится к философии.

Кстати, обратите внимание, что вы можете получить статическую проверку типов в C, если хотите, - доступно несколько инструментов, например, lint (древний) или см. Какие инструменты статического анализа C ++ с открытым исходным кодом доступны? .

...