gcc 检查有符号数溢出
按照 C/C++ 标准,有符号数溢出的话,其行为是未定义的。但是常规的实现,处于性能考虑,并不检查这一点。
不过 gcc 还是有个参数,可以检查有符号数溢出:
-ftrapv
This option generates traps for signed overflow on addition, subtraction,
multiplication operations.
#include <limits.h> int main(int argc, char** argv) { int n = INT_MAX - 1; n += argc; return n + 10 * argc; }
32 位下 coredump abort,64 位下却没问题,反汇编了一下调的带检查的加法函数的
代码,发现内部居然用的 64 位寄存器,能检查出来才怪。
看来只能检查出32位的,64位的生成了检查代码,却没有检查出来,有点鸡肋。