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

获取警告-在C代码中可能为null之前取消引用,c,pointers,static-analysis,coverity,C,Pointers,Static Analysis,Coverity,我在对代码进行静态分析(SA)时收到警告。我已将其简化如下(第一个警告)- 代码继续使用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);

我在对代码进行静态分析(SA)时收到警告。我已将其简化如下(第一个警告)-

代码继续使用
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
被视为不正确/危险。为什么会显示此错误?是否有方法更正此错误?

Coverity会向您发出警告,因为您实际上正在执行空检查:

if (a_ptr && a_ptr->ptr) {
这里,
a_ptr
是在布尔上下文中计算的。如果
a_ptr
不为空,则其计算结果为true

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

  • 指针实际上可能是空的,在该空检查之前的任何取消引用都可能导致空指针取消引用,因此您需要尽早执行空检查,或者在该点不取消引用
  • 空检查是不必要的,因为指针不能为空,所以应该删除空检查

在这种特殊情况下,您显式地将
a_ptr
设置为变量的地址,因此在该点上不可能为NULL。如果在上述
If
语句之前未再次设置,则意味着空检查是不必要的,应该删除。

Coverity向您发出警告,因为您实际上正在执行空检查:

if (a_ptr && a_ptr->ptr) {
这里,
a_ptr
是在布尔上下文中计算的。如果
a_ptr
不为空,则其计算结果为true

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

  • 指针实际上可能是空的,在该空检查之前的任何取消引用都可能导致空指针取消引用,因此您需要尽早执行空检查,或者在该点不取消引用
  • 空检查是不必要的,因为指针不能为空,所以应该删除空检查

在这种特殊情况下,您显式地将
a_ptr
设置为变量的地址,因此在该点上不可能为NULL。如果在上面的
If
语句之前没有再次设置它,这意味着空检查是不必要的,应该删除。

您需要显示更多的代码以及您使用的静态分析工具,以便我们能够给您提供答案。如果您将上面的代码放在c文件中,请运行分析,它是否报告警告?是->可怕的假阳性否->你删除了一条重要信息。我猜它在告诉你“您现在正在执行空检查,但以前已经取消了对它的引用。可能你需要经常做这个空检查before@sbhatla为什么在取消引用后要测试a_ptr的
NULL
?我很想知道为什么我会被否决。这个问题简洁明了,切中要害,合乎逻辑。只删除了不相关的信息。我现在要补充,但我觉得这是没有意义的,因为它只会把问题弄得一团糟。你需要展示更多的代码以及你正在使用的静态分析工具,以便我们能够给你一个答案。如果你把上面的代码放在一个c文件中,运行分析,它会报告警告吗?是->可怕的假阳性否->你删除了一条重要信息。我猜它在告诉你“您现在正在执行空检查,但以前已经取消了对它的引用。可能你需要经常做这个空检查before@sbhatla为什么在取消引用后要测试a_ptr的
NULL
?我很想知道为什么我会被否决。这个问题简洁明了,切中要害,合乎逻辑。只删除了不相关的信息。我现在要补充,但我觉得这毫无意义,因为它只会把问题弄得一团糟。谢谢!在您的回答中,有帮助的一行是这样的——“在这个特殊情况下,您显式地将一个_ptr设置为一个变量的地址,因此在这一点上它不可能为NULL。如果您不在上面的If语句之前再次设置它,这意味着NULL检查是不必要的,应该删除。”谢谢!在您的回答中,有帮助的一行是这样的——“在这个特定的情况下,您显式地将一个_ptr设置为变量的地址,因此在该点上它不可能为NULL。如果您不在上面的If语句之前再次设置它,这意味着NULL检查是不必要的,应该被删除。”