C ++ clang UBsan имя флага подавления - PullRequest
0 голосов
/ 25 ноября 2018

Запуск кода gzip.hpp из boost версии 1.64 с помощью ubsan 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#runtime-suppressions

и от https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks

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

Ответы [ 2 ]

0 голосов
/ 28 января 2019

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

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

0 голосов
/ 25 ноября 2018

Согласно этой самой документации, которую вы читаете, вы подавляете сообщения 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.

LINKS: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

...