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

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

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

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

Нарушение этого правила приводит к доступу за границы буфера. Согласно стандарту C11 (пункт 7.24.1.1), поведение программы в таком случае не определено.

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

    #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) в качестве количества байт для заполнения, произойдёт выход за пределы буфера. Это ведёт к неопределённому поведению программы.

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

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

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

MISRA-C-2023-21.18