C ++ - 指针到基元的reinterpret_cast的安全性

时间:2015-06-08 16:44:57

标签: c++ casting type-safety reinterpret-cast

我在一个我正在评估的项目中遇到过一段代码,并想知道以下演员是否安全:

void func(unsigned long* input);
...
int data = 42;
func(reinterpret_cast<unsigned long*>(&data));  
// Casting to remove compiler warnings about data type not matching type expected

我知道只需简单的C风格演员(即:(unsigned long*)&data),这就是在寻找麻烦。 reinterpret_cast是否自动使这种类型的铸件安全运行?

谢谢。

2 个答案:

答案 0 :(得分:4)

不,不安全:程序行为未定义。

这是因为指针类型不相关。

答案 1 :(得分:2)

任何C风格的演员表都被解释为特定的C ++风格演员表。 C风格的演员<html> <head> <title>HTA Test</title> <HTA:APPLICATION ID="objTest" APPLICATIONNAME="HTA Test" SCROLL="no" SINGLEINSTANCE="yes" > </head> <SCRIPT LANGUAGE="VBScript"> Sub TestSub Dim height Dim width height = h.Value width = w.Value myCMD = "CMD for /r ""C:\hta\photos\"" %%X in (*) do (""C:\hta\resize.exe"" -i""C:\hta\photos\%%~nX%%~xX"" -o""C:\hta\resized\%%~nX%%~xX"" -s800x600) PAUSE" Set WshShell = CreateObject("WScript.Shell") WshShell.exec(myCMD) End Sub </SCRIPT> <body> Width <input type="text" name="w" size="10" value="320"><br> Height <input type="text" name="h" size="10" value="240"><br> <input type="submit" name="" value="sub" onClick="TestSub"> </body> 实际上意味着(unsigned long*)&data。当另一个不安全时,其中一个是不可能安全的。

你是对的,这是不安全的。严格来说,它通常不是演员本身的问题,尽管它可能是。如果reinterpret_cast<unsigned long*>(&data)没有与data正确对齐,则投射本身只是一个问题。它实际上是通过错误类型的后续访问,这是问题所在。您不会在自己的问题中显示该访问权限,但除非unsigned long仅将func投回inputint *,否则即可是个问题。如果char *确实将它强制转换回来,那么它应该被声明为采用正确的类型。