我正在使用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,我应该更详细一些。我想全局压制这些关于我使用指定初始值设定项的消息,如上所示。我无法在所有情况下全局抑制它们,因为这些错误可以检测代码中的真实错误。
答案 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命令坚持,因为它都是匿名的,你必须明确地或通过宏来输入内联命令。