首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写一个memcpy函数完全兼容MISRA:2012?

如何编写一个memcpy函数完全兼容MISRA:2012?
EN

Stack Overflow用户
提问于 2017-10-10 11:38:25
回答 1查看 4.6K关注 0票数 2

我编写了这个memcpy函数,但我仍然需要禁用规则11.5和11.8。是否有一个完整的解决方案:2012年兼容?

代码语言:javascript
运行
复制
#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进行静态分析.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 12:03:13

您不可能用标准格式编写memcpy并完全兼容MISRA。正如您所注意到的,MISRA不允许restrict。但也有第11.5条规则。

关于从指针到无效到指针到类型的转换,规则11.5在实践中太麻烦了。这是一个咨询规则,所以我跳过它。你不需要引起偏差。

但是,关于丢弃限定符的第11.8条规则是合理的(也是必需的)。在这种情况下,你没有理由这么做。您的代码中有一个错误,被MISRA阻止了。将代码更改为

代码语言:javascript
运行
复制
const int_least8_t* source = (const int_least8_t*) src;

补充说明:

  • 您不需要向main()提供函数声明。
  • 米斯拉-C不允许使用stdio.h
  • 避免声明以下划线开头的标识符,请参见C11 7.1.3。
  • 在这里使用int_least8_t没有明显的好处。此外,有符号的类型也有问题。我会用uint8_t代替。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46665808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档