Для соответствия требованиям MISRA просто выполните memcpy(dest, &csrc[pos * elemsize], len * elemsize);
.
Хотя я не совсем понимаю, зачем вам нужна функция для этого, вместо того, чтобы просто вызывать memcpy
напрямую. Как упоминалось в комментариях, MISRA не одобряет использование пустых указателей с помощью консультативных правил, поскольку критически важное программное обеспечение должно определяться c, а не generic c.
Кроме того, len * elemsize
довольно сомнительно, так как это ограничит функцию массивами максимум из 255 байт.
Вы можете избежать многих проблем MISRA, преобразовав функцию в функциональный макрос. Не обязательно улучшение читаемости, но, насколько я помню, это должно быть MISRA-совместимым:
#define copy_array(src, dst, pos, len, elemsize) \
memcpy((dst), &(src)[(pos)*(elemsize)], (len)*(elemsize))