Перехват переполнения при использовании gcc

У меня есть устаревший c проект со многими преобразованиями типов и кастингами. Обычно, чтобы проверить динамическое поведение переполнения, gcc (и C lang) определяет встроенную функцию для этого:

Встроенная функция: bool __builtin_add_overflow (type1 a, type2 b, type3 *res)

Если результат переполняется, функция возвращает true. Тогда моя программа может поймать это условие и действовать соответственно.

Для того, чтобы иметь такую ​​же функциональность без изменения какого-либо унаследованного кода, возможно ли дать gcc команду использовать такие встроенные функции и вызывать предоставленную функцию как перехватчик, если встроенные функции возвращают значение true? Я хотел бы найти что-то вроде:

void _cyg_add_overflow_catcher (A, B, __FILE, LINE);

GCC уже может инструментальные функции для отслеживания и профилирования, так что концепция не странная. Есть идеи?

1 ответ

Решение

Эти функции понижены GCC до эффективных последовательностей asm, поэтому они не присутствуют в конечном объектном коде. С другой стороны, при компиляции в режиме UBSan GCC будет вызывать выделенные обратные вызовы из libubsan.so при переполнении. Вы можете переопределить эти обратные вызовы в вашем исполняемом файле и выполнить необходимую обработку (это, конечно, довольно странно).

Обратите внимание, что GCC отслеживает переполнения только для чисел со знаком, так как переполнения без знака определены Стандартом.

Другие вопросы по тегам