PVS-Studio: предупреждение V595 генерируется, даже если указатель проверен

В следующем коде уже есть проверка 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, Зачем?

Я согласен с тем, что существует превышение проверки для nullptr в (3).

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;
}

Если вы не хотите удалять эту проверку, используйте один из следующих способов подавления предупреждений:

Другие вопросы по тегам