如下二种对函数 func 进行的声明:
int func() __attribute__ ((noreturn));
int func() ;
执行结果略会略有不同,如果使用不当,存在被利用的风险,看如下使用:
if(err != 0)
{
func();
exit();
}
dosomething();
GCC 编译器会按 noreturn 的生命把下面的 exit() 函数优化掉,从而导致 err != 0 不会退出而继续执行 dosomething() 函数。在 Linux 内核中的 die_if_kernel 本地拒绝服务漏洞,就是此问题引起。