9

我正在使用一个大型 C 库,其中一些数组索引是使用int. 我需要找到一种在运行时捕获整数溢出的方法,以便缩小到有问题的代码行。Libc 手册指出:

FPE_INTOVF_TRAP 整数溢出(在 C 程序中不可能,除非您以特定于硬件的方式启用溢出捕获)。

但是 gcc 选项-ffpe-trap表明这些仅适用于 FP 号码?
那么如何启用整数溢出陷阱呢?我的系统是 Xeon/Core2, gcc-4.x, Linux 2.6

我查看了类似的问题,但它们都归结为修改代码。但是,我首先需要知道哪个代码有问题。
如果 Xeons 不能捕获溢出,哪些处理器可以?我也可以使用非 emt64 机器。

同时,我发现了一个为 llvm 设计的工具: http ://embed.cs.utah.edu/ioc/ 但是似乎没有 gcc/icc 的等价物?

4

4 回答 4

3

好吧,我可能不得不回答我自己的问题。

我发现 gcc 有-ftrapv选项,快速测试确实确认至少在我的系统溢出被困。随着我了解更多,我将发布更详细的信息,因为它似乎非常有用。

于 2012-04-17T23:59:04.837 回答
2

当然,无符号整数运算不会溢出。

使用有符号整数算术,溢出会导致未定义的行为;什么事情都可能发生。优化器正在积极优化溢出的东西。所以,你最好的选择是避免溢出,而不是在它发生时捕获它。考虑使用 CERT的“安全整数库”(那里引用的 URL 似乎已经 AWOL/404;我不确定发生了什么)或 Google 的“安全整数操作”库。

如果您必须捕获溢出,您将需要指定您感兴趣的平台(O/S 包括版本,编译器包括版本),因为答案将非常特定于平台。

于 2012-04-17T23:16:23.920 回答
2

你知道溢出发生在哪一行吗?如果是这样,如果有问题的操作导致溢出,您也许可以查看汇编程序的进位标志。这是 CPU 用于进行大量计算的标志,虽然在 C 级别不可用,但可能会帮助您调试问题 - 或者至少让您有机会做某事。

顺便说一句,找到了这个关于整数陷阱的 gcc (-ftrapv) 链接。可能是您正在寻找的。

于 2012-04-17T23:26:40.453 回答
0

您可以在 gcc 中使用内联汇编程序来使用可能会产生溢出的指令,然后测试溢出标志以查看它是否确实如此:

int addo(int a, int b)
{
    asm goto("add %0,%1; jo %l[overflow]" : : "r"(a), "r"(b) : "cc" : overflow);
    return a+b;
overflow:
    return 0;
}

在这种情况下,它会尝试添加aand b,如果添加了,它将转到overflow标签。如果没有溢出,它会继续,再次添加并返回它。

这遇到了 GCC 限制,即内联 asm 块既不能输出值,也不能输出分支——如果不是这样,你就不需要第二次添加来实际获得结果。

于 2012-04-17T23:47:59.967 回答