【问题标题】:Is Clang-Tidy's warning about failure to initialize all fields of an anonymous union a false positive?Clang-Tidy 关于未能初始化匿名联合的所有字段的警告是误报吗?
【发布时间】:2020-03-08 20:03:41
【问题描述】:

我在 C++ 项目中有如下代码:

struct Foo {
  union {
    double d = 1.0;
    char c;
  };
};

当我通过 Clang-Tidy 运行它时,它警告我构造函数没有初始化字段 c。但是,当我编译代码时,我没有看到任何有关此联合初始化的警告。

此代码是否存在潜在问题?还是来自 Clang-Tidy 的警告是可以安全忽略的误报?

【问题讨论】:

  • 你好,可以参考一下这个链接“stackoverflow.com/questions/3031605/…”吗?您可能会对您的问题有所了解
  • @Senthuja Btw,专业提示:您可以使用 [ some text ]( some URL ) 创建一个不错的链接。不过,不要在[]() 旁边放置空格。这是故意的,因此它不会创建一个链接来向您展示示例。
  • 对我来说,这看起来像是 clang-tidy 中的一个错误。我看不出初始化一个联合的多个成员有什么意义。

标签: c++ clang-tidy


【解决方案1】:

实际上,在该代码中,您无法初始化这两个变量。检查structs and unions initialization rules。编译器会沿着这条线抛出一些东西Error: only one non-static data member of a union may have a default member initializer。因此,在这种特殊情况中,不仅您可以忽略 Clang 警告,而且您必须这样做。如果是误报或Clang的错误,不能说,但它显然不应该抱怨这个,因为修复这个警告会阻止你的代码编译。

关于这些警告的更一般说明。一个未初始化的变量本身不会破坏你的程序,直到你尝试做一些取决于变量值的事情,然后许多事情可能会发生,一些不好的,一些未知的,还有一些甚至可以正常工作。

通过显式初始化变量,您可以确保它处于一致且已知的状态,在使用该状态时不太可能导致您的程序中断(除非您传递给它的值造成这种情况)。如果您真的知道自己在做什么,或者它们只是没有意义(比如这个),请忽略这些警告,后果自负。

【讨论】:

  • 我相信您对这个特殊警告是误报是正确的。然而,它没有警告一个更大的问题:整个结构在 C++ 中是可疑的。你不能像这样合法地打字。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多