[PATCH] D73270: [clang-tidy] Fix false positive in bugprone-infinite-loop
Balogh, Ádám via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 24 07:28:01 PST 2020
baloghadamsoftware updated this revision to Diff 240192.
baloghadamsoftware added a comment.
Updated according to the comments.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D73270/new/
https://reviews.llvm.org/D73270
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
@@ -8,6 +8,16 @@
j++;
}
+ while (int k = 10) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables () are updated in the loop body [bugprone-infinite-loop]
+ j--;
+ }
+
+ while (int k = 10) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables () are updated in the loop body [bugprone-infinite-loop]
+ k--;
+ }
+
do {
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]
j++;
@@ -27,6 +37,16 @@
j++;
}
+ while (int k = Limit) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (Limit) are updated in the loop body [bugprone-infinite-loop]
+ j--;
+ }
+
+ while (int k = Limit) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (Limit) are updated in the loop body [bugprone-infinite-loop]
+ k--;
+ }
+
do {
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i, Limit) are updated in the loop body [bugprone-infinite-loop]
j++;
@@ -44,6 +64,22 @@
// Not an error since 'Limit' is updated.
Limit--;
}
+
+ while (Limit--) {
+ // Not an error since 'Limit' is updated.
+ i++;
+ }
+
+ while (int k = Limit) {
+ // Not an error since 'Limit' is updated.
+ Limit--;
+ }
+
+ while (int k = Limit--) {
+ // Not an error since 'Limit' is updated.
+ i++;
+ }
+
do {
Limit--;
} while (i < Limit);
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
@@ -170,11 +170,21 @@
const auto *LoopStmt = Result.Nodes.getNodeAs<Stmt>("loop-stmt");
const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func");
+ bool ShouldHaveConditionVariables = true;
+ if (const auto *While = dyn_cast<WhileStmt>(LoopStmt)) {
+ if (const VarDecl *LoopVarDecl = While->getConditionVariable()) {
+ if (const Expr *Init = LoopVarDecl->getInit()) {
+ ShouldHaveConditionVariables = false;
+ Cond = Init;
+ }
+ }
+ }
+
if (isAtLeastOneCondVarChanged(Func, LoopStmt, Cond, Result.Context))
return;
std::string CondVarNames = getCondVarNames(Cond);
- if (CondVarNames.empty())
+ if (ShouldHaveConditionVariables && CondVarNames.empty())
return;
diag(LoopStmt->getBeginLoc(),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D73270.240192.patch
Type: text/x-patch
Size: 2983 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200124/e898ea6c/attachment.bin>
More information about the cfe-commits
mailing list