IDE, предупреждающая рекурсивную бесконечность в блоке try catch - PullRequest
0 голосов
/ 17 апреля 2019

Редактировать : Я изменяю nextBool() на isEndOfStream(), чтобы меньше отвлекаться на вопрос, вернет ли функция значение true. Функция в конечном итоге вернет true.

Я получил код:

bool isEndOfStream();

void test() {
  try {
    if (isEndOfStream()) {
      return;
    } else {
      test();
    }
  } catch (...) {}
}

И IDE предупреждает меня о том, что функция test() бесконечно повторяется, но если я удаляю попытку try:

bool isEndOfStream();

void test() {
    if (isEndOfStream()) {
      return;
    } else {
      test();
    }
}

Предупреждение исчезло.

Во-первых, isEndOfStream() в конечном итоге вернет true, поэтому test () вернется. Во-вторых, у isEndOfStream() может быть шанс выбросить исключения

Итак, мой вопрос:

  1. Прав ли IDE относительно бесконечно рекурсивного?
  2. Если IDE верна, то в каком случае бесконечно рекурсивная случиться? И почему это происходит только в трик-трюке?

p.s. Я использую Clion, я проверял, и он не будет повторяться бесконечно, но это предупреждение заставляет меня нервничать (о том, что я что-то пропустил). Даже если IDE неверна, мне любопытно, почему анализатор обеспокоен бесконечно рекурсивной проблемой.

1 Ответ

0 голосов
/ 17 апреля 2019

Прав ли IDE относительно бесконечно рекурсивного?

Да, ваша IDE права. Потенциально ваш test никогда не вернется.

Если IDE верна, в каком случае произойдет бесконечно рекурсивный процесс?

Считать неисправным isEndOfStream:

bool isEndOfStream() { return false; }

В этом случае рекурсия никогда не останавливается. Хорошо, что ваша IDE предупредила вас об этом. Можно было бы считать это недостатком дизайна, который test ломается, когда isEndOfStream имеет ошибку. Что если isEndOfStream написан кем-то другим? Тогда вы не хотите, чтобы его проблемы проявились на вашей стороне.

И почему это происходит только в режиме try-catch?

Я не знаю. По моему опыту IDE могут быть очень плохими в диагностике проблем в вашем коде. Статический анализ кода на С ++ не тривиален. Даже качественные инструменты, о которых я знаю, не могут избежать промахов и ложных срабатываний. Это странное поведение не предупреждать без try не является большим сюрпризом.

В конце концов вы должны быть рады получить предупреждение и убедиться, что бесконечной рекурсии не существует. Не полагайтесь на свою IDE для этого. Для вашего кода существует бесконечная рекурсия в точности, если isEndOfStream() никогда не вернет true.

Либо вы можете убедиться, что это не так, либо вы предприняли некоторые дополнительные меры, чтобы остановить рекурсию. ... или вы просто принимаете тот факт, что вы не можете гарантировать, что никогда не будет бесконечной рекурсии.

...