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 (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C.
Передача в функции memcpy
, memmove
и memcmp
аргументов-указателей на разные, несовместимые между собой типы может сигнализировать об ошибке.
Рассмотрим пример кода:
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 на самом деле они являются указателями.
Корректный код выглядит так:
void foo(int s1[CMP_SIZE], int s2[CMP_SIZE])
{
memcpy(s1, s2, CMP_SIZE * sizeof(int));
}