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
}
Данная диагностика классифицируется как:
|