我正在重建一个应用程序以符合 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)都会提示。 编译器说:
assignment incompatible pointer types from
CHAR **' to
CHAR (*)[]': operator `='
米斯拉说:
[C] Right operand of assignment is not of compatible pointer type. Address of automatic object exported to a pointer with linkage or wider scope.
但是我确实需要能够在 foo_c 函数中索引一个数组。或者是否有其他方法可以遵循 misra 并使我的代码正常工作。
如果我在同一文件中执行以下操作:
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}
然后 Misra 和我的编译器都不会提示任何事情。
最佳答案
这对我来说没有意义:
static char (*bufferPtr)[];
static char bufferIndex;
我会这样做:
static char *bufferPtr_new;
static int bufferIndex_new;
并用 bufferPtr_new[bufferIndex_new] 替换每个 *bufferPtr 但根据 MISRA,也许可以向我们解释当前代码的问题。
关于c - 从函数中的数组参数存储指向文件范围内数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312756/