视觉工作室2013的静态代码分析 - 它有多可靠?(visual studio 2013 stati

2019-09-25 19:45发布

我试图探索在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

Answer 1:

这不是那种代码问题/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中的“风格实施者”。



文章来源: visual studio 2013 static code analysis - how reliable is it?