2016-11-30 82 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

相關問題