【问题标题】:Can gcc warn when constructor-style casts behave like old-style casts?当构造函数风格的强制转换表现得像旧风格的强制转换时,gcc 会发出警告吗?
【发布时间】:2021-12-02 19:23:45
【问题描述】:

出于多种原因,应避免使用旧式强制转换。 gcc 提供了方便的-Wold-style-casts 来检测它们。这可以正常工作,但对于非类类型,构造函数样式转换的行为与旧样式转换完全相同,只是减去了警告。

例子:

struct T {};
int main() {
  int const* a = nullptr;
  using Tp = T*; // float*, unsigned*, pick whatever
  Tp b = Tp(a); // <---- hidden old-style cast: (Tp)a
  *b = T{}; // ub
}

这个节目compiles without problems,甚至还展出了UB。如果 Tp 是一个类类型并且有一个接受 a 类型的构造函数,那么构造函数语法就可以了。

除了-Wold-style-cast 所做的事情之外,我试图只检测语法会隐藏旧式转换的情况

【问题讨论】:

  • c 样式转换为(type)objecttype(object) 称为函数样式转换,警告未涵盖
  • @NathanOliver 是的,我意识到它没有被涵盖,我正在尝试找到一种方法来获得type(object) 的警告,如果类型是非类类型。
  • 你可以开始使用 C++ 风格的强制转换。 static_cast&lt;Tp&gt;(a) 将导致没有任何编译器标志的错误。
  • @bitmask 您需要修改编译器以添加所需的警告。
  • @NathanOliver:我愿意。不幸的是,代码库中充满了它们。

标签: c++ gcc casting compiler-warnings


【解决方案1】:

有一个 bugzilla 条目 Bug 69818 - warn for C++ functional cast expression on pointer or reference (i.e. add -Wfunctional-cast) 为 gcc 提出了这样的功能。

Chris Studholme 提出了两种替代方案

A) 对目标为指针或引用类型的所有函数转换表达式发出警告,或

B) 对目标为指针或引用类型的所有函数转换表达式发出警告,并且等效的 static_cast() 表达式会产生错误。

在后面的评论中

另一种选择可能是扩展 -Wold-style-cast 以涵盖功能转换的这些有问题的使用,而不是添加新的警告。

虽然,在线程中,对于首选方式没有明确的共识,它是“尚未分配给任何人”,最后一个贡献是从 2018 年开始(该错误是为 5.2.1 提交的)。

据我所知,新版本的 gcc 没有任何变化。

【讨论】:

  • 这听起来很接近我正在寻找的东西,这将确认在 gcc 中没有办法做到这一点。但是,仅限于指针/引用类型(相对于非类类型)的限制让我有点难以理解。
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 2010-09-27
  • 2017-02-11
  • 2023-03-16
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多