Как подавить некоторые ошибки без знака целочисленного переполнения из UBsan?

Большинство из моих -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.

5

Решение

Если вы хотите обернуть операцию в функцию, вы можете использовать __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 не должны применяться к функции.

9

Другие решения

Использование побитового оператора NOT, кажется, исправляет предполагаемую ошибку времени выполнения.

auto b = ~a;
auto c = ~a - 5;
0

По вопросам рекламы [email protected]