1

我正在使用带有以下选项的 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:聚合“未知名称”的初始化程序太多

错误 10:需要 '}'

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

1. PC-Lint 8.00x 是否支持 C99 风格的结构成员初始化?

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

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

4

2 回答 2

2

不确定 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 命令坚持下去,因为它都是匿名的,因此您必须明确地或通过宏放置内联命令。

于 2014-07-09T02:19:41.447 回答
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的序列。.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 软件的好心人回应说“这似乎是一个错误”,并正在努力纠正它。

于 2014-07-10T00:02:51.220 回答