3

我有一个似乎存在缓冲区溢出风险的 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]);
…
}

在处理 carg1 之前不检查 argv[1] 的大小。这不应该引起警告吗?

4

2 回答 2

4

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

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

希望这可以帮助!

于 2013-02-11T17:10:59.387 回答
1

有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/

于 2017-03-13T16:30:01.810 回答