c - 从函数中的数组参数存储指向文件范围内数组的指针

标签 c misra

我正在重建一个应用程序以符合 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 **' toCHAR (*)[]': 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/

相关文章:

c - 为什么 fwrite libc 函数比 syscall write 函数快?

c - 在 linux 上用 C 语言销毁信号量时如何防止错误?

c - 显示文件指针位置

php - PHP 中的 scandir() 太慢了

c - MISRA 5.2 规则 : confusion

c - C 中运算符 == 的返回类型

c - 如何仅取二维数组的某些行和列的平均值?

c - 有没有办法在 C90 标准中使枚举无符号? (符合 MISRA-C 2004)

c++ - MISRA 5-2-1规则需要后缀表达式吗?

c++ - 如何按照 MISRA C++ 实现 CRTP