首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在使用这个未初始化的变量时发出警告?

有没有办法在使用这个未初始化的变量时发出警告?
EN

Stack Overflow用户
提问于 2020-09-30 07:06:02
回答 1查看 104关注 0票数 4

我有一个小程序,如下所示,它在结构中使用一个未初始化的字段。我用-Wuninitialized -Wmissing-field-initializers -Wall -Wextra -Werror (下面的Godbolt)编译程序,程序编译正常并运行,但在读取结构时打印未初始化的垃圾值。

在使用未初始化变量的情况下,有没有办法对这种编程错误发出警告?

代码语言:javascript
复制
#include <stdio.h>

enum FWPixelDepth {
    FWPixelDepthColor8888,
};

struct FWBitmapDecodeOptions {
    FWPixelDepth pixelDepth;
    float scale;
    bool decodeWithoutPremultiply;
};

static void p(FWBitmapDecodeOptions opts) {
    printf("%d, %f, %d", opts.pixelDepth, opts.scale, opts.decodeWithoutPremultiply);
}

int main() {
    FWBitmapDecodeOptions opts;
    opts.decodeWithoutPremultiply = true;
    p(opts);
}

https://godbolt.org/z/cjc8cY

Clang 8.0.0标志:-O3 -Wuninitialized -Wmissing-field-initializers -Wall -Wextra -Werror

示例输出:

代码语言:javascript
复制
-1557482600, 0.000000, 1
EN

回答 1

Stack Overflow用户

发布于 2020-09-30 07:32:57

与其他编程语言不同,在C++中,当使用带有POD type的变量时,通常无法在运行时检测该变量是否已初始化。为了检测到这一点,每个变量都需要一个相关的标志,用于指定变量是否已初始化。这将耗费大量的空间和性能。因此,这种运行时检查通常只由一些高级编程语言完成。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64128809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档