Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有静态检查工具来检查像这样的错误代码_C++_Static Analysis - Fatal编程技术网

C++ 有没有静态检查工具来检查像这样的错误代码

C++ 有没有静态检查工具来检查像这样的错误代码,c++,static-analysis,C++,Static Analysis,我写了一些错误代码如下: #include "stdafx.h" #include <string> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string some_file = "afdfadf"; if(true) { string some_file = "/"+ some_file; } return 0; } #包括“stdafx

我写了一些错误代码如下:

#include "stdafx.h"
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

    string some_file = "afdfadf";

    if(true)
    {
        string some_file = "/"+ some_file;
    }

    return 0;
}
#包括“stdafx.h”
#包括
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
字符串一些_file=“afdfadf”;
如果(真)
{
字符串some_file=“/”+some_file;
}
返回0;
}
调用std::operator+时,它将引发异常

我猜这是因为在if语句中,第二个some_文件是未初始化的字符串


是否有任何静态检查工具可以帮助查找此类错误?

编译器可以警告您在初始化过程中使用变量

在GCC和CLANG中,您可以使用
-Winit self

我不确定MSVC,但使用/W4编译也可能会给您一个警告。

我很高兴使用pclint。它将发现这种类型的错误,但在与现有的、更大的代码库一起使用时,可能需要一些时间来配置它。

GCC对此有一个警告:

$ g++ t.cc -Wshadow
t.cc: In function ‘int main(int, char**)’:
t.cc:11:16: warning: declaration of ‘some_file’ shadows a previous local [-Wshadow]
t.cc:7:12: warning: shadowed declaration is here [-Wshadow]

我刚试过,叮当声可以帮助找到bug:

[~]$ clang bug.cpp 
bug.cpp:11:29: warning: variable 'some_file' is uninitialized when used within
      its own initialization [-Wuninitialized]
    string some_file = "/"+ some_file;
           ~~~~~~~~~        ^~~~~~~~~

Lint是所寻求的关键字:然后对编译器的警告级别进行实验(例如在java中,这将是一个编译时错误)。@JoopEggen,cpplint能找到这个问题吗?应该像数据流分析一样。也许这不是重复使用同一个变量名的糟糕风格。几年前,我有另一个lint。
-Wshadow
在这种情况下也很有用;它使用未初始化的变量。您不需要检测隐藏[或“self init”](什么,我在找到这个bug之前就知道我需要将它添加到我的命令行?)来捕获此错误。GCC不使用
-Winit self
捕获此错误,因为该类型是一个具有构造函数的非平凡类类型,编译器不够聪明,无法通过构造函数调用跟踪未初始化的数据。问题是我的项目很大,-Wshadow还报告了关于以下情况的警告,这在我的项目中很常见:struct S{S(A):A(A);public int A;},但此警告并不指向未初始化变量的使用。对前一个局部变量进行阴影处理不是一个bug。@TorstenRobitzki,不是,但问题是关于这个bug的。如果只是自我初始化,那么第一个
some_file
变量就不会出现在示例中,对吗?第一个“some_file”会让bug更难发现。@TorstenRobitzki:不,它不会,至少当它是std::string类型时不会,如果没有阴影,也不会有bug,由于用于连接的变量将被初始化。@如果没有第一个
某些\u文件
,则第二个
某些\u文件
的初始化仍将使用第二个未初始化的
某些\u文件
。这个版本的main()也有同样的问题:
intmain(){std::string s=“seas”+s;}
Try PVS Studio。配置几乎不是必需的。