我正在开发一个大型项目,一般情况下工作正常,但是一旦输入数据超出某些限制,就会出现严重问题。
这些问题(疑似)只是由于带符号整数溢出引起的,例如:
int a, o;
// Initialize a and o
int x = (a+o) >> 1);
显然,一旦a和o的总和溢出(大于2^31-1),x就不再是a和o的平均值。
有没有通用的方法可以在运行中的程序中找到所有这些整数溢出?
我考虑使用像Valgrind或GDB扩展这样的工具,在每个整数算术指令处断点,获取参数并将正确结果(使用更大的数据类型或任意精度算术计算)与实际结果进行比较。如果结果不同,它应该输出警告,触发调试中断或类似操作。
我知道如何检查单个算术指令是否溢出(例如检查加法的符号),但由于代码量巨大,手动在整个项目中插入检查代码并不可行。
-ftrapv
的“通常实际上不执行任何操作”警告只适用于使用优化编译的情况。使用-O0
时,它应该可以正常工作。 - caf