gpt4 book ai didi

c++ - visual studio 2013 静态代码分析——它的可靠性如何?

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:17 25 4
gpt4 key购买 nike

我正在尝试探索 VS 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;
}

当我在上面的 block 上运行代码分析时,我希望它找到 int* i = new int; 并警告内存泄漏,但它没有找到但找到未使用的变量 b。

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

环境:Windows 7,VS 旗舰版 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 and VS 2017 now include a few of the warnings that used to be only in /analyze in VS 2013 or earlier like shadowed variables and basic printf validation (if you write your own printf-style functions, you should still use /analyze with _Printf_format_string_). /analyze continues to provide SAL-based buffer analysis that is not part of the standard compiler.

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

Prefast And SAL Annotations

For C#, /analyze is the FXCop tool which is a code-analysis tool plus a 'style enforcer' for .NET.

关于c++ - visual studio 2013 静态代码分析——它的可靠性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42179745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com