1

我试图在2013年VS探索静态代码分析选项 我已经写了下面visual studio 2013静态代码分析 - 它有多可靠?

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年

+1

未使用的变量很容易找到,但对代码做更深入更复杂的分析是另一回事。虽然Visual Studio 2013版本绝不是旧的,但如果它是一个免费版本,那么我怀疑这可能是您没有看到编译器的更复杂功能的原因。我记得在免费的visual studio 2008 express中,它不能完全优化;您必须为这些编译器功能支付全部/专业版的Visual Studio。 – ron

+0

微软喜欢抛弃他们产品的功能,但是他们不容易理解,也无法找到所有不同版本的信息,以及每个版本中有哪些或哪些不可用......例如VS2015社区vs专业人员与企业。 – ron

+0

@ron感谢您的重播,是的,我认为这是原因,我已经下载了免费版本并使用它。 – NDestiny

回答

0

这不是那种代码的问题是/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 And SAL Annotations

对于C#,/analyzeFXCop工具是一个代码的分析工具加上.NET一个 '风格实施者'。