Подтвердить что ты не робот

Gcc-4.9 Undefined Поведение Sanitizer

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

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

Я рассмотрел этот вопрос (С++-реализация, которая обнаруживает поведение undefined?), но выглядит довольно устаревшей.

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

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

Из того, что я прочитал, он портирован на gcc из LLVM.

Я пробовал его с помощью (5 / 0), и единственным отличием, похоже, является этот вывод:

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

Есть ли у кого-нибудь больше информации об этом или о том, что у него есть?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

signed char a = SCHAR_MAX;
a++;

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

Ответ 2

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

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

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.