# V1111. The index was used without check after it was checked in previous lines.

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

Рассмотрим синтетический пример:

    #define SIZE 10
    int buf[SIZE];

    int do_something(int);

    int some_bad_function(int idx)
    {
      int res;

      if (idx < SIZE)
      {
        res = do_something(buf[idx]);
      }
      // ....
      res = do_something(buf[idx]); // <=
      return res;
    }

В данном примере, если в функцию придёт значение больше или равное 'SIZE', то, несмотря на проверку, после неё произойдёт выход за границу массива.

Следует как минимум добавить дополнительную проверку:

    int some_good_function(int idx)
    {
      int res;

      if (idx < SIZE)
      {
        res = do_something(buf[idx]);
      }
      // ....
      if (idx < SIZE)
      {
        res = do_something(buf[idx]); //ok
      }

      return res;
    }

Примечание: в диагностическом правиле реализованы несколько исключений, которые добавлены для уменьшения количества ложных срабатываний. Для выдачи предупреждения должны быть выполнены следующие условия:

- Сравнение должно происходить с константным выражением.
- После сравнения не должно быть выхода из блока кода.
- Доступ по индексу должен происходить в вычислимом контексте.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

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

CWE-20 CERT-API00-C