【问题标题】:Search of explicit type conversions in C style: a = (int)b;搜索 C 风格的显式类型转换:a = (int)b;
【发布时间】:2011-09-28 12:11:26
【问题描述】:

我有一个关于此诊断的好处的问题。 一位用户建议我们实现对所有显式类型的搜索 PVS-Studio 分析器中的 C 风格转换。 也就是说,检测这种结构的诊断:

int *x = (int *)y;
float a = float(b);
float c = (float)(d);

其目的是用更安全的方式替换所有这些转换 版本 - reinterpret_cast/static_cast/const_cast。在此过程中 通过这样的重构,代码中的一些缺陷很可能会被检测出来。

当然,这不是检测关键错误,如果我们 实施此诊断,它将位于 [客户的 特定请求]并默认禁用。

但我什至怀疑这种诊断的好处。所以我决定问 其他用户:是否有其他人需要此选项来搜索显式 C风格的类型转换?有人愿意表演这种吗 重构他们的代码?

【问题讨论】:

  • float a = float(b); 不是 C 风格的演员表。此语法由 C++ 引入。
  • @Nawaz 但它的语义与 C 风格的演员表相同,因此也有同样的问题。
  • 如果您的风格指南说“不要使用 C 风格的强制转换”,那么能够以自动化的方式强制执行它会很有用。要求分析没有此类警告可以实现这一点,因此对于任何想要避免它们的人来说都是有用的,即使他们没有重构。

标签: c++ c static-analysis


【解决方案1】:

一个普遍的观点(例如expressed by Stroustrup)是 C 风格的转换很容易隐藏错误。我认为这些观点会促使相当多的人不使用它们,所以我猜反 C-cast 诊断会得到一些使用。我个人不愿意这样做,因为无论如何我都避免使用 C 风格的强制转换,但考虑到遗留代码,我会发现搜索很有用。

【讨论】:

    【解决方案2】:

    我什至会更进一步,一般来说,强制转换是一件坏事,并且大量使用它们的代码是可疑的。对于 C 语言来说当然是这种情况,其中可能发生的隐式转换规则非常有限,并且由语言明确定义。

    由于重载,C++ 稍微复杂一些,但您仍然不需要太多显式强制转换。设计应该始终存在将一种类型转换为另一种类型的唯一路径。

    转换是不好的,因为如果转换的表达式的类型发生变化,它们很容易隐藏问题。在您的示例中,例如,如果 y 从指针类型更改为整数类型。但无论如何,C++ 风格的转换要好得多,因为它们更容易搜索,而且打字真的很痛苦,人们自然会避免使用它们 :) 并且尝试完全禁止 reinterpret_cast 或在至少应该很少见。

    【讨论】:

      【解决方案3】:

      我理解 C++ 转换支持 C 转换的动机(主要是因为 C 转换有时是 static_cast,有时是 reinterpret_cast,有意外的风险)但是......重构已经有效的东西可能会引入甚至意想不到的错误,仅仅是因为你可能会误解原始开发人员的意图...

      除非你正在重新考虑重写逻辑(所以你不是在“逐个声明”地工作,还要理解整体语义),否则我不会这样做。

      【讨论】:

      • @KillianDS:当然可以!特别是如果它不是“我的”代码,而是多年前的东西,并且已经由不同风格的不同开发人员维护。工具和库/编译器的年龄。迟早有时间重新考虑整个代码,而不是“调整”它。那就是我的帖子!
      【解决方案4】:

      是否有其他人需要此选项来搜索 C 风格的显式类型转换?

      是的。这是一种引入/隐藏错误的简单方法(例如,最直接的程序更新可能会产生一些警告或错误)。

      我喜欢 cpp 风格的演员,因为它们很碍眼,而 c 风格的演员很容易被掩盖(这是设计使然)。

      更好的是,通过整个过程并将程序修复为类型安全(cpp 中不需要大多数强制转换)通常是更好的解决方案。

      有人愿意在他们的代码中进行这种重构吗?

      我摆脱了所有旧风格的演员表并一直坚持下去(还有一些错误)。我更快乐。根据您的代码库和您对构建它的开发人员的信任程度,这可能不是一个很好的时间利用方式。这是一个无聊的过程,但最终可能会花费时间来调试 theta 被掩盖的问题(同样,取决于代码库)。

      【讨论】:

        猜你喜欢
        • 2014-12-12
        • 1970-01-01
        • 2022-11-07
        • 1970-01-01
        • 2013-05-16
        • 2011-05-30
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        相关资源
        最近更新 更多