From 75e55592872521950262293d9c3a96d497b2c42e Mon Sep 17 00:00:00 2001 From: Nathan Huckleberry Date: Thu, 27 Jun 2019 22:46:40 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@364605 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/CoreEngine.cpp | 5 +++++ test/Analysis/egraph-asm-goto-no-crash.cpp | 26 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 test/Analysis/egraph-asm-goto-no-crash.cpp diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index 431d07dab1..94cf74de82 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/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/test/Analysis/egraph-asm-goto-no-crash.cpp b/test/Analysis/egraph-asm-goto-no-crash.cpp new file mode 100644 index 0000000000..37f8fc533a --- /dev/null +++ b/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; +} -- 2.40.0