Файл подавления дезинфицирующего средства неопределенного поведения: не удалось проанализировать подавления
После компиляции приложения с помощью clang 3.6 с использованием -fsanitize=undefined я пытаюсь запустить инструментальную программу, используя файл подавления, чтобы игнорировать некоторые из ошибок:
UBSAN_OPTIONS="suppressions=ubsan.supp" ./app.exe
Файл подавления ubsan.supp содержит:
signed-integer-overflow:example.c
Это приводит к сообщению об ошибке:
UndefinedBehaviorSanitizer: failed to parse suppressions
То же самое происходит со сборкой gcc 4.9. Единственная документация, которую я могу найти, это http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html, которая предназначена для clang 3.9, в то время как я использую 3.6 (в которой нет документации по ubsan).
Кто-нибудь может предоставить рабочие примеры для файлов UBSAN подавления, которые работают в Clang 3.6?
Изменить: Просматривая исходный код UBSAN, я обнаружил, что единственным допустимым типом подавления может быть "vptr_check" - не знаю, какую версию я смотрел, хотя. Кто-нибудь может подтвердить, что в clang 3.9 доступно больше типов подавления?
1 ответ
Я не тратил время, чтобы выяснить, какие именно подавления были доступны в clang-3.6
, но похоже, что в clang-3.7
только vptr_check
доступно как подавление. Начиная в clang-3.8
список подавлений определяется как список проверок, плюс vptr_check
, В clang-3.9
доступные проверки:
- "Неопределенные"
- "ноль"
- "Криво-указатель использование"
- "Выравнивание"
- "Объект-размер"
- "Зарегистрирован целочисленное переполнение"
- "Беззнаковое целое число, переполнение"
- "Целочисленное деление на ноль"
- "Поплавкового деление на ноль"
- "Сдвиг-база"
- "Сдвиг-показатель"
- "оценка"
- "Недостижим"
- "вернуть"
- "Вл переплет"
- "Поплавок-CAST-перелив"
- "BOOL"
- "Перечисление"
- "Функция"
- "Возвращает-ненулевой-атрибут"
- "Ненулевой-атрибут"
- "Vptr"
- "CFI"
- "Vptr_check"
Я попробовал это, создав три файла, compile.sh
, main.cpp
а также suppressions.supp
как показано ниже. unsigned-integer-overflow
не является частью undefined
Вот почему это должно быть включено конкретно. Это работает на моей машине с Clang-3.9.
Итак, я думаю, больше типов подавления действительны в clang-3.9
,
# compile.sh
set -x
UBSAN_OPTIONS=suppressions=suppressions.supp:print_stacktrace=1 #:help=1
export UBSAN_OPTIONS
clang++-3.9 -g -std=c++11 -fsanitize=undefined -fno-omit-frame-pointer -fsanitize=unsigned-integer-overflow main.cpp
./a.out
// main.cpp
#include <bits/stdc++.h>
#include <bits/stl_tree.h>
using namespace std;
int main(int argc, char **argv) {
unsigned int k = UINT_MAX;
k += 1;
return 0;
}
# suppressions.supp
unsigned-integer-overflow:main.cpp