我有一个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之前,不会检查argv1的大小。这难道不应该引起一个警告吗?
发布于 2013-02-12 01:10:59
从理论上讲,构建一个完美的静态分析工具是不可能的(这是从停顿问题的不可判断性这样的结果得出的)。因此,所有静态分析工具充其量都是启发式的,可以尝试检测某些类别的错误,即使这样也不一定能检测到所有这些错误。
所以,是的,上面的代码看起来有一个潜在的缓冲区溢出。老实说,我不知道为什么这个特定的工具不能检测到错误,但我猜分析器出于某种原因使用的内部启发式方法无法检测到它。
希望这能有所帮助!
发布于 2017-03-14 00:30:02
这里有3个事实:
1)如果你使用Visual C++编译器,那么你将收到编译器警告4996。
1>robust.cpp(529):警告C4996:'strcpy':此函数或变量可能不安全。考虑改用strcpy_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助。1> C:\Program Files (x86)\Microsoft Visual Studio11.0\VC\include\String.h(110):请参见'strcpy‘的声明
2) PVS-Studio最初仅适用于Visual Studio。
3) PVS-Studio策略是实现不重复编译器警告的诊断规则。
因此,PVS不检查大小写似乎是合乎逻辑的,因为微软编译器已经检查了很长一段时间(来自VS2005)。
更新:最终实现了这样的诊断规则:https://www.viva64.com/en/w/V755/print/
https://stackoverflow.com/questions/14817075
复制相似问题