我正在使用一个大型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的等价物?
答案 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;
}
在这种情况下,它会尝试添加a
和b
,如果是,则会转到overflow
标签。如果没有溢出,它会继续,再次执行添加并返回它。
这会遇到GCC限制,即内联asm块不能同时输出值和分支 - 如果不是这样,则不需要第二次添加来实际获得结果。