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

时间:2014-04-02 21:18:04

标签: 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定义如下:

  
    

错误133:聚合'unknown-name'

的初始化程序太多          

错误10:期待'}'

  

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

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

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

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

2 个答案:

答案 0 :(得分: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节,初始化程序中=之前的内容是指示符列表,它是一个或多个指示符秒。 .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] =个指示符。)

更新:引用新的商品:

  

Gimpel软件的好人回应说“这个   似乎是一个错误“并正在努力纠正它。

答案 1 :(得分:1)

不确定C99和8.00x支持问题,因为我安装了9.00k。但9.00k不喜欢你的联合初始化形式,但Visual Studio没有问题。

但是对于Jacchim Pileborg的情况,它只会发出一个Info 708: union initialization而关闭可能会更安全。

如评论中所述,您不希望完全全局删除这些错误类型,因此-e133-e10无法解决您的问题。

所以使用Joachim的形式,我可以使用宏来抑制它:

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;

#define MY_UNION(A,B,C,D) /*lint -save -e708*/{{.a=(A),.b=(B),.c=(C),.d=(D)}}/*lint -restore*/

int main(void)
{
    My_Value test[] =
    {
        MY_UNION(2, 3, 2, 1),
        MY_UNION(1, 2, 3, 4)
    };

    return 0;
}

丑陋,但由于你没有任何东西可以使lint命令坚持,因为它都是匿名的,你必须明确地或通过宏来输入内联命令。