﻿# 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](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

Использование функций обработки строк из стандартной библиотеки \(`string.h`\) не должно приводить к доступу за пределы объекта\.

Правило распространяется на функции: `strcat`, `strchr`, `strcmp`, `strcoll`, `strcpy`, `strcspn`, `strlen`, `strpbrk`, `strrchr`, `strspn`, `strstr`, `strtok`\.

Использование таких функций без дополнительных проверок может привести к выходу за границы указанного буфера\. Согласно стандарту C11 \(пункт [7\.24\.1\.1](https://open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf#page=380)\), поведение программы в таком случае не определено\.

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

```cpp
char str[] = "Short";
void foo(void)
{
  (void)strcpy(str, "Another, and his clue would be complete!");
}
```

Ошибка возникает при вызове функции `strcpy`, которая выполняет копирование строкового литерала в массив символов `str` без проверки соответствия размеров\. Так как длина копируемой строки значительно превышает размер целевого массива\. Данные записываются за пределами выделенной для `str` памяти, что приводит к переполнению буфера\.

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

```cpp
char str[] = "Short";
void foo(void)
{
  const char* source = "Another, and his clue would be complete!";
  (void)strncpy(str, source, sizeof(str) - 1);
}
```