如何在Clang(C++17)中获取未初始化成员变量的警告?
问题解答
你使用的两个编译标志并不适用于当前代码的场景,以下是具体原因和解决方案:
一、现有编译选项的适用范围
-Wmissing-field-initializers:仅针对聚合类型(如无用户定义构造函数的结构体、数组)在初始化时未显式赋值所有字段的情况。你的Foo类包含自定义构造函数,不属于聚合类型,因此该选项不会触发警告。-Wconditional-uninitialized:仅检测变量在部分代码路径中未初始化就被使用的场景(例如if分支初始化了变量,else分支未初始化直接使用)。而你的bar成员从始至终未被初始化,不存在"条件性"未初始化的情况,所以该选项也不会生效。
二、正确的编译选项
在Clang中,要检测类成员在自定义构造函数中未初始化的情况,需要使用-Wuninitialized,并且必须开启优化(-O1及以上级别)——因为这类未初始化检测依赖编译器优化阶段的数据流分析。
使用以下命令编译你的测试代码,就能得到预期的警告:
clang++ -std=c++17 -O1 -Wuninitialized test.cpp
编译后会输出类似警告:
warning: variable 'bar' is uninitialized when used here [-Wuninitialized]
int Bar() { return bar; }
^~~
补充说明
如果使用GCC编译器,对应的选项是-Wuninitialized和-Wmaybe-uninitialized,同样需要配合优化级别(如-O1)才能生效。
内容的提问来源于stack exchange,提问作者Deling Ren
相关产品推荐
相关产品推荐

