C++ 初始化列表 : using non-initialized members to initialize others gives no warning

标签 c++ gcc clang member-variables coverity

无论是 g++(4.4 和 4.6)还是 clang++(3.2)和 coverity,-Wall 和 -Wextra(+ 其他一些)或 -Weverything 分别给我以下代码片段的警告:

class B {
    char *t2;
    char *t;

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

我至少希望收到关于使用未初始化(成员)变量的小警告。

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

编辑:可以在this new question中读到我意识到 coverity 在某些情况下会警告这个问题。

最佳答案

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

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

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

即使有了我的补丁,我也不确定 G++ 是否会发出警告,因为 t2 已初始化,但它被初始化为一个不确定的值。对于编译器来说,跟踪这不是微不足道的,但应该是可能的(所以我很惊讶甚至 Coverity 错过了它。)运行时工具,如 valgrind 可以正确完成它。

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

关于C++ 初始化列表 : using non-initialized members to initialize others gives no warning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139265/

相关文章:

c++ - double,float,{0.0},{0.0f},有什么大不了的?

c++ - 在 Qt 中使用 FreeImage

c - 从核心转储中获取被调用函数的返回值

c++ - 是否可以用外部友元 lambda 函数覆盖虚函数?

llvm - 如何在 Clang 3.0 中使用 cfg-dump 选项?

c++ - 关键字 "shared"是否可以防止竞争条件?

c++ - char* 丢失数据

c++ - 没有将 bool 隐式转换为浮点类型的警告?

eclipse - 如何通过Eclipse向g++添加 '-pthread'选项?

ubuntu - 如何从外部文件读取gcc输入