我正在使用具有以下选项的 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/