From: Kristof Umann Date: Sat, 17 Aug 2019 16:49:54 +0000 (+0000) Subject: [analyzer] Turn an assert into an if condition X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0d45f53c11aadc19b7f4fee07a549b6a849a293;p=clang [analyzer] Turn an assert into an if condition Shocker, turns out that terminator conditions that are binary operators aren't always logical operators. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@369195 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 9850349f6b..de5af313bc 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/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/test/Analysis/track-control-dependency-conditions.cpp b/test/Analysis/track-control-dependency-conditions.cpp index 016ba3c5dc..e02eb412a8 100644 --- a/test/Analysis/track-control-dependency-conditions.cpp +++ b/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 {