使用 gcc 捕获类型转换溢出

Catching type conversion overflows using gcc

我有一个遗留的 c 项目,其中包含许多类型转换和强制转换。通常为了检查溢出动态行为,gcc(和 C lang)为此定义了一个内置函数:

Built-in Function: bool __builtin_add_overflow (type1 a, type2 b, type3 *res)

如果结果溢出函数return为真。然后我的程序可能会捕捉到这种情况并采取相应的行动。

为了在不更改任何遗留代码的情况下拥有相同的功能,是否可以指示 gcc 使用此类内置函数并在内置函数 return 为真时调用提供的函数作为捕手?我希望我能找到类似的东西:

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

GCC 已经可以 instrument functions,用于可追溯性和分析,所以这个概念并不奇怪。 有什么想法吗?

这些函数被 GCC 降低为高效的 asm 序列,因此它们不会出现在最终目标代码中。另一方面,当在 UBSan mode 中编译时,GCC 将在溢出时从 libubsan.so 调用专用回调。您可以在您的可执行文件中重写这些回调并进行必要的处理(这当然很老套)。

请注意,GCC 仅跟踪 有符号 数字的溢出,因为无符号溢出由标准定义。