9

g++(4.4 和 4.6)、clang++(3.2)和覆盖率,分别使用 -Wall 和 -Wextra(+ 其他一些)或 -Weverything 给我以下代码片段的警告:

class B {
    char *t2;
    char *t;

public:
    B() : t2(t), t(new char[100]) {}
};

我至少会期待一个关于使用未初始化(成员)变量的小警告。

有什么我想念的吗?这是一个通缉的“无警告”情景吗?我的软件中至少有一个(现在有)一个很难找到的错误。

编辑:正如在这个新问题中所读到的,我意识到在某些情况下, coverity 会警告这个问题。

4

2 回答 2

6

没有充分的理由不在这里发出警告。

G++ 不够聪明,无法诊断构造函数中未初始化的成员,请参阅http://gcc.gnu.org/PR2972

我有一个正在进行的补丁来修复它,我希望在“今年某个时候”完成

即使使用我的补丁,我也不确定 G++ 是否会发出警告,因为t2 初始化,但它已初始化为不确定的值。让编译器跟踪这不是微不足道的,但应该是可能的(所以我很惊讶即使 Coverity 错过了它。)运行时工具,比如valgrindget it right 。

当我重新访问我的补丁时,我会考虑这种情况,看看我是否可以让它发出警告,而不会增加太多开销(目前我的补丁检查没有初始化程序的成员是否会使数据未初始化,为了抓住这个我还需要检查成员使用初始化程序并检查该初始化程序是否依赖于尚未初始化的另一个成员,这需要检查每个成员,这可能会影响具有大量成员的类的编译速度。)

于 2013-01-03T15:57:09.593 回答
3

C++ 标准说使用未初始化的变量会导致未定义的行为。它不要求编译器发布关于它的诊断。因此,是否收到警告是 QOI(实施质量)的事情。

于 2013-01-03T12:57:03.450 回答