Большинство из моих -fsanitize=unsigned-integer-overflow
ошибки — это ошибки, но иногда я явно использую их по назначению, в результате чего UBSan дает ложные срабатывания.
Есть ли способ отключить проверку без переполнения целых чисел в UBSan для определенного выражения?
РЕДАКТИРОВАТЬ в ответ на комментарий Shafik, вот пример:
unsigned a = 0;
unsigned b = a - 1; // error: unsigned integer overflow
В большинстве случаев это ошибка, иногда нет. С UBSan каждый раз можно найти, исправить ошибки, но я не нашел способа заглушить ложные срабатывания.
РЕДАКТИРОВАТЬ 2: чтобы включить проверку необходимо пройти либо -fsanitize=integer
(чтобы включить все целочисленные проверки) или fsanitize=unsigned-integer-overflow
, Из комментариев ниже кажется, что проверка доступна только в Clang, но еще не в GCC.
Если вы хотите обернуть операцию в функцию, вы можете использовать __attribute__((no_sanitize("integer")))
вот так (увидеть это в прямом эфире):
__attribute__((no_sanitize("integer")))
unsigned calc( unsigned a )
{
return a - 1 ;
}
Я нашел это через отчет об ошибке / запрос функции Поддержка подавления UbSAN.
Лязг документация по атрибутам не указывает какой-либо способ применить это, кроме как к функции:
Используйте атрибут no_sanitize в объявлении функции, чтобы указать, что конкретный инструментарий или набор инструментариев не должны применяться к этой функции. Атрибут принимает список строковых литералов, которые имеют то же значение, что и значения, принимаемые флагом -fno-sanitize =. Например, атрибут((no_sanitize («address», «thread»))) указывает, что AddressSanitizer и ThreadSanitizer не должны применяться к функции.
Использование побитового оператора NOT, кажется, исправляет предполагаемую ошибку времени выполнения.
auto b = ~a;
auto c = ~a - 5;