0

nullptr在以下代码中,(1)中已经存在检查:

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

4

1 回答 1

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-04-28T09:08:32.527 回答