# V557. Possible array overrun.

Анализатор обнаружил потенциально возможный доступ к памяти за границами массива. Самым распространенным случаем является ошибка при записи символа '\0' после последнего элемента массива.

Рассмотрим соответствующий пример:

    struct IT_SAMPLE
    {
      unsigned char filename[14];
      ...
    };

    static int it_riff_dsmf_process_sample(
      IT_SAMPLE * sample, const unsigned char * data)
    {
      memcpy( sample->filename, data, 13 );
      sample->filename[ 14 ] = 0;
      ...
    }

Последний элемент массива имеет индекс 13, а не 14. Поэтому корректный код должен иметь вид:

    sample->filename[13] = 0;

Конечно, в подобных случаях лучше использовать не явное значение индекса, а выражение использующее оператор sizeof(). Однако следует помнить, что и в этом случае можно допустить ошибку. Рассмотрим пример:

    typedef wchar_t letter;
    letter    name[30];
    ...
    name[sizeof(name) - 1] = L'\0';

На первый взгляд выражение "sizeof(name) - 1" верно. Но здесь программист забыл, что он работает с типом 'wchar_t', а не 'char'. В результате символ '\0' будет записано далеко за пределами массива. Корректный вариант:

    name[sizeof(name) / sizeof(*name) - 1] = L'\0';

Для упрощения записи таких конструкций можно использовать специальный макрос:

    #define str_len(arg) ((sizeof(arg) / sizeof(arg[0])) - 1)
    name[str_len(name)] = L'\0';

Анализатор выявляет некоторые ошибки, когда индексом является переменная, значение которой может выйти за пределами массива. Пример:

    int buff[25];
    for (int i=0; i <= 25; i++)
      buff[i] = 10;

Корректный вариант:

    int buff[25];
    for (int i=0; i < 25; i++)
      buff[i] = 10;

Следует учитывать, что при работе с подобными диапазонами значений анализатор может ошибаться и выдавать ложные срабатывания.

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

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

CWE-119 CWE-125 CWE-787 CERT-ARR30-C

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