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

cppcheck null指针取消引用,但它实际上可以变为null,c,null-pointer,cppcheck,C,Null Pointer,Cppcheck,我有一个函数,它可以返回指向结构或NULL的指针(示例解释从函数get_my_struct_返回的可能性): CppCheck告诉我if语句是冗余的,或者可能存在空指针解引用 问题: 为什么CppCheck会给我这些信息 如何正确检查函数的返回值,使我不会收到此消息 编辑: 忘了提到my_函数是两个get函数的行为示例 从_A获取_my_struct_和从_B获取_my_struct_具有不同的内部逻辑,但输出数据类型与在my_函数中显示的相同。我有很多从我调用的函数中获取我的结构并检查返回值。

我有一个函数,它可以返回指向结构或NULL的指针(示例解释从函数get_my_struct_返回的可能性):

CppCheck告诉我if语句是冗余的,或者可能存在空指针解引用

问题:

  • 为什么CppCheck会给我这些信息
  • 如何正确检查函数的返回值,使我不会收到此消息
  • 编辑:

    忘了提到my_函数是两个get函数的行为示例

    从_A获取_my_struct_和从_B获取_my_struct_具有不同的内部逻辑,但输出数据类型与在my_函数中显示的相同。我有很多从我调用的函数中获取我的结构并检查返回值。因此,为每个GET创建一个新的结构不是一个选项,我不认为这是好的,因为用于相同目的的大量变量。


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

    您的函数应该返回
    struct my_struct*
    I.value
    小于5时,您返回了什么<代码>结构我的结构

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

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

    如果你所展示的是你所做的,那么下面总结了一些问题/建议

    • p从方法返回错误的类型

    • p如果
      get_my_struct_from_A
      与原始代码中的
      my_function
      相同,则您没有传递您应该传递的参数

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

      bool my_函数(struct my_struct ms)

    struct my\u struct*my\u函数(my\u struct i){
    如果(i.value<5)返回i;
    
    这不是有效的C(或C++)代码。您的编译器已损坏或配置不正确

    返回一个整数,但函数返回一个指针。C标准是明确的,C116.8.6.4:

    如果表达式具有 类型与它出现的函数的返回类型不同,该值为 通过赋值转换为具有函数返回类型的对象

    这意味着代码等价于
    struct my_struct*tmp=i;
    。这可以被视为C语言所称的“简单赋值”。简单赋值规则C116.5.16.1规定,如果赋值的左操作数是指针,则右操作数不能是整数


    因此,编译器必须生成此代码的诊断消息。如果没有,则表明它有问题。

    my_函数中存在问题。
    返回类型为
    struct my_struct*
    (指针),但返回的是
    int
    i
    )。在使用CPP之前,请检查您的代码商店可以在没有警告的情况下编译。如果您没有收到警告,那么使用
    -Wall
    编译是
    my\u函数
    还是
    get\u my\u struct\u from\u a
    ?这里的主要问题是,在静态分析之前,该代码如何在第一时间干净地编译。@Lundin.:是的,我猜OP没有发布act code或OP在此处发布时对其进行了更改。否则会引发错误。这就是为什么我明确提到了使OP编写可编译代码的要点。@coderredoc我没有发布确切的代码,我不需要代码响应我需要解释我为什么会遇到此问题。为问题添加了更多解释。
    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
    }
    
    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
    }
    
    struct my_struct *my_function(my_struct i) {
        if (i.value < 5) return i;