C++ - reinterpret_cast 的指向基元指针的安全性
C++ - Safety of reinterpret_cast for pointer-to-primitives
我在评估的项目中遇到了一段代码,想知道以下转换是否安全:
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
会自动使这种类型的铸造操作安全吗?
谢谢。
不,这不安全:程序行为未定义。
这是因为指针类型不相关。
任何 C 风格的转换都会被解释为特定的 C++ 风格的转换。 C 风格的转换 (unsigned long*)&data
实际上意味着 reinterpret_cast<unsigned long*>(&data)
。当其中一个不安全时,其中一个是安全的是不可能的。
你是对的,这是不安全的。严格来说,问题通常不是演员阵容本身,尽管也有可能。如果 data
没有为 unsigned long
正确对齐,则转换本身只是一个问题。这实际上是通过错误类型进行的后续访问,这才是问题所在。您没有在您的问题中显示该访问权限,但除非 func
只是将 input
强制转换回 int *
或 char *
,否则这将是一个问题。如果 func
确实像那样将其转换回去,那么它应该声明为采用正确的类型。
我在评估的项目中遇到了一段代码,想知道以下转换是否安全:
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
会自动使这种类型的铸造操作安全吗?
谢谢。
不,这不安全:程序行为未定义。
这是因为指针类型不相关。
任何 C 风格的转换都会被解释为特定的 C++ 风格的转换。 C 风格的转换 (unsigned long*)&data
实际上意味着 reinterpret_cast<unsigned long*>(&data)
。当其中一个不安全时,其中一个是安全的是不可能的。
你是对的,这是不安全的。严格来说,问题通常不是演员阵容本身,尽管也有可能。如果 data
没有为 unsigned long
正确对齐,则转换本身只是一个问题。这实际上是通过错误类型进行的后续访问,这才是问题所在。您没有在您的问题中显示该访问权限,但除非 func
只是将 input
强制转换回 int *
或 char *
,否则这将是一个问题。如果 func
确实像那样将其转换回去,那么它应该声明为采用正确的类型。