njames93 created this revision. Herald added subscribers: cfe-commits, xazax.hun. Herald added a project: clang. njames93 edited the summary of this revision. njames93 added reviewers: aaron.ballman, alexfh, hokein, gribozavr2, JonasToth. njames93 added a project: clang-tools-extra.
Addresses bugprone-infinite-loop false positive with CATCH2 <https://bugs.llvm.org/show_bug.cgi?id=44816> by disabling the check on loops where the condition is known to always eval as false, in other words not a loop. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D74374 Files: clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -354,3 +354,12 @@ (*p)++; } while (i < Limit); } + +void evaluatable(bool CondVar) { + for (; false && CondVar;) { + } + while (false && CondVar) { + } + do { + } while (false && CondVar); +} Index: clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp @@ -152,6 +152,13 @@ return Result; } +static bool isKnownFalse(const Expr &Cond, const ASTContext &Ctx) { + bool Result = false; + if (Cond.EvaluateAsBooleanCondition(Result, Ctx)) + return !Result; + return false; +} + void InfiniteLoopCheck::registerMatchers(MatchFinder *Finder) { const auto LoopCondition = allOf( hasCondition( @@ -170,6 +177,9 @@ const auto *LoopStmt = Result.Nodes.getNodeAs<Stmt>("loop-stmt"); const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func"); + if (isKnownFalse(*Cond, *Result.Context)) + return; + bool ShouldHaveConditionVariables = true; if (const auto *While = dyn_cast<WhileStmt>(LoopStmt)) { if (const VarDecl *LoopVarDecl = While->getConditionVariable()) {
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -354,3 +354,12 @@ (*p)++; } while (i < Limit); } + +void evaluatable(bool CondVar) { + for (; false && CondVar;) { + } + while (false && CondVar) { + } + do { + } while (false && CondVar); +} Index: clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp @@ -152,6 +152,13 @@ return Result; } +static bool isKnownFalse(const Expr &Cond, const ASTContext &Ctx) { + bool Result = false; + if (Cond.EvaluateAsBooleanCondition(Result, Ctx)) + return !Result; + return false; +} + void InfiniteLoopCheck::registerMatchers(MatchFinder *Finder) { const auto LoopCondition = allOf( hasCondition( @@ -170,6 +177,9 @@ const auto *LoopStmt = Result.Nodes.getNodeAs<Stmt>("loop-stmt"); const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func"); + if (isKnownFalse(*Cond, *Result.Context)) + return; + bool ShouldHaveConditionVariables = true; if (const auto *While = dyn_cast<WhileStmt>(LoopStmt)) { if (const VarDecl *LoopVarDecl = While->getConditionVariable()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits