PVS-Studio:即使选中指针,也会生成警告V595

时间:2017-04-27 16:24:25

标签: pvs-studio

在以下代码中,已经检查了(1)中的nullptr

int msg;
struct x * var[2];

if ((var[0] = get_x()) == nullptr) {   // (1)
    return;
}
if (var[0]->data != 11) {              // (2) <<< V595
    msg = 1;
    printf("msg1");
}
if (var[0] && var[0]->data == 12) {    // (3) <<< V595
    msg = 2;
    return;
}

但我仍然得到error: V595。为什么呢?

我同意在(3)中对nullptr进行超额检查。

1 个答案:

答案 0 :(得分:1)

Analyzer认为这段代码异常。首先,指针被引用,之后它被验证。即使它不能等于NULL,它看起来也很可疑。可能会使用或检查错误的变量。

因此可能使用了错误的变量,并且修正后的代码版本可能如下所示:

if (FOO->data != 11) {
    msg = 1;
    printf("msg1");
}
if (var[0] && var[0]->data == 12) {
    msg = 2;
    return;
}

或者,可能是条件不正确:

if (var[0]->data != 11) {
    msg = 1;
    printf("msg1");
}
if (FOO && var[0]->data == 12) {
    msg = 2;
    return;
}

无论如何,分析仪并不喜欢它,它会发出警告。要消除此类警告,请删除不必要的检查,这会使代码过载并使其他程序员和分析器混淆。在这种情况下,分析仪不会发出警告:

if ((var[0] = get_x()) == nullptr) {
    return;
}
if (var[0]->data != 11) {
    msg = 1;
    printf("msg1");
}
if (var[0]->data == 12) {
    msg = 2;
    return;
}

如果您不想删除此项检查,请使用以下方法之一来取消警告: