发现结构初始化是否不会修改所有成员

时间:2015-07-10 11:39:43

标签: struct ansi-c kr-c

请考虑以下代码:

typedef struct _sMYSTRUCT_BASE
{
    int b_a;
    int b_b;
    int b_c;
} sMYSTRUCT_BASE;

typedef struct _sMYSTRUCT
{
    sMYSTRUCT_BASE base;
    int            a;
    int            b;
} sMYSTRUCT;

Private const sMYSTRUCT mystruct_init =
{
    0,
    1,
    3,
    4
};

我正在寻找一种生成错误(编译或运行时)的方法,以指示结构初始化没有明确地“触及”所有结构成员。 结构中有5个整数,但'mystruct_init'只有4个值。 我知道最后一个成员(mystruct_init.b)将为零,但我需要某种警告/错误来通知程序员有关错误的信息。 这必须适用于一个非常古老的编译器(可能甚至不符合ansi-c)。

1 个答案:

答案 0 :(得分:1)

现代编译器能够产生这样的警告...在gcc中,它使用-Wmissing-field-initializers打开(警告初始化器存在但不初始化所有成员,但不是关于结构没有初始化表达式;这些至少有时可以通过启用-Wuninitialized来捕获,如果它看到你读取一个可能未初始化的值,它会发出警告,至少如果你在声明变量的同一函数中读取它。) / p>

如果您的旧编译器碰巧提供了这样的警告,您当然可以将其打开,但这似乎不太适合您的描述。

我认为,你最好的选择是,如果你想对它们进行详尽的搜索,那就是看看你是否可以使用某个版本的gcc编译代码 - 它不需要编译好足以实际在目标平台上运行以获取警告。我不能保证它能够编译你的ANSI C之前的代码,特别是如果它广泛使用编译器特定的扩展,但我至少可以说对传统的K& R语法的支持仍然存在于现代C标准,如果您的代码编译得比您想象的要好,我不会感到惊讶。

如果可行,那么为了在IDE中始终如一地生成警告,您可以修改构建脚本,以便它编译并将代码与您要定位的真实编译器链接,并编译它(但不是必须将它与gcc链接,只是为了生成可以由IDE拾取和显示的其他警告。

另一个选择是查看是否可以找到可以执行此类检查的兼容静态分析器;我开发了一个名为EnSoft Atlas的工具,它构建了一个数据流图,它可以与一个简单的脚本一起,通过检查未初始化的值是否发生在结构字段中,从而比gcc警告允许更彻底地执行初始化。

但是,我们对C的支持仍处于测试阶段。 Atlas要求Eclipse CDT(或JDT for Java)能够解析您的代码,而当前的C beta仅完全支持现代强类型结构初始化器(即struct foo f = (struct foo) {...}具有完全连接的数据流,但支持我们的第一次传递中没有实现较早的初始化列表语法struct foo f = {...},所以我不确定它是否能够满足您的需求。