# V600. The 'Foo' pointer is always not equal to NULL. Consider inspecting the condition.

Анализатор обнаружил сравнение адреса массива с нулем. Такое сравнение не имеет смысла и может говорить о наличии ошибки в программе.

Рассмотрим пример кода.

    void Foo()
    {
      short T_IND[8][13];
      ...
      if (T_IND[1][j]==0 && T_IND[5]!=0)
        T_buf[top[0]]= top[1]*T_IND[6][j];
      ...
    }

Программа обрабатывает двумерный массив. Код сложен для чтения и ошибка на первый взгляд не заметна. Однако анализатор предупредит, что сравнение "T_IND[5]!=0" не имеет смысла. Указатель "T_IND[5]" всегда не равен нулю.

Изучив предупреждения V600 можно найти ошибки, которые, как правило, связаны с опечатками. Например, может оказаться, что данный код должен выглядеть так:

    if (T_IND[1][j]==0 && T_IND[5][j]!=0)

Предупреждение V600 далеко не всегда означает наличие настоящей ошибки. Часто причиной появления V600 является неаккуратный рефакторинг. Рассмотрим наиболее распространенный случай. В начале код выглядел так:

    int *p = (int *)malloc(sizeof(int) *ARRAY_SIZE);
    ...
    if (!p)
      return false;
    ...
    free(p);

Код менялся. Стало ясно, что значение ARRAY_SIZE небольшое и массив можно создавать на стеке. В результате получился следующий код:

    int p[ARRAY_SIZE];
    ...
    if (!p)
      return false;
    ...

Здесь выдается предупреждение V600. Однако код корректно работает. Просто получилось, что поверка "if (!p)" потеряла смысл и её можно удалить.

Данная диагностика классифицируется как:

CWE-570 CWE-571 CERT-EXP08-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V600.