1

我在对我的代码进行静态分析 (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被认为是不正确/危险的。为什么会显示这个错误,有没有办法纠正它?

4

1 回答 1

7

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

if (a_ptr && a_ptr->ptr) {

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

如果您取消引用指针,然后稍后对其进行 NULL 检查,则 Coverity 会引发此警告。这意味着两件事之一:

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

在这种特殊情况下,您明确设置a_ptr了变量的地址,因此此时它不可能为 NULL。如果在上述语句之前没有再次设置if,则表示 NULL 检查是不必要的,应该删除。

于 2015-10-13T21:26:38.893 回答