mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 18:11:19 +00:00
[clang-tidy] Added check to disable bugprone-infinite-loop on known false condition
Summary: Addresses [[ https://bugs.llvm.org/show_bug.cgi?id=44816 | bugprone-infinite-loop false positive with CATCH2 ]] by disabling the check on loops where the condition is known to always eval as false, in other words not a loop. Reviewers: aaron.ballman, alexfh, hokein, gribozavr2, JonasToth Reviewed By: gribozavr2 Subscribers: xazax.hun, cfe-commits Tags: #clang, #clang-tools-extra Differential Revision: https://reviews.llvm.org/D74374
This commit is contained in:
parent
e83b7b99da
commit
c69ec64768
@ -152,6 +152,13 @@ static std::string getCondVarNames(const Stmt *Cond) {
|
||||
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 @@ void InfiniteLoopCheck::check(const MatchFinder::MatchResult &Result) {
|
||||
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()) {
|
||||
|
@ -354,3 +354,12 @@ void lambda_capture() {
|
||||
(*p)++;
|
||||
} while (i < Limit);
|
||||
}
|
||||
|
||||
void evaluatable(bool CondVar) {
|
||||
for (; false && CondVar;) {
|
||||
}
|
||||
while (false && CondVar) {
|
||||
}
|
||||
do {
|
||||
} while (false && CondVar);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user