From: Nathan Huckleberry Date: Thu, 27 Jun 2019 22:46:40 +0000 (+0000) Subject: [analyzer] Fix clang-tidy crash on GCCAsmStmt X-Git-Tag: llvmorg-10-init~1777 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=13fde7a89a53d5a9ed77579b038eb39bcf8975a1;p=platform%2Fupstream%2Fllvm.git [analyzer] Fix clang-tidy crash on GCCAsmStmt Summary: Added entry in switch statement to recognize GCCAsmStmt as a possible block terminator. Handling to build CFG using GCCAsmStmt was already implemented. Reviewers: nickdesaulniers, george.karpenkov, NoQ Reviewed By: nickdesaulniers, NoQ Subscribers: xbolva00, tmroeder, xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, Szelethus, donat.nagy, dkrupp, Charusso, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D63533 llvm-svn: 364605 --- diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp index 431d07da..94cf74d 100644 --- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -396,6 +396,11 @@ void CoreEngine::HandleBlockExit(const CFGBlock * B, ExplodedNode *Pred) { case Stmt::WhileStmtClass: HandleBranch(cast(Term)->getCond(), Term, B, Pred); return; + + case Stmt::GCCAsmStmtClass: + assert(cast(Term)->isAsmGoto() && "Encountered GCCAsmStmt without labels"); + // TODO: Handle jumping to labels + return; } } diff --git a/clang/test/Analysis/egraph-asm-goto-no-crash.cpp b/clang/test/Analysis/egraph-asm-goto-no-crash.cpp new file mode 100644 index 0000000..37f8fc5 --- /dev/null +++ b/clang/test/Analysis/egraph-asm-goto-no-crash.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s + +// expected-no-diagnostics + +void clang_analyzer_warnIfReached(); + +void testAsmGoto() { + asm goto("xor %0, %0\n je %l[label1]\n jl %l[label2]" + : /* no outputs */ + : /* inputs */ + : /* clobbers */ + : label1, label2 /* any labels used */); + + // FIXME: Should be reachable. + clang_analyzer_warnIfReached(); + + label1: + // FIXME: Should be reachable. + clang_analyzer_warnIfReached(); + return; + + label2: + // FIXME: Should be reachable. + clang_analyzer_warnIfReached(); + return; +}