Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Почему компиляторы не сообщают о неопределенном поведении

Неопределенное поведение, мягко говоря, неоднозначное решение в дизайне языка. Тем не менее с этим злом приходится жить миллионам программистам. В стандарте, ситуации в которых возникает неопределенное поведение, описаны очень тяжелым техно языком. Неудивительно что большое количество программистов, да что там основная масса, просто не читали стандарт, а если и читали то одну половину не поняли, а вторую забыли.
Самое страшное не столько в том, что неопредленное поведение вообще допускается стандартом или что оно достаточно широко распространено. А в том, что в жизни рядовой программист плохо понимает когда оно вообще возникает. Тем более разочаровывает то, что разработчики компиляторов не стремятся помочь своему клиенту рядовому программисту хотя могли бы, христоматийный пример:
int i = 0; i = ++i + i++;
Вот этот код мой MSVC съедает молча. Есть еще не мало ситуаций когда компилятор мог бы предупредить программиста.


Ответ

Почему не сообщают? Потому что не обязаны. Тем не менее некоторые компиляторы могут сообщать о некоторых ситуациях, которые могут приводить к неопределённому поведению. Так, если собрать код из вопроса с помощью GCC или clang, Вы получите предупреждение. Есть и другие ситуации, которые покрыты компиляторами, но не все.
Для других ситуаций существуют всевозможные статические анализаторы, типа того же PVS Studio, clang-tidy (встроен в CLion & Resharper++) и прочих.

Комментариев нет:

Отправить комментарий