В изменения в 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
У кого-нибудь есть какая-либо информация об этом или какие функции он имеет?
Это скорее основа для добавления таких проверок, чем попытка обнаружить все формы неопределенного поведения (что почти наверняка невозможно в смысле «остановки проблемы»).
Документация 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.
Полный список опций, перечисленных в 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.