我正在使用与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 *
的逻辑。"bizzare破坏企图“暗示了一种什么样的黑客行为?
发布于 2016-12-14 18:12:30
该库在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;
将获得随之而来的“不兼容指针类型”编译时错误。
最后,作为一个匿名结构,没有任何无用的结构标记名添加到已经被污染的名称空间中,您可以(无意中或恶意地)使用它。
https://stackoverflow.com/questions/41139714
复制相似问题