我试图探索在2013年VS静态代码分析选项,我已经写了下面的代码非常简单
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 =新INT; 并警告有关内存泄漏,但没有找到,但找到未使用的变量b。
所以,现在我在一点混乱,内存泄漏是在C最常见的错误/ C ++这个工具找不到这个。 现在的问题是我们可以依靠这个分析没有?
环境:Windows 7,最终VS 2013
这不是那种代码问题/analyze
(又名PREfast的)是用来检测。 有用于检测直接的内存泄漏像CRT调试堆等常用工具-参见MSDN 。 可以说,你应该使用像C ++ 11功能std::unique_ptr
放在第一位,从不记得要打电话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
的目的是做的是提供一些你的产品,如皮棉得到“额外的警告”的,但主要是通过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年,现在包括一些曾经是只在警告/analyze
在VS 2013年或更早像阴影变量和基本的printf验证(如果你写你自己的printf风格的功能,您还是应该使用/analyze
与_Printf_format_string_
)。 /analyze
继续提供基于SAL-缓冲区分析是不标准的编译器的一部分。
该/analyze
PREfast的技术可以检测到潜在的内存泄漏在某些情况下(特别是C ++异常安全),潜在的空指针的提领,使用未初始化的内存等,也有很多额外的规则来处理内核模式编码和写作司机尤其是跟踪锁,IRQL水平等
PREfast的和SAL注释
对于C#, /analyze
是FxCop的工具,它是一个代码分析工具,加上.NET中的“风格实施者”。