繁体   English   中英

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

[英]Search of explicit type conversions in C style: a = (int)b;

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

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

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

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

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

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

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

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

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

我理解C ++的动机倾向于C cast(主要是因为C cast有时是static_cast,有时是reinterpret_cast,有惊喜的风险)但是......重构已经有效的东西可能会引入意想不到的错误,仅仅因为你可能误解了什么最初的开发人员要做...

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM