我在C++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字0-9只出现一次.该方案在循环值一和b,并且在每次跑了数字计数程序一,b和一个b以检查是否数字的条件感到满意.
然而,当可以产生伪解一个b溢出整数限制.我最终使用以下代码检查:
unsigned long b, c, c_test;
...
c_test=c*b; // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test; // No overflow
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来测试溢出?我知道有些芯片有一个内部标志,当溢出发生时会设置,但我从未见过通过C或C++访问它.
请注意,在C和C++中,签名 int溢出是未定义的行为,因此您必须在不实际导致它的情况下检测它.有关添加前的signed int overflow,请参阅在C/C++中检测带符号的溢出
除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?
我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.
由Carl Norum编辑,包括适当的标准参考.
C标准规定
如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.
是否有编译器开关可以保证整数溢出时的某些行为?我想避免鼻腔恶魔.特别是,我想强制编译器包装溢出.
为了唯一性,让标准为C99,编译器为gcc.但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣.事实上,只是为了惹恼C/C++人群,我甚至欣赏C++ 0x,C++ 03和C++ 98的答案.
注:国际标准ISO/IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提到过.
我正在使用一个大型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的等价物?