gcc-4.9 неопределенное дезинфицирующее средство для поведения

В изменения в gcc-4.9 это говорит:

UndefinedBehaviorSanitizer (ubsan), быстрое неопределенное поведение
детектор, был добавлен и может быть включен через -fsanitize = undefined.
Различные вычисления будут использованы для обнаружения неопределенного поведения
во время выполнения. UndefinedBehaviorSanitizer в настоящее время доступен для
Языки C и C ++.

Я посмотрел на этот вопрос (Реализация C ++, которая обнаруживает неопределенное поведение?) но это кажется довольно устаревшим.

Эта ссылка (http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html) имеет некоторую информацию, но ему уже несколько месяцев.

Это попытка добавить Undefined Behavior Sanitizer в GCC.
Обратите внимание, что это очень альфа-версия; до сих пор это не так много, в
момент, когда он должен обрабатывать деление на ноль, INT_MIN / -1 и
различные случаи сдвига (сдвиг на отрицательное значение, сдвиг при
второй операнд> = чем TYPE_PRECISION (first_operand) и тому подобное.
(На целочисленных типах, пока.)

Из того, что я прочитал, оно портируется на gcc от LLVM,

Я попробовал это с (5 / 0) и единственная разница, кажется, заключается в следующем:

main.cpp:5:19: runtime error: division by zero

У кого-нибудь есть какая-либо информация об этом или какие функции он имеет?

32

Решение

Это скорее основа для добавления таких проверок, чем попытка обнаружить все формы неопределенного поведения (что почти наверняка невозможно в смысле «остановки проблемы»).

Документация GCC перечисляет их как поддерживаемые в настоящее время проверки:

-fsanitize=undefined
Включите UndefinedBehaviorSanitizer, быстрый детектор неопределенного поведения. Различные вычисления будут инструментированы
обнаружить неопределенное поведение во время выполнения. Текущие подопции:

-fsanitize=shift Эта опция позволяет проверить, что результат операции сдвига не является неопределенным. Обратите внимание, что именно считается
undefined незначительно отличается между C и C ++, а также между ISO
С90 и С99 и т. Д.

-fsanitize=integer-divide-by-zero Определить целочисленное деление на ноль, а также деление INT_MIN / -1.

-fsanitize=unreachable С помощью этой опции компилятор превратит вызов __builtin_unreachable в вызов диагностического сообщения. При достижении вызова __builtin_unreachable поведение
не определено.

-fsanitize=vla-bound Эта опция указывает компилятору проверять, является ли размер массива переменной длины положительным. Эта опция не
иметь эффект в режиме -std = c ++ 1y, так как стандарт требует
исключение будет выброшено вместо.

-fsanitize=null Эта опция включает проверку указателя. В частности, приложение, созданное с этой опцией, выдаст ошибку
сообщение, когда он пытается разыменовать нулевой указатель, или если ссылка
(возможно, ссылка на значение) привязывается к нулевому указателю.

-fsanitize=return Эта опция включает проверку оператора возврата. Программы, созданные с включенной этой опцией, выдадут сообщение об ошибке
когда конец непустой функции достигается без
возвращая значение Эта опция работает только в C ++.

-fsanitize=signed-integer-overflow Эта опция включает проверку целочисленного переполнения со знаком. Проверяем, что результат +, *, и оба одинарные
и двоичный — не переполняется в подписанной арифметике. Заметка,
целочисленные правила продвижения должны быть приняты во внимание. Это
следующее не является переполнением:

signed char a = SCHAR_MAX;
a++;

В то время как -ftrapv вызывает прерывания для подписанных переполнений, -fsanitize=undefined выдает диагностическое сообщение. это
в настоящее время работает только для семейства языков C.

40

Другие решения

Полный список опций, перечисленных в UndefinedBehaviorSanitizer

Последние дополнения GCC 5.0 извлечены из Серия GCC 5 Release: изменения, новые функции и исправления перечислено ниже;

UndefinedBehaviorSanitizer получил несколько новых параметров очистки:

-fsanitize=float-divide-by-zero: detect floating-point division by zero;
-fsanitize=float-cast-overflow: check that the result of floating-point type to integer conversions do not overflow;
-fsanitize=bounds: enable instrumentation of array bounds and detect out-of-bounds accesses;
-fsanitize=alignment: enable alignment checking, detect various misaligned objects;
-fsanitize=object-size: enable object size checking, detect various out-of-bounds accesses.
-fsanitize=vptr: enable checking of C++ member function calls, member accesses and some conversions between pointers to base and derived classes, detect if the referenced object does not have the correct dynamic type.
1

По вопросам рекламы [email protected]