首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全铸造结构指针

安全铸造结构指针
EN

Stack Overflow用户
提问于 2012-09-22 23:53:28
回答 8查看 9.9K关注 0票数 3

我一直认为,在将空*转换到struct*之后检查指针是避免无效转换的有效方法。有点像

代码语言:javascript
复制
MyStructOne* pStructOne = (MyStructOne*)someVoidPointer;
if(!pStructOne)
   return 0;

情况似乎并非如此,因为我可以将相同的数据转换为两个不同的结构,并获得相同的有效地址。然后,该程序很乐意用任意随机数据填充我的struct字段。

什么是转换结构指针的安全方法?

我不能使用dynamic_cast<>,因为它不是类。

谢谢你的帮助!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-09-23 00:15:53

如果您对struct布局有任何控制,可以将您自己的类型枚举放在每个结构的前面,以验证该类型。这在C和C++中都是有效的。

如果不能使用枚举,因为并非所有类型都提前知道,则可以使用GUID。或指向每个结构唯一的静态变量或成员的指针。

票数 2
EN

Stack Overflow用户

发布于 2012-09-22 23:59:45

您可以在结构或类中使用dynamic_cast,只要它有一个虚拟方法。我建议您重新设计您的更广泛的系统,使其没有任何地方的void*。这是非常糟糕的做法/设计。

票数 1
EN

Stack Overflow用户

发布于 2012-09-23 00:07:36

一般说来,没有“安全的铸造方法”,因为铸造指针本身就是一个不安全的过程。强制转换说,您比类型系统更了解,所以在开始转换指针之后,您不能期望类型系统会有任何帮助。

在C++中,您不应该使用C风格的强制转换(如(T) x),而应该使用C++强制转换。现在,有几个简单的规则可以让您确定转换指针或引用是否可以:

  • 如果您向坏的方向const_cast并修改该对象,则必须确保该对象实际上是可变的。
  • 您只能在多态层次结构中使用static_cast指针或引用,或者从指针到空指针。必须确保对象的动态类型是强制转换目标的子类型,或者在无效指针的情况下,指针是正确类型对象的地址。
  • reinterpret_cast只应该用于或来自char *类型(可能是signedunsigned),也不能用于将指针与(u)intptr_t之间的指针转换。

在任何情况下,您都有责任确保所讨论的指针或引用到您在强制转换中声明的类型的对象。没有其他人可以为你做的检查来验证这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12548619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档