【问题标题】:PVS-Studio: warning V595 is generated even if pointer is checkedPVS-Studio:即使检查了指针也会生成警告 V595
【发布时间】:2017-09-25 13:38:43
【问题描述】:

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

【问题讨论】:

    标签: pvs-studio


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 2017-09-25
      • 2012-02-18
      • 1970-01-01
      • 2021-11-08
      • 2022-09-26
      • 2018-11-13
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多