如何在C程序中找到(全部)整数溢出?

Chr*_*isM 15 c debugging overflow

我正在开发一个通常工作得很好的大型项目,但是一旦输入数据大小超出某些限制就会出现严重问题.

这些问题(怀疑)只是由于有符号的整数溢出,如下所示:

int a, o;
// Initialize a and o
int x = (a+o) >> 1);
Run Code Online (Sandbox Code Playgroud)

显然,一旦a和o的总和溢出(大于2 ^ 31-1),x就不再是a和o的平均值.

是否有一种通用的方法来查找正在运行的程序中的所有这些整数溢出?

我正在考虑像Valgrind或GDB扩展的工具,它在每个整数算术指令处中断,获取参数并将正确的结果(使用较大的数据类型或任意精度算术计算)与实际结果进行比较.如果结果不同,它应该输出警告,触发调试中断或类似的事情.

我知道,如何检查单个算术指令是否有溢出(例如检查符号的添加),但是由于代码量很大,对于我来说,通过整个项目并手动插入检查代码并不是一个可行的解决方案. .

Vik*_*exe 3

对于大型代码库来说,Coverity是一个很好的工具。我不确定它all是否会检测到整数溢出,但值得一试。