c - 如何抑制结构成员的 C99 样式初始化的 PC-Lint 错误?

标签 c c99 lint pc-lint

我正在使用具有以下选项的 PC-Lint 8.00x:

+v -wlib(1) +fan +fas

当我运行类似于以下的代码时,我从 PC-Lint 收到许多错误消息:

typedef union
{
    struct
    {
        unsigned int a : 4;
        unsigned int b : 4;
        unsigned int c : 4;
        unsigned int d : 4;
    } bits;
    unsigned short value;
} My_Value;

int main (void)
{
    My_Value test[] =
    {
        {
            .bits.a = 2,
            .bits.b = 3,    //Errors 133 and 10
            .bits.c = 2,
            .bits.d = 3,
        },
        {
            .bits.a = 1,
            .bits.b = 1,    //Errors 133 and 10
            .bits.c = 1,
            .bits.d = 0,
        },
    };

    /* Do something meaningful. */

    return 0;
}

报告的错误由 PC-Lint 定义如下:

Error 133: Too many initializers for aggregate 'unknown-name'

Error 10: Expecting '}'

我尝试搜索 Gimpel 并进行了一些 Google 搜索,但我找不到任何有用的东西。代码按预期运行,一切都正确初始化。这是我的问题。

<强>1。 PC-Lint 8.00x 是否支持结构成员的 C99 样式初始化?

<强>2。如果是这样,我必须为 PC-Lint 设置哪些选项/标志才能全局抑制这些消息?

编辑
关于问题 2,我应该更详细一些。我想全局禁止这些关于我使用指定初始值设定项的消息,如上所示。我无法在所有情况下全局抑制它们,因为这些错误可以检测到代码中的真正错误。

最佳答案

据我所知,这个语法:

My_Value test[] =
{
    {
        .bits.a = 2,
        .bits.b = 3,
        .bits.c = 2,
        .bits.d = 3,
    },
    {
        .bits.a = 1,
        .bits.b = 1,
        .bits.c = 1,
        .bits.d = 0,
    },
};

在 C99(和 C11)中有效。查看标准的第 6.7.8 节,初始化器中 = 之前的东西是一个 designator-list,它是一个或多个 designator 的序列s。 .bits.a 在该上下文中有效。

显然 PC-Lint 不支持该语法。 (你可能想通知维护者,除非它已经在更高版本中得到支持。)

作为解决方法,如果您将其更改为:

My_Value test[] =
{   
    { .bits =
        {   
            .a = 2,
            .b = 3,
            .c = 2,
            .d = 3,
        },
    },
    { .bits =
        {   
            .a = 1,
            .b = 1,
            .c = 1,
            .d = 0,
        },
    },
};

它仍然是有效的 C(并且可以说更清晰),并且根据您刚刚在评论中写的内容,PC-Lint 接受了它。

(如果您想更加明确,您可以考虑添加 [0] =[1] = 指示符。)

更新:引用新评论:

The good people at Gimpel software have responded stating that "this appears to be a bug" and are working to correct it.

关于c - 如何抑制结构成员的 C99 样式初始化的 PC-Lint 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823277/

相关文章:

mysql - C程序: Segmentation fault when selecting from MySQL with field that contains NULL

c - 如何省略字符串中的点、逗号和空格(检查回文所需)

c - 从 C 递归错误输出的 Mips 翻译

python - 如何配置 Pylint 以检查 PEP8 检查的所有内容?

c - 不会进入我的功能

c - 这种复制字符串的方法是否比单独复制每个字符更快?

c - `uint_fast32_t` 是否保证至少与 `int` 一样宽?

javascript - 如何设置 .eslintrc 识别 'require' ?

javascript - 如何在 Atom 中正确设置 Airbnb 的 javascript linter?

c - 如何在linux终端上一行编译运行?