Запуск 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#runtime-suppressions
и из https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks
-fsanitize = implicit-integer-sign-change: неявное преобразование между целочисленными типами, если это меняет знак значения. То есть, если
исходное значение было отрицательным, а новое значение положительным (или
ноль), или исходное значение было положительным, а новое значение
отрицательный. Проблемы, обнаруженные этим дезинфицирующим средством, не являются неопределенным поведением,
но часто непреднамеренно.
Согласно этой самой документации, которую вы читаете, вы подавляете сообщения UBSan, используя следующий шаг:
Отключение Инструментовки
with__attribute __ ((no_sanitize ( «не определено»))) ¶Вы отключаете проверки UBSan для определенных функций
с__attribute__((no_sanitize("undefined"))).
Вы можете использовать все значения
-fsanitize = флаг в этом атрибуте, например если ваша функция
намеренно содержит возможные целочисленные переполнения со знаком, вы можете
use__attribute __ ((no_sanitize ( «знаково-целочисленное переполнение»))).Этот атрибут может не поддерживаться другими компиляторами, поэтому рассмотрим
используя его вместе с #ifdefined (лязг).
Итак, что вы должны сделать, это: проверить документацию на той же странице на предмет того, что вы хотите подавить, и связать ее с 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
Других решений пока нет …