2013-12-23 1 views
32

В gcc-4.9 changes он говорит:НКУ-4,9 Неопределенное поведение дезинфицирующее

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

Я рассмотрел этот вопрос (A C++ implementation that detects undefined behavior?), но он выглядит довольно устаревшим.

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

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

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

Я пробовал с (5/0) и той лишь разницей, похоже, этот выход:

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

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

+0

Похоже, много наземной работы для этой работы должны были бы быть сделано для того, чтобы поддержать [обнаруживать неопределенное поведение в постоянной выражения] (http://stackoverflow.com/questions/21319413/why-do-constant-expressions-have-an-exclusion-for-undefined-behavior). –

ответ

40

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

В GCC documentation перечислена это, как в настоящее время поддерживаемых проверки:

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

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

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

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

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

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

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

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

signed char a = SCHAR_MAX; 
a++; 

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

+0

кажется, что этот текст исчез с страницы документации (по состоянию на 2016-01), любая идея, что случилось? –

+0

@IgorSkochinsky: Спасибо. Я установил ссылку на что-то (возможно) более постоянное. Теперь текст не совсем соответствует моему отрывку, но у меня нет времени исправить его на данный момент ... – Nemo

+1

Выполняет ли '-fsanitize = undefined' сам все эти подпараметры или мне также нужно их передать? – DBedrenko

1

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

Последних GCC 5.0 добавлений, извлеченных из GCC 5 Release Series : Changes, New Features, and Fixes перечисленных ниже;

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. 
Смежные вопросы