我在一个我正在评估的项目中遇到过一段代码,并想知道以下演员是否安全:
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
是否自动使这种类型的铸件安全运行?
谢谢。
答案 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
投回input
或int *
,否则即可是个问题。如果char *
确实将它强制转换回来,那么它应该被声明为采用正确的类型。