下面给出了来自开源项目的一小段代码,
#ifndef __cplusplus
typedef enum BoolenTag
{
false,
true
} bool;
#endif
#define CRASH() do { \
((void(*)())0)(); \
} while(false)
int main()
{
CRASH();
return 0;
}
你能解释一下上面的代码吗?
很简单,下面给出一步一步的方法,
while(false)语句仅用于测试目的。考虑以下操作,
((void(*)())0)();
可以如下实现,
0; /* 字面量零 */(0); ( ()0 ); /* 0 被强制转换为某种类型 */ ( (*) 0 ); /* 0 转换了一些指针类型 */ ( (*)() 0 ); /* 0 转换为指向某个函数的指针 */ ( void (*)(void) 0 ); /* 将 0 解释为函数的地址, 什么都不接受,什么也不返回 */ ( void (*)(void) 0 )(); /* 调用函数 */
因此,给定的代码正在调用其代码存储在位置零的函数,换句话说,尝试执行存储在位置零的指令。在具有内存保护 (MMU) 的系统上,操作系统将抛出异常(分段错误),而在没有这种保护的系统(小型嵌入式系统)上,它将执行并且错误将进一步传播。