"Control may reach end of non-void function"警告

Warning of "Control may reach end of non-void function"

本文关键字:non-void function 警告 of end Control may reach      更新时间:2023-10-16

我在 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中得到了正确的答案,没有任何警告。

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

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);
}

你的函数现在允许你在没有显式返回的情况下从函数的末尾流出,这是未定义的行为,草案标准部分6.6.3 return 语句说;

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

最后两个没有 return 语句:

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

因此,在这些情况下,您将在不返回值的情况下从末尾流出,从而调用未定义的行为,似乎您可能打算返回,但只是将它们排除在外,真正意味着:

else if(x < head->key)
    return search(head->lchild, x); 
else
    return search(head->rchild, x); 
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);
相关文章: