1

我正在使用 clang 静态分析器(clang++ --analyze 或 clang-tidy,win64,v6.0.1)。

在这种情况下,Clang 分析器可以检测到空解引用:

class SomeClass {
    public:
    int a = 5;
};

int GetA( SomeClass* someClass ) {
    return someClass->a;
}
int main() {
    SomeClass* someClass = nullptr;
    return GetA( someClass );
}

但不是这个:

class SomeClass {
    public:
    int a = 5;
};

int GetA( SomeClass* someClass ) {
    return someClass->a;
}
SomeClass* someClass = nullptr;
int main() {
    return GetA( someClass );
}

我是clang-tidy的新手,我错过了什么吗?

问候

4

1 回答 1

3

我可以从 PVS-Studio 分析仪的开发者的角度给你答案。PVS-Studio 分析器在第一种情况下类似地检测到错误,在第二种情况下将保持安静。通过使变量成为全局变量,您大大增加了检测与使用此变量相关的错误的难度。全局变量可以在任何地方发生变化,并且很难跟踪何时以及在什么条件下会发生这种情况。很多时候,最好不要尝试。

例如,您可以通过以下方式初始化变量。

SomeClass* someClass = nullptr;

class Init
{
public:
  SomeClass m_c;
  Init() { someClass = &m_c; }
} foo;

我不是说,这是变量初始化的正确方法。我只是想表明一切都不明显的程度。

无论如何,这是不使用全局变量的另一个原因。全局变量是祸害。

于 2018-08-16T09:27:06.530 回答