﻿# V2628\. MISRA\. The pointer arguments to the Standard Library functions memcpy, memmove and memcmp should be pointers to qualified or unqualified versions of compatible types\.

Данное диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\.

Передача в функции [`memcpy`](https://en.cppreference.com/w/c/string/byte/memcpy), [`memmove`](https://en.cppreference.com/w/c/string/byte/memmove) и [`memcmp`](https://en.cppreference.com/w/c/string/byte/memcmp) аргументов\-указателей на разные, несовместимые между собой типы может сигнализировать об ошибке\.

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

```cpp
void foo(int s1[CMP_SIZE], float s2[CMP_SIZE])
{
  memcpy(s1, s2, CMP_SIZE * sizeof(int));
}
```

В этом примере аргументы функции `memcpy` имеют разные типы: `s1` — `int *`, а `s2` —  `float *`\. **Примечание**: несмотря на то, что параметры `s1` и `s2` задекларированы как массивы, в силу специфики языка C на самом деле они являются указателями\.

Корректный код выглядит так:

```cpp
void foo(int s1[CMP_SIZE], int s2[CMP_SIZE])
{
  memcpy(s1, s2, CMP_SIZE * sizeof(int)); 
}
```