2013-10-23 153 views
0

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

+5

你需要从每一个分支返回一个值。如果你不这样做,这是未定义的行为。 – chris

+0

你得到正确的结果只是因为你有幸在你的函数中没有任何事发生在两个'search'调用修改后的EAX之后。所以它们的返回值可能仍然只是坐在EAX寄存器中。这是UB。正确指定所有返回路径。 – WhozCraig

回答

2

我想你的意思返回递归调用的结果:

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

你的功能,因为它是现在允许你关闭功能的上端流没有明确的回报是undefined behavior,草案标准部分6.6.3返回声明说;

[...]流出函数的末尾相当于没有值的返回;这导致了一个返回值的函数未定义行为[...]

最后两个其他没有回报声明:

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); 
0
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); 
相关问题