gpt4 book ai didi

cppcheck 空指针取消引用,但它实际上可以变成 null

转载 作者:行者123 更新时间:2023-11-30 20:20:06 24 4
gpt4 key购买 nike

我有一个可以返回指向结构或 NULL 的指针的函数(解释 get_my_struct_from_[X] 函数返回可能性的示例):

struct my_struct *my_function(my_struct i) {
if (i.value < 5) return i;
else return NULL;
}

在主程序中,我多次调用此函数,然后检查该值是否为 NULL:

struct my_struct *q;
q = get_my_struct_from_A();
if (q == NULL) {
// display an error message and exit
}

q = get_my_struct_from_B();
if (q == NULL) {
// display an error message and exit
}

CppCheck 告诉我 if 语句是多余的或者可能存在空指针取消引用。

问题:

  1. 为什么 CppCheck 给我这些消息?
  2. 如何正确检查函数的返回值,以免收到此消息

编辑:

忘记提及 my_function 是两个 get 函数行为方式的示例。

get_my_struct_from_A 和 get_my_struct_from_B 的内部逻辑不同,但输出数据类型与 my_function 中显示的相同。我有很多调用并检查返回值的 get_my_struct_from_X 函数。因此,为每个 get 创建一个新的结构不是一个选择,我认为这不是一个好的选择,因为大量的变量用于相同的目的。

写入 q == null!q 从 cppcheck 返回相同的消息,我认为这是正常的。

最佳答案

你的函数应该返回struct my_struct *,当i.value小于5时你返回什么? struct my_struct

此外,如果您像这样声明了函数,则应该传递一个您没有传递的参数。

struct my_struct *my_function(struct my_struct* i) {
if (i->value < 5) return i;
else return NULL;
}

你会这样调用它

struct my_struct a;
...
struct my_struct *q = my_function(&a);
if( !q ){
// it returned NULL
}
<小时/>

如果您所展示的就是您所做的,那么就会出现问题/建议,总结如下。

  • P 从方法返回错误类型。

  • P 如果 get_my_struct_from_A 与原始代码中的 my_function 相同,那么您就没有传递应有的参数。

  • S 通过使用基于传递的结构返回 true 或 false 的函数,可以更轻松地完成这种小型检查。

    bool my_function(struct my_struct ms);

关于cppcheck 空指针取消引用,但它实际上可以变成 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com