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;
}
Если вы не хотите удалять эту проверку, используйте один из следующих способов подавления предупреждений: