我正在重建一个符合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和我的编译器(Fujitsu的软调)都抱怨。编译器说:
来自
CHAR **' toCHAR (*)[]':运算符`=‘的赋值不兼容指针类型
米斯拉说:
分配的右操作数不是兼容的指针类型。导出到具有链接或范围更宽的指针的自动对象的地址。
但是,我确实需要能够在foo_c函数中索引数组。或者还有其他的方法来跟踪misra并使我的代码工作。
如果我在同一个文件中执行以下操作:
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}那么米斯拉和我的编译器也不会抱怨任何事。
发布于 2012-07-06 10:05:45
我已经更改了这个代码的流,只将缓冲器参数传递给每个后续版本。
这是丑陋的,但它的工作和有点安全。“根据米斯拉”
发布于 2012-07-03 14:19:46
这对我来说毫无意义:
static char (*bufferPtr)[];
static char bufferIndex;我会这样做的:
static char *bufferPtr_new;
static int bufferIndex_new;并且用bufferPtr_newbufferIndex_new替换每一个*bufferPtr,但是也许可以向我们解释当前代码的问题所在,MISRA说。
发布于 2012-07-03 14:45:01
不知道你会不会喜欢这个:
static char *(bufferPtr[10]); /* must have a size */
static char bufferIndex;
static void foo_a(char buffer[])
{
*bufferPtr = buffer;
bufferIndex = 0;
/* etc */
}希望能帮上忙。
https://stackoverflow.com/questions/11312756
复制相似问题