lang分析器无法检测到空解引用

时间:2018-08-15 12:24:43

标签: static-analysis static-code-analysis clang-static-analyzer clang-tidy

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

在这种情况下,语言分析器可以检测到空取消引用:

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,想念什么吗?

致谢

1 个答案:

答案 0 :(得分:2)

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

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

@OneToOne(cascade = { CascadeType.MERGE, CascadeType.REMOVE,
                      CascadeType.REFRESH, CascadeType.DETACH },
                      fetch = FetchType.EAGER)
private Company company;

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

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