【问题标题】:Warning of "Control may reach end of non-void function"“控制可能到达非无效函数的末端”的警告
【发布时间】:2025-12-08 23:15:01
【问题描述】:

我在 Xcode 中运行了一个 C++ 程序,遇到了“控制可能到达非无效函数的结尾”的警告。代码如下:

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        search(head->lchild, x);
    else
        search(head->rchild, x);
}

我在 Linux 中编译时得到了同样的警告,但得到了正确的结果。但是在 Xcode 中,结果是错误的。顺便说一句,我得到了正确的答案,并且在 Visual Studio 中没有警告。

【问题讨论】:

  • 你需要从每个分支返回一个值。如果你不这样做,这是未定义的行为。
  • 你得到了正确的结果只是因为你很幸运,在两个search调用修改后的EAX之后你的函数中没有发生任何其他事情。所以他们的返回值可能仍然只是在 EAX 寄存器中。这是UB。正确指定所有返回路径。
  • 请注意为什么它会在 Linux 和 Visual Studio 中得到正确答案,在“Why does a recursed return call break out of stack without an explicit return statement?”中进行了解释

标签: c++ xcode


【解决方案1】:

我认为您的意思是返回递归调用的结果:

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        return search(head->lchild, x);
    else
        return search(head->rchild, x);
}

【讨论】:

    【解决方案2】:

    您的函数现在允许您在没有显式返回的情况下从函数的末尾流出 undefined behavior,草案标准部分 6.6.3 返回声明说;

    [...]从函数的末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。[...]

    最后两个else没有return语句:

     else if(x < head->key)
        search(head->lchild, x);  // No return
     else
        search(head->rchild, x);  // No return
     // no return
    }  
    

    所以在这些情况下,你会在没有返回值的情况下结束,因此调用了 未定义的行为,看起来你可能打算有一个 return 但只是离开了他们出来,真正的意思是:

    else if(x < head->key)
        return search(head->lchild, x); 
    else
        return search(head->rchild, x); 
    

    【讨论】:

      【解决方案3】:
      else if(x < head->key)
          search(head->lchild, x);
      else
          search(head->rchild, x);
      

      在那些分支中,你是:

      • 递归调用search
      • 丢弃它返回的值
      • 不返回任何东西

      不从函数返回值是未定义的行为。您得到正确结果的事实纯属偶然,不可依赖,编译器可以选择格式化您的硬盘驱动器或订购比萨饼。

      通过添加return 语句来解决这个问题:

      else if(x < head->key)
          return search(head->lchild, x);
      else
          return search(head->rchild, x);
      

      【讨论】:

        最近更新 更多