【发布时间】:2014-05-14 10:25:21
【问题描述】:
我正在使用带有以下选项的 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 并进行了一些 Google 搜索,但我找不到任何有用的东西。代码按预期运行,一切都正确初始化。这是我的问题。
1. PC-Lint 8.00x 是否支持结构成员的 C99 样式初始化?
2。如果是这样,我必须为 PC-Lint 设置哪些选项/标志才能全局禁止这些消息?
编辑
关于问题 2,我应该更详细。我想在全局禁止这些消息,因为我使用了如上所示的指定初始化程序。我无法在所有情况下全局抑制它们,因为这些错误可以检测代码中的真正错误。
【问题讨论】:
-
我不知道这样嵌套成员字段(例如
.bits.a)是否真的可以。我怀疑你需要做例如My_value test[] = { { { .a = 2, .b = 3, .c = 2, .d = 3 } }, ... }. -
@JoachimPileborg 这是一个很好的观点。我已经看到了一些使用指定初始化列表来初始化嵌套结构的示例(例如this),但我不确定这是否是正确的 C99。我可能需要提出另一个问题...
-
看来我使用上面写的指定初始化列表是有效的。但是,我仍然无法让 PC-Lint 很好地配合这个特定的实现。
-
我同意它是有效的;语法允许designator-list,并且
.bits.a限定(并且gcc 和clang 都接受它)。但是,如果您将.bits上移一层会发生什么? -
@KeithThompson,看起来你正在做某事。如果我更改为
[0].bits.a = 1并继续通过[1].bits.d = 0PC-Lint 不再抱怨,armcc 仍然可以正确编译它。这可能是我最好的选择。