Как заставить g ++ отказаться от любого кода, который демонстрирует неопределенное поведение? - PullRequest
4 голосов
/ 20 декабря 2011

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

Например, reinterpret_cast<A*>(someIntPtr)->aMember без какого-либо контекста времени выполнения undefined (a), тогда как int i = bar(); i /= i; может привести к неопределенномуповедение (b) в зависимости от оценки времени выполнения bar() (которая может вернуть ноль).
Я ожидаю, что будут выявляться только случаи (a), но не обязательно случаи (b).

Ответы [ 4 ]

7 голосов
/ 20 декабря 2011

Я не уверен, что ваша цель достижима в вычислительном отношении.

Однако вы будете достаточно близко приближены к -Wall -Wextra -Werror;посмотрите другие варианты предупреждений, чтобы узнать, что еще вы хотите включить.

6 голосов
/ 20 декабря 2011

Невозможно. Есть много, много случаев UB, которые не обнаруживаются. Возможно, это причина , почему они UB, а точнее , потому что невозможно поймать эти проблемы во время компиляции.

Некоторые примеры:

  • int n = 0; std::cin >> n; ++n; Переполнение со знаком - UB. (Пример значения -зависимого UB.)

  • double d = std::sin(some_user_value); int n = d; UB, если d не может быть представлен как int. (То же самое.)

  • скомпилировать несколько единиц перевода с различными определениями классов, видимыми для каждого. (Пример UB из-за ограничений модели компиляции.)

  • любое состояние гонки по определению UB. (Пример UB, связанный с моделью памяти.)

  • неправильное использование функций с переменным числом. (Пример UB из-за системы типов.)

1 голос
/ 20 декабря 2011

Вы не можете и не должны полагаться на то, что компилятор укажет для вас UB.

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

1 голос
/ 20 декабря 2011

Вы можете использовать инструменты статического анализа кода, аналогичные классическим lint. Возможно, у вас уже есть cppcheck .

...