Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法发出警告,提醒您使用这个未初始化的变量?_C++ - Fatal编程技术网

C++ 有没有办法发出警告,提醒您使用这个未初始化的变量?

C++ 有没有办法发出警告,提醒您使用这个未初始化的变量?,c++,C++,下面我有一个小程序,它在结构中使用一个未初始化的字段。我使用-Wuninitialized-Wmissing字段初始值设定项-Wall-Wextra-Werror(下面的Godbolt链接)编译程序,程序编译OK并运行,但在读取结构时打印未初始化的垃圾值 在使用未初始化变量的情况下,是否有办法获得此类编程错误的警告 #包括 枚举像素深度{ FWPixelDepthColor8888, }; 结构FWBitmapDecodeOptions{ fw像素深度像素深度; 浮标; bool解码,无需多次解

下面我有一个小程序,它在结构中使用一个未初始化的字段。我使用
-Wuninitialized-Wmissing字段初始值设定项-Wall-Wextra-Werror
(下面的Godbolt链接)编译程序,程序编译OK并运行,但在读取结构时打印未初始化的垃圾值

在使用未初始化变量的情况下,是否有办法获得此类编程错误的警告

#包括
枚举像素深度{
FWPixelDepthColor8888,
};
结构FWBitmapDecodeOptions{
fw像素深度像素深度;
浮标;
bool解码,无需多次解码;
};
静态void p(FWBitmapDecodeOptions选项){
printf(“%d,%f,%d”,opts.pixelDepth,opts.scale,opts.decodeinoutpremultiply);
}
int main(){
FWBitmapDecodeOptions选项;
opts.decodeithoutpremultiply=true;
p(opts);
}

Clang 8.0.0标志:
-O3-Wuninitialized-Wmissing字段初始值设定项-Wall-Wextra-Werror

样本输出:

-1557482600, 0.000000, 1

与其他编程语言相比,在C++中,在运行时通常不可能检测使用变量时是否初始化了变量。为了检测到这一点,每个变量都需要一个相关的标志来指定变量是否初始化。这将花费大量的空间和性能。由于这个原因,这种运行时检查通常只由一些高级编程语言完成

然而,在编译时,当可能的代码路径非常有限时,编译器可能会在简单的情况下检测对未初始化数据的读取访问。但这肯定是不可靠的,因为编译器不能总是能够检查所有可能的代码路径


因此,为了检测对未初始化数据的读取访问,最好使用一个特殊的调试工具,该工具在运行时检测此类错误,并为此牺牲性能。此类工具的示例包括。

fyi gcc确实发出实时警告-gcc 9.1发出警告,但10.2似乎没有。。。。是的,是UB。回复我上面的“…gcc确实在现场发出警告…”-gcc发出警告太晚了。复制参数时,UB发生在初始调用站点
p(opts)相关:。这没有错,但它不是编译器诊断,这正是问题所要求的。我已经知道并使用了ubsan等人,所以这对我没有帮助。@nmr:我相信我的回答是对这个问题的有效回答,因为这个问题要求“针对这种编程错误的警告”,但没有说明这些警告应该是编译时还是运行时。由于编译时警告对于这些类型的错误来说本质上是不可靠的,因此关注运行时警告似乎是合适的。很抱歉,我的回答对你没有帮助。是的,很公平。我的意思是警告FWIW。它可能会帮助其他人,希望能。