我正在使用 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/