Я использую стандартную функцию memcpy, которая объявлена в файле string.h таким образом:
extern void * memcpy(void *, const void *, size_t);
Дело 1 :
Мой код скомпилирован без каких-либо ошибок или предупреждений.
const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff+2),3U);
После проверки MISRA C: 2012 я получаю следующую ошибку MISRA:
выполнение арифметики с указателями посредством сложения
[MISRA 2012, правило 18.4, рекомендация] memcpy((void*)data,(const void*)(buff+2),3U);
Дело 2 :
Если я исправлю ошибку MISRA в случае 1 следующим образом:
const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff[2]),3U);
Я получаю предупреждение о времени компиляции и другую ошибку MISRA.
Предупреждение о времени компиляции:
cast to pointer from integer of different size
Ошибка MISRA:
явное приведение от 'const UINT8'
(он же 'const unsigned char'
) к
'const void *'
[MISRA 2012, правило 11.6, обязательно] memcpy((void*)data,(const void*)(buffer[2]),3U);