【问题标题】:Catching type conversion overflows using gcc使用 gcc 捕获类型转换溢出
【发布时间】:2016-12-04 14:24:45
【问题描述】:

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

内置函数:bool __builtin_add_overflow(type1 a, type2 b, type3 *res)

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

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

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

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

【问题讨论】:

  • 有没有机会你可以简单地使用UBSan

标签: c gcc overflow instrumentation ubsan


【解决方案1】:

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

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

【讨论】:

  • 我不知道 UBSan,完全符合我的需要。但是它将如何报告一个简单的 c 实现呢?
  • “但是它将如何报告一个简单的 c 实现” - 你的意思是你想检测像引导加载程序这样的裸机程序中的溢出吗?在这种情况下,您需要自己提供 UBSan 回调的实现并将其链接到您的应用程序中。这已经为Linux kernel 完成了,所以这是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多