我写了这个memcpy
函数,但我仍然需要禁用规则11.5和11.8。是否有解决方案可以完全符合MISRA:2012标准?
#pragma cstat_suppress="MISRAC2012-Rule-21.6" // Uses of stdio.h were found.
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
extern int main(void);
static int_least8_t _memcpy(void *dst, const void *src, const size_t length)
{
#pragma cstat_disable="MISRAC2012-Rule-11.5" // A conversion from a pointer to void into a pointer to object was found.
int_least8_t* destination = (int_least8_t*)dst;
#pragma cstat_disable="MISRAC2012-Rule-11.8" // A cast that removes a const or volatile qualification was found.
const int_least8_t* source = (int_least8_t*)src;
#pragma cstat_restore="MISRAC2012-Rule-11.5","MISRAC2012-Rule-11.8"
for (size_t i = 0; i < (length / sizeof(int_least8_t)); i++)
{
destination[i] = source[i];
}
return 0;
}
int main(void)
{
int32_t src[32];
int32_t dst[32];
(void)memset(src, 0xff, sizeof(src));
(void)_memcpy(dst, src, 128);
for (size_t i = 0; i < (sizeof(src) / sizeof(src[0])); i++)
{
(void)printf("%d <=> %d\n", src[i], dst[i]);
}
return 0;
}
我正在使用IAR作为编译器,使用C-STAT进行静态分析。
memcpy
没有类型安全性,这就是它的本质。此外,memcpy
本身也参与了确定对象有效类型的过程。这又是一个缺乏合理解释的规则。无论如何,你的代码并不是标准库中的memcpy
,所以这个规则并不适用。 - Lundinmemcpy
,它很可能已经高度优化,而不是使用一些自制的、速度较慢的版本? - too honest for this site_memcpy
返回 0?这会让任何期望它像标准的memcpy()
一样工作的人感到惊讶。而且完全没有必要这样强制转换掉const
:const int_least8_t* source = (const int_least8_t*)src;
应该没问题。 - Toby Speight