V2664. MISRA. Use of the string handling functions from <string.h> should not result in accesses beyond the bounds of the objects referenced by their pointer parameters.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для С.
Использование функций обработки строк из стандартной библиотеки (string.h) не должно приводить к доступу за пределы объекта.
Правило распространяется на функции: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strstr, strtok.
Использование таких функций без дополнительных проверок может привести к выходу за границы указанного буфера. Согласно стандарту C11 (пункт 7.24.1.1), поведение программы в таком случае не определено.
Рассмотрим пример:
char str[] = "Short";
void foo(void)
{
(void)strcpy(str, "Another, and his clue would be complete!");
}
Ошибка возникает при вызове функции strcpy, которая выполняет копирование строкового литерала в массив символов str без проверки соответствия размеров. Так как длина копируемой строки значительно превышает размер целевого массива. Данные записываются за пределами выделенной для str памяти, что приводит к переполнению буфера.
Исправленный пример:
char str[] = "Short";
void foo(void)
{
const char* source = "Another, and his clue would be complete!";
(void)strncpy(str, source, sizeof(str) - 1);
}
Данная диагностика классифицируется как:
|