我正在重建一个应用程序以符合 MISRA 规则并使用 QA-C 来分析我的代码。
这些烦人的规则之一涉及指针和数组。你不能说:
char foo[10];
char * bar = &(foo[0]);
bar[5] = 'a';
你也不能这样做:
*bar = 'a';
bar++;
我的问题涉及两个函数和一个文件范围变量。
最初此代码执行以下操作(类似于位伪代码):
static char * bufferPtr;
static void foo_a(char * buffer /* other params */)
{
bufferPtr = buffer;
/* some logic goes here */
switch()
{
case 'b':
foo_b(/* some param */);
}
static void foo_b(/* parameters */)
{
if (/*something*/)
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
else
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
}
static void foo_c(char data)
{
*buffer++ = data;
}
我试图将其重写为以下内容:
static char (*bufferPtr)[];
static char bufferIndex;
static void foo_a(char buffer[] /* other params */)
{
bufferPtr = &buffer;
bufferIndex = 0;
/* same */
}
static void foo_b(/* parameters */)
{
/* same */
}
static void foo_c(char data)
{
(*bufferPtr)[bufferIndex] = data;
bufferIndex++;
}
但是随后 misra 和我的编译器(softune,由 Fujitsu)都抱怨。编译器说:
从 CHAR (*)[]' 分配不兼容的指针类型
CHAR **' to
:运算符 `='
米斯拉 说:
[C] 赋值的右操作数不是兼容的指针类型。导出到具有链接或更广泛范围的指针的自动对象的地址。
但是我确实需要能够在 foo_c 函数中索引一个数组。或者还有其他方法可以遵循 misra 并使我的代码正常工作。
如果我在同一个文件中执行以下操作:
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}
然后,Misra 和我的编译器都没有抱怨任何事情。