编辑:我将nextBool()
更改为isEndOfStream()
,以减少对该函数是否返回true的干扰。该函数最终将返回true。
我得到了代码:
bool isEndOfStream();
void test() {
try {
if (isEndOfStream()) {
return;
} else {
test();
}
} catch (...) {}
}
并且IDE警告我test()
函数无限递归,但如果我删除try catch:
bool isEndOfStream();
void test() {
if (isEndOfStream()) {
return;
} else {
test();
}
}
警告消失了。
首先,isEndOfStream()
最终将返回true
,因此test()将返回。其次,isEndOfStream()
可能有机会抛出异常
所以我的问题是:
附:我使用Clion,我测试了它不会无限地递归,但这个警告让我感到紧张(关于我是否错过了什么)。即使IDE出错,我也很好奇分析器为什么会关注无限递归问题。
IDE是否适合无限递归?
是的,你的IDE是对的。可能你的test
永远不会回来。
如果IDE是正确的,在什么情况下会发生无限递归?
考虑一个有缺陷的isEndOfStream
:
bool isEndOfStream() { return false; }
在这种情况下,递归永远不会停止。你的IDE警告你这件事很好。当test
有一个bug时,人们可以将它视为isEndOfStream
破坏的设计缺陷。如果isEndOfStream
是由别人写的怎么办?然后你不希望他的问题出现在你身边。
为什么这只发生在尝试捕获?
我不知道。根据我的经验,IDE在诊断代码中的问题方面可能非常差。对c ++代码进行静态分析并非易事。即使是我所知道的高质量工具也无法避免错失和误报。没有try
的这种奇怪的行为没有警告并不是一个大惊喜。
最终你应该很高兴得到警告,并确保自己没有无限的递归。不要依赖你的IDE。对于你的代码,如果isEndOfStream()
永远不会返回true
,则会有无限递归。
您可以确保不是这种情况,或者您采取一些额外的措施来停止递归。 ...或者你只是接受这样一个事实,即你无法保证永远不会有无限递归。