编辑:我将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()
可能有机会引发异常
所以我的问题是:
p.s。我使用了Clion,经过测试,它不会无限递归,但是此警告使我感到紧张(关于我是否错过了某些东西)。即使IDE错误,我也很好奇为什么分析器关注无限递归问题。
答案 0 :(得分:0)
IDE是否适合无限递归?
是的,IDE是正确的。您的test
可能永远不会回来。
如果IDE是正确的,在什么情况下将发生无限递归?
考虑有问题的isEndOfStream
:
bool isEndOfStream() { return false; }
在这种情况下,递归永远不会停止。您的IDE会警告您有关此事,这很好。有人认为这是一种设计缺陷,当test
出现错误时,isEndOfStream
就会中断。如果isEndOfStream
是别人写的怎么办?然后,您不希望他的问题出现在您的身边。
为什么只在try-catch中发生这种情况?
我不知道。以我的经验,IDE在诊断代码中的问题时可能真的很差。对c ++代码进行静态分析并非易事。我所知道的即使是高质量的工具也无法避免遗漏和误报。没有try
而不发出警告的怪异行为就不足为奇了。
最终,您应该很高兴得到警告,并确保自己没有无限递归。不要依赖您的IDE。对于您的代码,如果isEndOfStream()
从不返回true
,则存在无限递归。
可以确保不是这种情况,或者采取其他措施来停止递归。 ...或者您只是接受不能保证永远不会无限递归的事实。