作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个函数来添加数组中的下一个数字。代码很简单,如下
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/
与其说这是一个技术问题,不如说是一个政策问题。 开发应用程序时,如果附属机构提供的链接构成您内容的一部分,您是否可以显示该链接?例如,专门用于从 Affiliate Window 查找特定流派黑胶唱片
我是一名优秀的程序员,十分优秀!