Данное диагностическое правило основано на руководстве 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));
}