检测整数溢出

时间:2012-04-17 23:03:43

标签: c debugging operating-system

我正在使用一个大型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 个答案:

答案 0 :(得分:3)

好的,我可能要回答我自己的问题。

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

答案 1 :(得分:2)

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

使用有符号整数运算,溢出会导致未定义的行为;什么事情都可能发生。优化器正在积极优化溢出的东西。因此,最好的办法是避免溢出,而不是在发生溢出时将其捕获。考虑使用CERT 'Secure Integer Library'(引用的网址似乎已经过了AWOL / 404;我不确定发生了什么)或Google的'Safe Integer Operation'库。

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

答案 2 :(得分:2)

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

BTW,找到了gcc(-ftrapv)的this链接,它描述了一个整数陷阱。可能就是你要找的东西。

答案 3 :(得分: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;
}

在这种情况下,它会尝试添加ab,如果是,则会转到overflow标签。如果没有溢出,它会继续,再次执行添加并返回它。

这会遇到GCC限制,即内联asm块不能同时输出值和分支 - 如果不是这样,则不需要第二次添加来实际获得结果。