PVS-Studio:即使检查指针也会生成警告 V595

PVS-Studio: warning V595 is generated even if pointer is checked

在下面的代码中已经检查了 (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 进行超额检查。

分析器认为这段代码异常。首先,指针被引用,然后被验证。即使不能等于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;
}

如果您不想删除此检查,请使用以下方法之一来禁止显示警告: