C++ init-list:使用非初始化成员初始化其他成员不会发出警告

Pat*_* B. 9 c++ gcc clang member-variables coverity

既没有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]) {}
};
Run Code Online (Sandbox Code Playgroud)

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

有什么我想念的吗?这是一个想要的"无警告" - 场景.我(现在已经)我的软件中至少有一个很难找到的错误.

编辑:从这个新问题可以看出,我意识到在某些情况下,封面警告这个问题.

Jon*_*ely 6

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

G ++不够智能,无法诊断构造函数中的非实体成员,请参阅http://gcc.gnu.org/PR2972

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

即使使用我的补丁,我也不确定G ++是否会发出警告,因为它t2 初始化,但它已被初始化为不确定的值.为了让编译器跟踪这不是一件容易的事情,但应该是可能的(所以我很惊讶,即使是Coverity也错过了它.)运行时工具,比如说valgrind得对.

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


use*_*353 3

C++ 标准规定使用未初始化的变量会导致未定义的行为。它并不强制编译器发出有关它的诊断。因此,是否收到警告是一个 QOI(实施质量)问题。