Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
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