C++ clang UBsan имя флага подавления

Запуск gzip.hpp код от Boost версии 1.64 с убсаном clang выдает следующее сообщение:

path/to/boost/1_64_0/include/boost/iostreams/filter/gzip.hpp:674:16: runtime error: implicit conversion from type 'int' of value 139 (32-bit, signed) to type 'char' changed the value to -117 (8-bit, signed)
    #0 0x7fed40b77bc2 in boost::iostreams::basic_gzip_compressor<std::allocator<char> >::basic_gzip_compressor(boost::iostreams::gzip_params const&, long)

Я хотел бы подавить это с помощью файла подавления. Для других предупреждений это сработало:

 unsigned-integer-overflow:path/to/boost/*

В этом случае я ожидаю, что это должно работать

implicit-integer-sign-change:/lfs/vlsi/tools/boost/*

но это дает во время выполнения

UndefinedBehaviorSanitizer: failed to parse suppressions

Каково правильное название этого флага sanatizer?

Смотрите также: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

и из https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

-fsanitize=implicit-integer-sign-change: неявное преобразование между целочисленными типами, если это меняет знак значения. То есть, если исходное значение было отрицательным, а новое значение положительным (или нулевым), или исходное значение было положительным, а новое значение отрицательным. Проблемы, обнаруживаемые этим дезинфицирующим средством, не являются неопределенным поведением, но часто непреднамеренными.

1 ответ

Мне помогли в списке рассылки llvm cfe-dev

TLDR: имя типа предупреждения не implicit-integer-sign-change но вместо этого implicit-integer-truncation который может быть подавлен, как и ожидалось. Название типа ошибки можно узнать с помощью export UBSAN_OPTIONS=report_error_type=1,

Согласно этой самой документации, которую вы читаете, вы подавляете сообщения UBSan, используя следующий шаг:

Отключение инструментовки с помощью __attribute__((no_sanitize("undefined")))¶

Вы отключаете проверки UBSan для определенных функций с __attribute__((no_sanitize("undefined"))). Вы можете использовать все значения -fsanitize= flag в этом атрибуте, например, если ваша функция намеренно содержит возможное целочисленное переполнение со знаком, вы можете использовать __attribute__((no_sanitize("sign-integer-overflow"))).

Этот атрибут может не поддерживаться другими компиляторами, поэтому рассмотрите возможность его использования вместе с #ifdefined (clang).

Итак, что вы должны сделать, это: проверить документацию на той же странице на предмет того, что вы хотите подавить, и связать ее с use__attribute__((no_sanitize("here_goes_checks_you_want_to_suppress"))). или же use__attribute__((no_sanitize("undefined"))). отключить UBSan вообще.

Помимо этого, кажется, что UBSan создает переполнение целых чисел SIGNED, и вы пытаетесь подавить переполнение целых чисел UNSIGNED.

ССЫЛКИ: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

Другие вопросы по тегам