如何让Clang静态分析器检测到_Nullable参数的空指针解引用?
问题:Clang静态分析器未检测到_Nullable指针的空解引用错误
我尝试通过为函数参数添加_Nullable修饰符,让Clang静态分析器检测空指针解引用错误,编写了如下代码:
int my_function(int * _Nullable ptr) { printf("read: %d\n", ptr[1]); return 1; }
使用scan-build-17启用空性检查器执行分析:
scan-build-17 --use-cc=clang -enable-checker nullability.NullableDereferenced -enable-checker nullability.NullablePassedToNonnull -enable-checker nullability.NullablePassedToNonnull -enable-checker nullability.NullableReturnedFromNonnull -o ./report -v make
但Clang静态分析器未检测到空解引用错误,而使用Facebook Infer执行infer -- make却成功检测到问题:
func.c:10: error: Null Dereference pointer `ptr` could be null and is dereferenced at line 10, column 23. 8. // return 0; 9. 10. printf("read: %d\n", ptr[1]); ^ 11. 12.
请问配置Clang静态分析器时是否遗漏了什么?
解决方案
你遗漏了几个关键配置,导致Clang静态分析器没有严格处理_Nullable注解:
- 启用Nullability检查的核心配置:需要添加
-Xclang -analyzer-config -Xclang nullability:NullablePtrsAreChecked=true选项,这个配置强制Clang将_Nullable指针视为可能为空的对象,触发对应的空解引用检查。 - 补充基础空指针检查器:单独启用nullability系列检查器不够,建议添加
core.NullDereference基础空指针检查器,它能和nullability检查器配合,覆盖更多空指针场景。 - 清理重复的检查器配置:你的命令里重复启用了
nullability.NullablePassedToNonnull,可以删除重复项。 - 确保编译时的注解支持:如果是C语言代码,建议添加
#include <nullability.h>头文件,确保_Nullable注解被Clang正确识别(新版本Clang默认支持,但显式包含头文件能避免环境差异问题)。
修正后的scan-build命令示例:
scan-build-17 --use-cc=clang \ -enable-checker core.NullDereference \ -enable-checker nullability.NullableDereferenced \ -enable-checker nullability.NullablePassedToNonnull \ -enable-checker nullability.NullableReturnedFromNonnull \ -Xclang -analyzer-config -Xclang nullability:NullablePtrsAreChecked=true \ -o ./report -v make
另外,确保makefile中的编译命令使用clang,并且开启了基础警告(如-Wall),静态分析依赖完整的编译信息才能准确检测问题。
内容的提问来源于stack exchange,提问作者prgbenz
相关产品推荐
相关产品推荐

