From 032e1fdcd47ef98936c88aa30571c6a713179a46 Mon Sep 17 00:00:00 2001 From: Kristof Umann Date: Sat, 17 Aug 2019 16:49:54 +0000 Subject: [PATCH] [analyzer] Turn an assert into an if condition Shocker, turns out that terminator conditions that are binary operators aren't always logical operators. llvm-svn: 369195 --- .../lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 7 +++---- .../track-control-dependency-conditions.cpp | 13 ++++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 9850349f6baf..de5af313bc2b 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -1755,10 +1755,9 @@ static bool isAssertlikeBlock(const CFGBlock *B, ASTContext &Context) { // B1, 'A && B' for B2, and 'A && B || C' for B3. Let's check whether we // reached the end of the condition! if (const Stmt *ElseCond = Else->getTerminatorCondition()) - if (isa(ElseCond)) { - assert(cast(ElseCond)->isLogicalOp()); - return isAssertlikeBlock(Else, Context); - } + if (const auto *BinOp = dyn_cast(ElseCond)) + if (BinOp->isLogicalOp()) + return isAssertlikeBlock(Else, Context); return false; } diff --git a/clang/test/Analysis/track-control-dependency-conditions.cpp b/clang/test/Analysis/track-control-dependency-conditions.cpp index 016ba3c5dca3..e02eb412a809 100644 --- a/clang/test/Analysis/track-control-dependency-conditions.cpp +++ b/clang/test/Analysis/track-control-dependency-conditions.cpp @@ -459,6 +459,18 @@ void f(int flag) { } // end of namespace unimportant_write_before_collapse_point +namespace dont_crash_on_nonlogical_binary_operator { + +void f6(int x) { + int a[20]; + if (x == 25) {} // expected-note{{Assuming 'x' is equal to 25}} + // expected-note@-1{{Taking true branch}} + if (a[x] == 123) {} // expected-warning{{The left operand of '==' is a garbage value due to array index out of bounds}} + // expected-note@-1{{The left operand of '==' is a garbage value due to array index out of bounds}} +} + +} // end of namespace dont_crash_on_nonlogical_binary_operator + namespace dont_track_assertlike_conditions { extern void __assert_fail(__const char *__assertion, __const char *__file, @@ -532,7 +544,6 @@ void f(int flag) { } #undef assert - } // end of namespace dont_track_assertlike_and_conditions namespace dont_track_assertlike_or_conditions {