sbh*_*tla 1 c pointers static-analysis coverity
对代码执行静态分析(SA)时收到警告。我在下面做了简化(带有第一个警告)-
typedef struct testStruct_ {
int *ptr;
} testStruct;
testStruct a;
testStruct *a_ptr;
a_ptr = &a;
a_ptr->ptr = NULL; #WARNING: Directly dereferencing pointer a_ptr.
Run Code Online (Sandbox Code Playgroud)
该代码继续对进行一些操作a_ptr。为了完成起见,我发布了一个示例-
rc = fn_a (filename, a_ptr);
rc = fn_b (a_ptr);
rc = fn_c (a_ptr->ptr);
Run Code Online (Sandbox Code Playgroud)
fn_a定义为-
fn_a (const char *filename, testStruct *a_ptr)
{
a_ptr->ptr = fn_a_2(filename);
if (!a_ptr->ptr) {
ERR("Loading (%s) failed", filename);
return (FALSE);
}
return (TRUE);
}
Run Code Online (Sandbox Code Playgroud)
稍后,我又收到另一条警告:
if (a_ptr && a_ptr->ptr) {
freeFn(a_ptr->ptr);
}
#WARNING: Dereference before NULL check - NULL checking a_ptr suggests that it may be NULL, but it has already been dereferenced on all paths leading up to the check.
Run Code Online (Sandbox Code Playgroud)
似乎该线路a_ptr->ptr = NULL被认为是不正确/危险的。为什么会显示此错误,并且有纠正方法?
Coverity会警告您,因为您实际上正在执行NULL检查:
if (a_ptr && a_ptr->ptr) {
Run Code Online (Sandbox Code Playgroud)
在这里,a_ptr是在布尔上下文中评估的。如果a_ptr不为NULL ,则评估为true 。
如果取消引用指针,然后再对其进行NULL检查,则Coverity抛出此警告。这意味着两件事之一:
在这种特殊情况下,您将显式设置a_ptr为变量的地址,因此此时该值不可能为NULL。如果您在上述if语句之前没有再次设置它,则意味着NULL检查是不必要的,应将其删除。
| 归档时间: |
|
| 查看次数: |
6127 次 |
| 最近记录: |