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

C++ 在C风格中搜索显式类型转换:a=(int)b;,c++,c,static-analysis,C++,C,Static Analysis,我有一个关于这个诊断的好处的问题。 一位用户建议我们实现所有显式类型的搜索 在PVS Studio analyzer中以C样式进行转换。 即,用于检测此类构造的诊断: int *x = (int *)y; float a = float(b); float c = (float)(d); 其目的是将所有这些转换替换为更安全的转换 版本-重新解释类型/静态类型/常量类型。在这个过程中 在这种重构中,代码中的一些缺陷很可能被检测出来 当然,这不是关键错误的检测,如果我们 执行此诊断,将在[客户的

我有一个关于这个诊断的好处的问题。 一位用户建议我们实现所有显式类型的搜索 在PVS Studio analyzer中以C样式进行转换。 即,用于检测此类构造的诊断:

int *x = (int *)y;
float a = float(b);
float c = (float)(d);
其目的是将所有这些转换替换为更安全的转换 版本-重新解释类型/静态类型/常量类型。在这个过程中 在这种重构中,代码中的一些缺陷很可能被检测出来

当然,这不是关键错误的检测,如果我们 执行此诊断,将在[客户的 特定请求]并在默认情况下禁用

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

一个常见的观点(例如)是C风格的强制转换容易隐藏错误。我假设这些观点会促使相当多的人不使用它们,所以我想反C-cast诊断会得到一些使用。我个人不想这样做,因为我避免了C风格的强制转换,但考虑到遗留代码,我会发现搜索很有用

我甚至更进一步,一般来说,强制转换是一件坏事,经常使用它们的代码是可疑的。这对于C语言来说当然是如此,其中可能发生的隐式转换规则是非常有限的,并且由语言很好地定义

由于重载,C++有点复杂,但仍然不需要太多显式强制转换。一个设计应该总是有一个独特的路径将一种类型转换成另一种类型


强制转换是不好的,因为如果强制转换的表达式类型发生更改,它们很容易隐藏问题。例如,在您的示例中,如果将
y
从指针类型更改为整数类型。但是,无论如何C++ C++风格的转换都是更好的,仅仅是它们更容易搜索,这是一种痛苦的类型,人们自然会避免它们:)并且试图完全禁止<代码> RealTytPase完全或至少应该是非常罕见的。(基本上是因为C cast有时是静态的,有时是重新解释的,可能会带来意外的风险)但是…重构已经工作的东西可能会引入甚至意想不到的错误,因为你可能会误解最初的开发人员将要做的事情

除非您重新考虑重写逻辑(因此您不是在“逐个语句”工作,而是在理解整个语义),否则我不会这么做

其他人是否需要此选项来搜索C样式中的显式类型转换

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

我喜欢cpp样式的类型转换,因为它们很碍眼,而c样式的类型转换很容易被遮挡(这是出于设计)

更好的是,通过这个过程并将程序固定为类型安全的(在cpp中大多数强制转换是不必要的)通常是更好的解决方案

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


我摆脱了所有旧式的强制转换,并一直坚持下去(还有一些bug)。我更高兴。取决于你的代码库和你对构建它的开发人员的信任程度,这可能不是一个很好的时间利用。这是一个无聊的过程,但时间可能最终花在调试theta被掩盖的问题上(再次,依赖于代码库).< /p> <代码>浮点A=浮法(b);< /Cord>不是C样式的CAST。这个语法是用C++来介绍的。@纳瓦兹,但是它的语义与C风格的CAST完全相同,因此也有同样的问题。如果你的样式指南说“不要使用C样式的铸件”然后,能够以自动化的方式强制执行这一点是很有用的。要求分析不包含这类警告将实现这一点,因此,对于任何想要避免这些警告的人来说,即使他们不进行重构,这也是很有用的。@KillianDS:当然可以!特别是如果不是“我的”代码,但它已经存在多年了,并且已经由不同的开发人员以不同的风格维护。工具和库/编译器已经过时。迟早会有时间重新考虑整个代码,而不是“调整”它。在这篇文章中,sanse是我的帖子!