2016-11-30 80 views
3

由于cppcheck cstyleCast样式警告,我试图消除代码库中的所有C风格转换。将C风格转换为static_cast总是安全吗?

将C型转换为static_cast总是安全吗?

安全,我的意思是,有一种情况,旧的C风格演员将工作正常,但static_cast会引发错误或未定义的行为?

type1 a; 
type2 b = (type2)a;    // C style cast 
type2 b = static_cast<type2>(a); // Is this always a valid replacement for above cast? 
+3

C cast可能是一个'const_cast',但在这种情况下,您将有'static_cast'的编译时错误。 – Jarod42

回答

6

C样式转换一般是static_cast<>reinterpret_cast<>const_cast<>组合。编译时错误可能会由static_cast<>替换。

我不知道任何运行时错误的情况。

您可以从static_cast<>开始,然后添加(或替换为)const_cast<>,其中出现编译时错误。如果在此之后仍然存在编译时错误,则需要reinterpret_cast<>。但不要盲目替换 - 这些情况中的一些可能是bug。例如,如果数据类型是前向声明的但未定义的,那么可能需要reinterpret_cast<>,这导致未指定的行为(并且如果涉及多重继承,肯定会导致问题)。

查找这些类型的错误是此练习提高源代码安全性的原因,也是为什么静态代码分析器标记C风格演员表的原因。

2

C-风格演员阵容和static_cast不等于。

有没有一种情况,旧的C风格转换可以正常工作,但static_cast会引发错误或未定义的行为?

举个例子:

int main() { 
    using FI = int(*)(); 
    using FV = void(*)(); 
    FI fi = nullptr; 
    FV fv = (FV)fi; 
    //FV fv2 = static_cast<FV>(fi); 
} 

如果取消对使用static_cast行,代码不编译。
请注意,在这种情况下,您应该使用reinterpret_cast

+1

如果代码不能编译。然后它是安全的(因为你的代码没有引入错误)。你们正在合作安全和有效,这是不同的概念。 –

+1

@LokiAstari不完全。 OP询问了一个情况,其中'static_cast'会引发一个错误,并且一个C风格的转换可以工作(引用)。在答案中有这种情况。我没有说它是有效或安全的,我只发布了一个反映OP要求的例子。就这样。老实说,我没有得到他所说的安全。一个UB可能不安全,但是一个错误是足够安全的,你可以在发布之前纠正它。 – skypjack

相关问题