SAL注解C/C++函数:解决cl.exe静态分析C6011空指针警告
解决CL.exe静态分析C6011警告的SAL注解方案
当使用Microsoft的cl.exe编译器并开启/analyze静态分析选项时,会遇到这样的问题:调用自定义的check_ptr函数确认指针非空后,解引用指针仍触发如下警告:
warning C6011: Dereferencing NULL pointer 'foo'
原函数与调用代码
check_ptr函数定义:
bool check_ptr(void* ptr) { if (!ptr) { // 原函数包含更多操作,即使删除也能复现问题 return false; } return true; }
调用代码:
foo_t* foo = lookup_foo(id); if (!check_ptr(foo)) return; foo->bar = 4711; // 触发C6011警告
静态分析器无法识别check_ptr的逻辑,只有将函数简化为直接返回!!ptr时,分析器才能判定指针非空,但这种简化不符合实际需求。
解决方案:添加SAL注解
通过给check_ptr添加特定SAL注解,可让静态分析器明确:当函数返回true时,传入的指针参数不为NULL。修改后的函数如下:
#include <sal.h> _When_(return == true, _Post_notnull_) bool check_ptr(_In_ void* ptr) { if (!ptr) { // 保留原函数的所有操作 return false; } return true; }
注解说明
_In_:标记参数为输入值,告知分析器跟踪该参数的状态_When_(return == true, _Post_notnull_):明确指定当函数返回true时,传入的指针参数非空。分析器会据此在check_ptr(foo)返回true的代码路径中,判定foo不为NULL,从而消除C6011警告。
内容的提问来源于stack exchange,提问作者Johann Gerell
相关产品推荐
相关产品推荐

