Ответ 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.