【问题标题】:C++ - Safety of reinterpret_cast for pointer-to-primitivesC++ - 指向原始指针的 reinterpret_cast 的安全性
【发布时间】:2015-06-08 16:44:56
【问题描述】:

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

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*)&amp;data),这是自找麻烦。 reinterpret_cast 会自动使这种类型的铸造操作安全吗?

谢谢。

【问题讨论】:

  • 为什么不是 &static_cast(data)?
  • @KABoissonneault 这样可以保证安全操作吗?我觉得这很明智。谢谢!
  • @KABoissonneault 您不能获取prvalue的地址。那不会编译。
  • @Barry Meh,然后首先将 static_cast (这就是我在第一条评论中的意思)分配给局部变量,然后获取其地址

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


【解决方案1】:

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

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

【讨论】:

  • cmets 中建议的&amp;static_cast&lt;int&gt;(data) 是否安全?
  • 没有。为了安全起见,您需要将 int 转换为 unsigned long:但请检查它是否具有合适的大小。然后调用你的函数,并转换回来,再次检查大小。 numeric_limits 在这里很有帮助。
【解决方案2】:

任何 C 风格的转换都会被解释为特定的 C++ 风格的转换。 C 风格的演员(unsigned long*)&amp;data 真正的意思是reinterpret_cast&lt;unsigned long*&gt;(&amp;data)。当另一个不安全时,其中一个不可能是安全的。

你是对的,这是不安全的。严格来说,通常不是演员阵容本身就是问题,尽管它可能是。只有当data 没有与unsigned long 正确对齐时,演员表本身才是一个问题。实际上,问题在于通过错误类型进行的后续访问。您没有在问题中显示该访问权限,但除非func 只是将input 转换为int *char *,否则这将是一个问题。如果func 确实像那样将其转换回来,那么它应该被声明为采用正确的类型。

【讨论】:

  • cmets 中建议的&amp;static_cast&lt;int&gt;(data) 是否安全?
  • @Dogbert 它甚至不会编译,所以它也不会在运行时出现异常。从这个意义上说,它是安全的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多