Анализатор обнаружил потенциальную ошибку, которая может привести к выходу за границу массива. В коде ранее присутствуют проверки индекса, однако на указанной строке контейнер использует индекс без проверки.
Рассмотрим синтетический пример:
#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; }
Примечание: в диагностическом правиле реализованы несколько исключений, которые добавлены для уменьшения количества ложных срабатываний. Для выдачи предупреждения должны быть выполнены следующие условия:
Данная диагностика классифицируется как:
|