捕获类型转换使用gcc溢出

时间:2016-12-04 14:24:45

标签: c gcc overflow instrumentation ubsan

我有一个遗留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已经可以instrument functions,因为可追溯性和分析,所以这个概念并不奇怪。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

GCC将这些函数降低到有效的asm序列,因此它们不存在于最终目标代码中。另一方面,当在UBSan mode中编译时,GCC将在溢出时调用来自libubsan.so的专用回调。你可以在你的可执行文件中覆盖这些回调并进行必要的处理(这当然是非常hacky)。

请注意,GCC仅跟踪签名号码的溢出,因为标准定义了无符号溢出。