首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用重新定义空指针指向匿名结构的指针?

使用重新定义空指针指向匿名结构的指针?
EN

Stack Overflow用户
提问于 2016-12-14 18:01:56
回答 1查看 997关注 0票数 17

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

代码语言:javascript
复制
/* 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 *的逻辑。"bizzare破坏企图“暗示了一种什么样的黑客行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-14 18:12:30

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

在C中,void*在没有警告的情况下被透明地转换为任何其他非void*非常数数据指针类型(这是由语言设计的)。

使用非空指针类型可确保仅在EFI_HANDLE所属的位置使用EFI_HANDLE。当你把它传递到其他地方而不是EFI_HANDLE,而是指向其他东西的指针时,编译器的类型检查会踢你的腹股沟。

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

代码语言:javascript
复制
#include <string.h>

#define EFI_HANDLE void*

int main()
{
    EFI_HANDLE handle = NULL;

    strcpy(handle, "Something");
}

将别名更改为:

代码语言:javascript
复制
typedef struct {} *EFI_HANDLE;

将获得随之而来的“不兼容指针类型”编译时错误。

最后,作为一个匿名结构,没有任何无用的结构标记名添加到已经被污染的名称空间中,您可以(无意中或恶意地)使用它。

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

https://stackoverflow.com/questions/41139714

复制
相关文章

相似问题

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