获得警告 - 在C代码中可能为空之前取消引用

时间:2015-10-13 20:55:03

标签: 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.

代码继续使用a_ptr执行多项操作。 为了完成,我发布了一个例子 -

rc = fn_a (filename, a_ptr);
rc = fn_b (a_ptr);
rc = fn_c (a_ptr->ptr);

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);
}

稍后,我又收到另一个警告:

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.

似乎行a_ptr->ptr = NULL被视为不正确/危险。为什么会显示此错误,是否有办法纠正错误?

1 个答案:

答案 0 :(得分:4)

Coverity会给你一个警告,因为你实际上正在做一个NULL检查:

if (a_ptr && a_ptr->ptr) {

这里,a_ptr在布尔上下文中计算。如果a_ptr不为NULL,则计算结果为true。

Coverity抛出此警告,如果您取消引用指针然后再对其执行NULL检查。这意味着以下两件事之一:

  • 指针实际上可能是NULL,并且在NULL检查之前的任何取消引用都可能导致NULL指针取消引用,因此您需要更快地进行NULL检查或者不要在此时进行解引用。
  • NULL检查是不必要的,因为指针不能为NULL,因此应该删除NULL检查。

在这种特殊情况下,您明确地将a_ptr设置为变量的地址,因此此时它不可能为NULL。如果在上述if语句之前没有再次设置它,则意味着不需要进行NULL检查,应该将其删除。