为什么一些静态分析工具不报告潜在的缓冲区溢出?

问题描述:

我有一个strcpy命令的例子,似乎是缓冲区溢出的风险,但PVS-Studio不会引发警告。在我的示例中,strcpy用于将命令行参数复制到缓冲区中,而不检查命令行参数的大小。如果参数超过缓冲区的大小,这可能会导致缓冲区溢出。为什么一些静态分析工具不报告潜在的缓冲区溢出?

代码例如:

char carg1[13]; 
int main(int argc, char* argv[]) 
{ 
// Get name from the 1st command line arg 
     strcpy(carg1, argv[1]); 
… 
} 

的argv的大小[1]为应对成carg1之前不作检查。这不应该引发警告吗?

从理论上讲,构建一个完美的静态分析工具是不可能的(这从结果中可以看出,像暂停问题的不确定性)。因此,所有的静态分析工具都是最好的启发式方法,可以尝试检测某些类别的错误,即使这样也不一定能检测到所有这些错误。

所以是的,你得到的代码看起来像它有一个潜在的缓冲区溢出。我真的不知道为什么这个特定的工具无法检测到这个错误,但我的猜测是分析仪由于某种原因使用的内部启发式方法未能检测到它。

希望这会有所帮助!

+0

实际上,它_is_可以构建一个工具,检测程序中所有可能的错误。只需以非常令人失望的方式简单地将所有指示标记为可能存在问题的指示符合该法案。 你不能写的是一个既正确又完整的分析仪,即。只检测真正的错误,只有那些。为了克服这种不可能性,静态分析器在正确的标记(标记所有可能的错误,但是在一些代码上发出潜在的大量虚假警报)或不健全(即,缺少一些错误)之间作出选择。第二类更广泛。 – byako 2013-02-12 23:13:58

+0

@ BorisYakobowski-绝对。我是在健全的假设下运作的,这在回想起来可能不是很好。感谢您的补充! – templatetypedef 2013-02-13 00:21:26

有3个事实:

1)如果你使用Visual C++编译器,那么你将收到编译器警告4996.

1> robust.cpp(529):警告C4996: 'strcpy的':这函数或变量可能不安全。考虑使用strcpy_s代替。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。 1)> C:\ Program Files文件(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ string.h(110):参见'strcpy'声明

2)PVS-Studio最初只使用Visual Studio。

3)PVS-Studio策略是实现不是重复编译器警告的诊断规则。

因此,PVS不检查已经被Microsoft编译器检查了很长一段时间(来自VS2005)的情况是合乎逻辑的。

更新时间: 最后PVS实现这样的诊断规则: https://www.viva64.com/en/w/V755/print/