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

Большинство из моих -fsanitize=unsigned-integer-overflow ошибки - это ошибки, но иногда я явно использую их по назначению, в результате чего UBSan дает ложные срабатывания.

Есть ли способ отключить проверку без переполнения целых чисел в UBS для определенного выражения?

РЕДАКТИРОВАТЬ в ответ на комментарий Shafik, вот пример:

unsigned a = 0;
unsigned b = a - 1; // error: unsigned integer overflow

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

РЕДАКТИРОВАТЬ 2: чтобы включить проверку необходимо пройти либо -fsanitize=integer (чтобы включить все целочисленные проверки) или fsanitize=unsigned-integer-overflow, Из комментариев ниже кажется, что проверка доступна только в Clang, но еще не в GCC.

2 ответа

Решение

Если вы хотите обернуть операцию в функцию, вы можете использовать __attribute__((no_sanitize("integer"))) вот так ( посмотреть вживую):

__attribute__((no_sanitize("integer")))
unsigned calc( unsigned a )
{
    return a - 1 ;
}

Я нашел это с помощью отчета об ошибке / поддержки функции подавления поддержки UbSAN.

Документация clang по атрибутам не указывает никакого способа применить это, кроме как к функции:

Используйте атрибут no_sanitize в объявлении функции, чтобы указать, что конкретный инструментарий или набор инструментариев не должны применяться к этой функции. Атрибут принимает список строковых литералов, которые имеют то же значение, что и значения, принимаемые флагом -fno-sanitize =. Например, атрибут((no_sanitize("address", "thread"))) указывает, что AddressSanitizer и ThreadSanitizer не должны применяться к функции.

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

auto b = ~a;
auto c = ~a - 5;
Другие вопросы по тегам