Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2665. MISRA. The size argument...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

14 Ноя 2025

Диагностическое правило основано на руководстве 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