如何标记永不返回的函数以消除空指针解引用警告?
如何标记永不返回的函数以规避空指针解引用警告?
你有一个简化后的Crash函数:
void Crash(void) { exit(100); }
在其他代码中,当你写出如下逻辑时:
... if (val == NULL) Crash(); *val = something; // 此处出现空指针解引用警告
编译器会在*val = something;行触发空指针解引用警告——因为它不知道调用Crash()后程序不会继续往下执行。现在想知道有没有办法直接标记Crash为永不返回的函数,不用额外加return;来规避警告(比如不用写成下面这种冗余形式):
if (val == NULL) { Crash(); return; // 避免编译器警告 }
可行方案
标准C(C11及以上)
用C标准规定的_Noreturn说明符标记函数,这是跨编译器的标准写法:
#include <stdlib.h> _Noreturn void Crash(void) { exit(100); }
添加_Noreturn后,编译器能识别到调用这个函数后不会回到调用点,自然就不会再触发后续的空指针解引用警告。
GCC/Clang 编译器扩展
如果用GCC或Clang,可以使用__attribute__((noreturn))属性,两种写法都可以:
写法1:先声明再定义
#include <stdlib.h> void Crash(void) __attribute__((noreturn)); void Crash(void) { exit(100); }
写法2:直接在定义上添加属性
#include <stdlib.h> void Crash(void) __attribute__((noreturn)) { exit(100); }
MSVC 编译器
针对微软MSVC,使用__declspec(noreturn)标记:
#include <stdlib.h> __declspec(noreturn) void Crash(void) { exit(100); }
内容的提问来源于stack exchange,提问作者Oldes
相关产品推荐
相关产品推荐

