【问题标题】:usage of void pointer in c/c++c/c++中空指针的使用
【发布时间】:2011-07-04 17:34:12
【问题描述】:

嘿,我想知道在使软件更安全、更灵活方面,如何在现实世界中应用 void 指针。 例如,我知道 void 指针,它将投射到的指针隐藏在外部,这将使软件更加安全。 还有其他原因会使用 void 指针吗?

【问题讨论】:

  • void* 在 C++ 中几乎没有用处:当您诉诸使用 void* 时,您将失去所有类型安全性。在 C 中,有时这是必要的,尤其是在您想编写通用代码时;在 C++ 中,模板和继承几乎总是可以用来避免void*
  • @Ignacio 取决于 OP 的安全含义。如果他的意思是像加密一样安全,那么我会同意,但是如果他的意思是安全的,就像抗逆向一样,那么不透明确实是唯一的安全性。

标签: c++ c security pointers void-pointers


【解决方案1】:

即使在 C 语言中也没有任何借口可以像您提到的那样使用 void*。使用指向不完整类型的指针会更好。

typedef struct myInternal myInternal;
myInternal* getIt(void);
int doIt(myInternal*);

这样,您就具有向用户隐藏内部结构/实现的相同效果。但是使用它进行编程要容易得多,特别是用户不能像这样混合不同的不透明界面。

【讨论】:

    【解决方案2】:

    使用 void * 的典型原因是为 API/库的用户提供上下文。提供的上下文通常是一个指针,而 void * 使其不透明。库开发人员遇到的问题是在将 void * 传回时验证它。这可能非常具有挑战性。事实上,图书馆最好向用户提供一个标识符,该标识符可以更容易地验证,而无需暴露内部数据。

    换句话说,如果您正在考虑使用 void *,请不要。

    【讨论】:

      【解决方案3】:

      例如,我知道 void 指针,它将转换为什么指针 隐藏在外面,这将使 更安全的软件。

      编译后,汇编代码中没有任何明显的东西可以揭示指针的类型,因为类型是一个更高级别的概念——在汇编代码中只有寄存器宽度。 (理论上,通过研究汇编代码,您可能可以推断出数据类型的大小以及各种字段的用途,但使用 void 指针不会改变这一点。但我离题了。)

      话虽如此,“外部”知道指针类型的唯一另一种方式是通过您提供的 API(可能通过头文件)。但这是拥有 API 的优势之一——允许其他人向您传递指针绝对不能保证您在内部使用该类型。

      【讨论】:

        【解决方案4】:

        无效指针不会使软件更加安全。

        在 c 中使用 void* 的原因是多态性的一种形式 - 如果您不知道数据是什么类型,您可以传递一个 void*

        在 C++ 中,使用 void* 的需求较少,并且该语言阻止了某些 C 使用

        【讨论】:

        • @James - 我同意,我本来想说永远不会,但 C++ 的某些角落肯定需要 void*
        猜你喜欢
        • 1970-01-01
        • 2011-11-24
        • 2011-09-17
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多