﻿# V557\. Possible array overrun\.

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

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

```cpp
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\. Поэтому корректный код должен иметь вид:

```cpp
sample->filename[13] = 0;
```

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

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

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

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

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

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

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

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

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

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

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