收到警告 - 在 C 代码中可能为 null 之前取消引用
Getting warning - Dereferencing before possibly being null in C code
我在对我的代码进行静态分析 (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
行似乎被视为 incorrect/dangerous。为什么会显示此错误,有没有办法更正它?
Coverity 向您发出警告,因为您实际上是在进行 NULL 检查:
if (a_ptr && a_ptr->ptr) {
此处,a_ptr
在布尔上下文中进行评估。如果 a_ptr
不为 NULL,则计算结果为真。
如果您取消引用一个指针然后对其进行 NULL 检查,Coverity 会抛出此警告。这意味着两件事之一:
- 指针实际上可能为 NULL,并且在该 NULL 检查之前的任何取消引用都可能导致 NULL 指针取消引用,因此您需要尽早进行 NULL 检查或在此时不取消引用。
- NULL检查是不必要的,因为指针不能为NULL,所以应该去掉NULL检查。
在这种特殊情况下,您明确地将 a_ptr
设置为变量的地址,因此此时它不可能为 NULL。如果你在上面的if
语句之前没有再次设置它,那就意味着NULL检查是不必要的,应该被删除。
我在对我的代码进行静态分析 (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
行似乎被视为 incorrect/dangerous。为什么会显示此错误,有没有办法更正它?
Coverity 向您发出警告,因为您实际上是在进行 NULL 检查:
if (a_ptr && a_ptr->ptr) {
此处,a_ptr
在布尔上下文中进行评估。如果 a_ptr
不为 NULL,则计算结果为真。
如果您取消引用一个指针然后对其进行 NULL 检查,Coverity 会抛出此警告。这意味着两件事之一:
- 指针实际上可能为 NULL,并且在该 NULL 检查之前的任何取消引用都可能导致 NULL 指针取消引用,因此您需要尽早进行 NULL 检查或在此时不取消引用。
- NULL检查是不必要的,因为指针不能为NULL,所以应该去掉NULL检查。
在这种特殊情况下,您明确地将 a_ptr
设置为变量的地址,因此此时它不可能为 NULL。如果你在上面的if
语句之前没有再次设置它,那就意味着NULL检查是不必要的,应该被删除。