在C风格中搜索显式类型转换:a =(int)b;

时间:2011-09-28 12:11:26

标签: c++ c static-analysis

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

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

其目的是用更安全的方式取代所有这些转换 版本 - reinterpret_cast / static_cast / const_cast。在此过程中 这种重构可能会检测到代码中的一些缺陷。

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

但我甚至怀疑这种诊断的好处。所以我决定问 其他用户:是否有其他人需要此选项来搜索显式 C风格的类型转换?有人喜欢这样做吗? 在他们的代码中进行重构?

4 个答案:

答案 0 :(得分:2)

一个常见的观点(例如expressed by Stroustrup)是C风格的演员表容易隐藏错误。我认为这些观点会激励很多人不使用它们,所以我认为反C-cast诊断会得到一些用处。我个人不会这样做,因为我无论如何都避免使用C风格的演员,但鉴于遗留代码,我发现搜索很有用。

答案 1 :(得分:0)

我甚至会走得更远,一般来说演员是一件坏事,使用它们的代码很多都是可疑的。这当然是C的情况,其中可能发生的隐式转换规则非常有限并且由语言很好地定义。

由于重载,C ++有点复杂,但是,你不应该需要很多显式的强制转换。设计应始终是这样的,即有一种独特的路径可以将一种类型转换为另一种类型。

强制转换很糟糕,因为如果转换表达式的类型发生更改,它们很容易隐藏问题。在您的示例中,例如,y从指针类型更改为整数类型。但无论如何,C ++风格的演员阵容要好得多,不管它们是否更易于搜索,而且输入真是一种痛苦,人们自然会避开它们:)并试着完全禁止reinterpret_cast或者至少应该是非常罕见的。

答案 2 :(得分:0)

我理解C ++的动机倾向于支持C cast(主要是因为C cast有时是static_cast,有时是reinterpret_cast,有惊喜的风险)但是......重构已经有效的东西可能会引入意想不到的错误,仅仅因为你可能误解了原始开发者将要做的事情......

除非您正在重新考虑重写逻辑(因此您不是“逐句声明”,而是理解整体语义),否则我不会这样做。

答案 3 :(得分:0)

  

还有其他人需要这个选项来搜索C风格的显式类型转换吗?

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

我喜欢cpp样式演员,因为它们是眼睛,而c样式演员很容易被模糊(这是设计)。

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

  

有人想在他们的代码中执行这种重构吗?

我摆脱了所有旧式的演员阵容并沿途坚持下去(一些错误也是如此)。我更开心根据您的代码库和您构建它的开发人员的信任程度,它可能不是很好用的时间。这是一个无聊的过程,但时间可能最终被用于调试theta被屏蔽的问题(再次,取决于代码库)。