gpt4 book ai didi

c - 指针 MISRA 违规的算术

转载 作者:行者123 更新时间:2023-11-30 19:30:34 24 4
gpt4 key购买 nike

我创建了一个函数来添加数组中的下一个数字。代码很简单,如下

int math(int *address, int size)
{
int sum = 0;
for (int i = 0; i < size; i++)
{
sum += *address;
address++;
}
return sum;
}

在静态分析过程中,我发现 MISRA 规则存在问题 - 即只能对分配给数组的指针进行数学运算。这个函数的目的是在数组上使用它,但是当然 - 我在这里写的并不能保证指针不会被分配给变量。

我想到的一个解决方法是将整个表复制到本地,然后对所有元素求和,但这是一个相当大的操作,浪费了大量的微处理器资源。您有什么想法我该如何让它变得更好吗?

最佳答案

这来自 MISRA-C:2004 第 17 章,其中关于指针和数组的使用相当不合理。本章在 MISRA-C:2012(第 18 章)中从头重写。我强烈建议升级,因为 MISRA-C:2004 在这里没有多大意义。

至于如何使您的代码符合 MISRA-C:2004 标准,请执行以下操作:

int math(int address[], int size)
{
int sum = 0;
int i; // declaration must be here, MISRA-C:2004 does not allow C99
for (i = 0; i < size; i++)
{
sum += address[i];
}
return sum;
}

是的,它做同样的事情。但至少它使您的代码更具可读性。

<小时/>

为了使您的代码更加安全,尽管不符合任何 MISRA,请执行以下操作:

// better than MISRA-C but not compliant
int math(size_t size, int address[size])
{
int sum = 0;
for (size_t i = 0; i < size; i++)
{
sum += address[i];
}
return sum;
}

或者在高完整性系统的情况下,您甚至可以这样做:

int math(size_t size, int (*array)[size])
{
int* address = *array;
...

这两种替代方案都能提供比 MISRA-C 更安全的代码。

关于c - 指针 MISRA 违规的算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623320/

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