c - 使用将 void 指针重新定义为指向匿名结构的指针?

标签 c uefi

我正在使用 UEFI与驱动程序相关的代码,我遇到了这个:

/* EFI headers define EFI_HANDLE as a void pointer, which renders type
* checking somewhat useless. Work around this bizarre sabotage
* attempt by redefining EFI_HANDLE as a pointer to an anonymous
* structure.
*/
#define EFI_HANDLE STUPID_EFI_HANDLE
#include <ipxe/efi/Uefi/UefiBaseType.h>
#undef EFI_HANDLE
typedef struct {} *EFI_HANDLE;

完整源码在这个路径 http://dox.ipxe.org/include_2ipxe_2efi_2efi_8h_source.html

这是我第一次接触匿名结构,我无法理解将 void * 重新定义为指向匿名结构的指针的逻辑。 “奇怪的破坏企图”暗示了什么样的黑客行为?

最佳答案

该库正在对 EFI_HANDLE 中保存的地址后面的内部数据对象使用信息隐藏。但在这样做的过程中,他们使代码容易受到意外错误的影响。

在 C 中,void* 被透明地转换为任何 其他非void* 非常量数据指针类型而不会发出警告(这是语言设计)。

使用非空指针类型可确保 EFI_HANDLE 仅在 EFI_HANDLE 所属的位置使用。当您将它传递到不是 EFI_HANDLE 而是指向其他内容的指针的其他地方时,编译器的类型检查会让您感到不安。

例如:作为void*,这将在没有警告或错误的情况下编译

#include <string.h>

#define EFI_HANDLE void*

int main()
{
    EFI_HANDLE handle = NULL;

    strcpy(handle, "Something");
}

将别名更改为:

typedef struct {} *EFI_HANDLE;

将收获随后的“不兼容指针类型”编译时错误。

最后,作为一个匿名结构,没有无意义的结构标记名称添加到您可以使用(意外或恶意)的已经污染的 namespace 。

关于c - 使用将 void 指针重新定义为指向匿名结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41139714/

相关文章:

java - C服务器和Java客户端之间的UDP连接

c++ - C/C++ 中两个字符的总和

operating-system - 如何通过代码将 efi 应用程序设置为引导加载程序?

shell - 从 UEFI 应用程序内部运行 UEFI shell 命令

linux - 从 Linux-EFI 链式加载 Windows-EFI

c - 使用数组和双向链表存储书籍的数据结构

将结构内的元素与 C 中的空指针值进行比较

c - 不理解 Hopper 反编译器的输出

c++ - 编译cpp源仅在c支持下运行

c - 将 C 库移植到 UEFI