visualstudio2013静态代码分析-它的可靠性如何
visual studio 2013 static code analysis - how reliable is it?
我正在尝试探索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的缓冲区分析。
/analyze
PREfast技术可以在某些情况下检测潜在的内存泄漏(特别是在C++异常安全的情况下)、取消引用潜在的空指针、使用未初始化的内存等。它还具有许多额外的规则,用于处理内核模式编码和编写驱动程序,特别是跟踪锁、IRQL级别等。
前言和SAL注释
对于C#,
/analyze
是FXCop工具,它是一个代码分析工具,加上.NET的"样式执行器"。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- visualstudio2013静态代码分析-它的可靠性如何