Я очень удивлен, что вы получили это предупреждение.Для меня это работает с точностью до наоборот.Использование cppcheck 1.46.1, скомпилированного из исходников Linux.Это нормально:
struct Foo {
int x;
};
struct Obj {
Foo *FooPtr;
};
#define N 10
static Obj ArrayOfObjsContainingFooPtr[N];
int main() {
for( int i = 0; i < N; i++ ) {
Foo* x( ArrayOfObjsContainingFooPtr[i].FooPtr ); // line 3
if( !x ) // line 4
continue;
}
}
Теперь, с этим телом цикла, оно также "нормально" в соответствии с cppcheck, хотя оно и вызывает ошибку, если я на самом деле пытаюсь его запустить, очевидно:
Foo* x( ArrayOfObjsContainingFooPtr[i].FooPtr ); // line 3
if (x->x == 0)
break;
if( !x ) // line 4
continue;
Даже это "отлично":
int main() {
Foo *p = 0;
if (p->x == 0)
return 1;
И, наконец, генерируется "возможный" разыменование нулевого указателя.Возможно, верно:
int main() {
Foo *p = 0;
p->x = 0;
Самое смешное, что это, будучи полностью эквивалентным более раннему примеру, дает определенный (не «возможный») разыменование нулевого указателя:
int main() {
Foo *p = 0;
if ((*p).x == 0)
return 1;
Вывод: cppcheck - действительно глючный инструмент.