visualstudio2013静态代码分析-它的可靠性如何

visual studio 2013 static code analysis - how reliable is it?

本文关键字:可靠性 静态 代码 visualstudio2013      更新时间:2023-10-16

我正在尝试探索VS2013中的静态代码分析选项。我在下面写了非常简单的代码

int main()
{
int a, b; //found unused variable 
std::cout << "Hello world!";
std::cin >> a;
int* i = new int; // analysis didn't find this memory leak 
//delete i;
//i = NULL;
}

当我对上面的块运行代码分析时,我希望它能找到int*I=new int并警告内存泄漏,但它没有找到但找到了未使用的变量b.

所以现在我有点困惑,内存泄漏是C/C++中最常见的错误;这个工具找不到这个。现在我的问题是,我们是否可以依赖这种分析?

环境:Windows 7,VS ultimate 2013。

这不是/analyze(又名PREfast)设计用来检测的代码问题。还有其他用于检测直接内存泄漏的常见工具,如CRT调试堆——请参阅MSDN。可以说,您应该首先使用像std::unique_ptr这样的C++11功能,并且永远不要让记住调用delete

#include <memory>
int main()
{
int a, b; //found unused variable 
std::cout << "Hello world!";
std::cin >> a;
auto i = std::make_unique<int>()
}

/analyze的目的是提供您从lint等产品中获得的一些"附加警告",但主要是通过SAL注释进行过程间缓冲区大小验证。

这就是它发现的错误:

void someFunction(char *buffer, size_t len)
{
...
}
void otherFunction()
{
char buff[128];
someFunction(buff, 256);
}

当您添加所需的SAL来传达指针和大小之间的关系时:

void someFunction(_Out_writes_(len) char *buffer, size_t len)

违反并导致缓冲区溢出的假设链真的很难找到,而不是太多内存泄漏。

/analyze的另一个有用功能是验证可变长度printf参数与格式字符串的对比:

void printf_debug( _In_z_ _Printf_format_string_ const char* format, ... )
{
...
}

void otherFunction()
{
unsigned long l;
std::wstring str;
std::string str2;
...
printf_debug( "%i %s %d", i, str.c_str(), str2.c_str());
}

VS 2015和VS 2017现在包含了一些以前只在VS 2013或更早版本的/analyze中出现的警告,如阴影变量和基本的printf验证(如果您编写自己的printf样式函数,则仍应将/analyze_Printf_format_string_一起使用)。/analyze继续提供不属于标准编译器的基于SAL的缓冲区分析。

/analyzePREfast技术可以在某些情况下检测潜在的内存泄漏(特别是在C++异常安全的情况下)、取消引用潜在的空指针、使用未初始化的内存等。它还具有许多额外的规则,用于处理内核模式编码和编写驱动程序,特别是跟踪锁、IRQL级别等。

前言和SAL注释

对于C#,/analyze是FXCop工具,它是一个代码分析工具,加上.NET的"样式执行器"。