IDE在try catch块中警告Infinity递归

时间:2019-04-17 17:05:52

标签: c++ clion

编辑我将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()可能有机会引发异常

所以我的问题是:

  1. IDE关于无限递归是否正确?
  2. 如果IDE是正确的,在这种情况下,无限递归将 发生?为什么只在try-catch中发生这种情况?

p.s。我使用了Clion,经过测试,它不会无限递归,但是此警告使我感到紧张(关于我是否错过了某些东西)。即使IDE错误,我也很好奇为什么分析器关注无限递归问题。

1 个答案:

答案 0 :(得分:0)

  

IDE是否适合无限递归?

是的,IDE是正确的。您的test可能永远不会回来。

  

如果IDE是正确的,在什么情况下将发生无限递归?

考虑有问题的isEndOfStream

bool isEndOfStream() { return false; }

在这种情况下,递归永远不会停止。您的IDE会警告您有关此事,这很好。有人认为这是一种设计缺陷,当test出现错误时,isEndOfStream就会中断。如果isEndOfStream是别人写的怎么办?然后,您不希望他的问题出现在您的身边。

  

为什么只在try-catch中发生这种情况?

我不知道。以我的经验,IDE在诊断代码中的问题时可能真的很差。对c ++代码进行静态分析并非易事。我所知道的即使是高质量的工具也无法避免遗漏和误报。没有try而不发出警告的怪异行为就不足为奇了。

最终,您应该很高兴得到警告,并确保自己没有无限递归。不要依赖您的IDE。对于您的代码,如果isEndOfStream()从不返回true,则存在无限递归。

可以确保不是这种情况,或者采取其他措施来停止递归。 ...或者您只是接受不能保证永远不会无限递归的事实。