gpt4 book ai didi

c - 如何编写与MISRA:2012完全兼容的memcpy函数?

转载 作者:行者123 更新时间:2023-12-04 11:08:47 26 4
gpt4 key购买 nike

我写了这个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并且完全符合MISRA。您似乎已经注意到,MISRA不允许restrict。但也有规则11.5。

关于从无指针到强制类型的强制转换的规则11.5实在太麻烦了,无法在实践中遵循。这是一个咨询规则,因此我将跳过它。您无需提出偏差。

但是,关于抛弃预选赛的规则11.8是一项合理的要求(也是必需的)。在这种情况下,没有理由您应该这样做。 MISRA阻止了您代码中的错误。将代码更改为

const int_least8_t* source = (const int_least8_t*) src;




补充笔记:


您无需向 main()提供前向声明。
MISRA-C不允许 stdio.h
避免声明以下划线开头的标识符,请参阅C11 7.1.3。
在这里使用 int_least8_t没有明显的好处。另外,带符号的类型是有问题的。我会改用 uint8_t

关于c - 如何编写与MISRA:2012完全兼容的memcpy函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com