﻿# V2665\. MISRA\. The size argument passed to function from <string\.h\> should have an appropriate value\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для С\.

Значение, передаваемое в качестве аргумента, обозначающего размер для функций из стандартной библиотеки \(`string.h`\), должно быть положительным и не превышать размер наименьшего буфера, переданного в функцию через параметр\-указатель\.

Правило распространяется на функции: `memchr`, `memcmp`, `memcpy`, `memmove`, `memset`, `strncat`, `strncmp`, `strncpy`, `strxfrm`\.

Нарушение этого правила приводит к доступу за границы буфера\. Согласно стандарту C11 \(пункт [7\.24\.1\.1](https://open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf#page=380)\), поведение программы в таком случае не определено\.



Рассмотрим пример:

```cpp
#define MAX_STR 16

void foo()
{
  char buffer2[MAX_STR/2];
  //Using buffer2....
  memset(buffer2, '\0', MAX_STR);
  //Reusing buffer2....
}
```

В функции `foo()` объявлен массив `buffer2` размером `MAX_STR/2` \(8 байт\)\. После работы с массивом вызывается функция `memset`, которая должна заполнить указанный буфер нулями\. Затем этот буфер будет повторно использован для других данных\. Из\-за того, что в функцию `memset` передаётся значение `MAX_STR` \(16\) в качестве количества байт для заполнения, произойдёт выход за пределы буфера\. Это ведёт к неопределённому поведению программы\.

Исправленный вариант:

```cpp
void foo()
{
  char buffer2[MAX_STR/2];
  //Using buffer2
  memset(buffer2, '\0', sizeof(buffer2));
  //Reusing buffer2
}
```