指针 MISRA 违规的算法
Arithmetic of pointer MISRA violation
我创建了一个函数来添加数组中的下一个数字。代码很简单,如下图
int math(int *address, int size)
{
int sum = 0;
for (int i = 0; i < size; i++)
{
sum += *address;
address++;
}
return sum;
}
在静态分析过程中,我发现 MISRA 规则存在问题 - 这意味着您只能对分配给数组的指针进行数学运算。这个函数的目的是在数组上使用它,但是当然——我在这里写的并不能保证指针不会被分配给一个变量。
我想到的一个解决方法是将整个 table 复制到本地,然后对所有元素求和,但这是相当大的操作,浪费了很多 uprocessors 资产。你有什么想法我怎样才能让它变得更好?
这将来自 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 更安全的代码。
我创建了一个函数来添加数组中的下一个数字。代码很简单,如下图
int math(int *address, int size)
{
int sum = 0;
for (int i = 0; i < size; i++)
{
sum += *address;
address++;
}
return sum;
}
在静态分析过程中,我发现 MISRA 规则存在问题 - 这意味着您只能对分配给数组的指针进行数学运算。这个函数的目的是在数组上使用它,但是当然——我在这里写的并不能保证指针不会被分配给一个变量。
我想到的一个解决方法是将整个 table 复制到本地,然后对所有元素求和,但这是相当大的操作,浪费了很多 uprocessors 资产。你有什么想法我怎样才能让它变得更好?
这将来自 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 更安全的代码。