1

考虑以下代码:

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)。

4

1 回答 1

1

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

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

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

如果可行,那么要在您的 IDE 中始终如一地产生警告,您可以修改构建脚本,以便它既可以编译代码并将其链接到您所针对的真实编译器,也可以编译它(但不一定链接它) gcc,只是为了生成可以被 IDE 拾取和显示的附加警告。

另一种选择是查看您是否可以找到可以执行此类检查的兼容静态分析器;我在一个名为 EnSoft Atlas 的工具上工作,该工具构建了一个数据流图,该图与一个简单的脚本一起,可用于通过检查未初始化值是否流向结构字段来比 gcc 警告允许的更彻底地强制初始化。

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

于 2015-08-15T04:55:03.990 回答