diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp | 129 | 
1 files changed, 122 insertions, 7 deletions
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp index 90b1111aff0f..bb9e8110b647 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp @@ -1,9 +1,8 @@  //==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -36,9 +35,9 @@ public:    void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,                          BugReporter &BR) const {      if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) { -      DominatorTree dom; -      dom.buildDominatorTree(*AC); -      dom.dump(); +      CFGDomTree Dom; +      Dom.buildDominatorTree(AC->getCFG()); +      Dom.dump();      }    }  }; @@ -48,6 +47,61 @@ void ento::registerDominatorsTreeDumper(CheckerManager &mgr) {    mgr.registerChecker<DominatorsTreeDumper>();  } +bool ento::shouldRegisterDominatorsTreeDumper(const LangOptions &LO) { +  return true; +} + +//===----------------------------------------------------------------------===// +// PostDominatorsTreeDumper +//===----------------------------------------------------------------------===// + +namespace { +class PostDominatorsTreeDumper : public Checker<check::ASTCodeBody> { +public: +  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, +                        BugReporter &BR) const { +    if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) { +      CFGPostDomTree Dom; +      Dom.buildDominatorTree(AC->getCFG()); +      Dom.dump(); +    } +  } +}; +} + +void ento::registerPostDominatorsTreeDumper(CheckerManager &mgr) { +  mgr.registerChecker<PostDominatorsTreeDumper>(); +} + +bool ento::shouldRegisterPostDominatorsTreeDumper(const LangOptions &LO) { +  return true; +} + +//===----------------------------------------------------------------------===// +// ControlDependencyTreeDumper +//===----------------------------------------------------------------------===// + +namespace { +class ControlDependencyTreeDumper : public Checker<check::ASTCodeBody> { +public: +  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, +                        BugReporter &BR) const { +    if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) { +      ControlDependencyCalculator Dom(AC->getCFG()); +      Dom.dump(); +    } +  } +}; +} + +void ento::registerControlDependencyTreeDumper(CheckerManager &mgr) { +  mgr.registerChecker<ControlDependencyTreeDumper>(); +} + +bool ento::shouldRegisterControlDependencyTreeDumper(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // LiveVariablesDumper  //===----------------------------------------------------------------------===// @@ -68,6 +122,10 @@ void ento::registerLiveVariablesDumper(CheckerManager &mgr) {    mgr.registerChecker<LiveVariablesDumper>();  } +bool ento::shouldRegisterLiveVariablesDumper(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // LiveStatementsDumper  //===----------------------------------------------------------------------===// @@ -87,6 +145,10 @@ void ento::registerLiveStatementsDumper(CheckerManager &mgr) {    mgr.registerChecker<LiveStatementsDumper>();  } +bool ento::shouldRegisterLiveStatementsDumper(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // CFGViewer  //===----------------------------------------------------------------------===// @@ -107,6 +169,10 @@ void ento::registerCFGViewer(CheckerManager &mgr) {    mgr.registerChecker<CFGViewer>();  } +bool ento::shouldRegisterCFGViewer(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // CFGDumper  //===----------------------------------------------------------------------===// @@ -133,6 +199,10 @@ void ento::registerCFGDumper(CheckerManager &mgr) {    mgr.registerChecker<CFGDumper>();  } +bool ento::shouldRegisterCFGDumper(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // CallGraphViewer  //===----------------------------------------------------------------------===// @@ -153,6 +223,10 @@ void ento::registerCallGraphViewer(CheckerManager &mgr) {    mgr.registerChecker<CallGraphViewer>();  } +bool ento::shouldRegisterCallGraphViewer(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // CallGraphDumper  //===----------------------------------------------------------------------===// @@ -173,6 +247,9 @@ void ento::registerCallGraphDumper(CheckerManager &mgr) {    mgr.registerChecker<CallGraphDumper>();  } +bool ento::shouldRegisterCallGraphDumper(const LangOptions &LO) { +  return true; +}  //===----------------------------------------------------------------------===//  // ConfigDumper @@ -214,6 +291,10 @@ void ento::registerConfigDumper(CheckerManager &mgr) {    mgr.registerChecker<ConfigDumper>();  } +bool ento::shouldRegisterConfigDumper(const LangOptions &LO) { +  return true; +} +  //===----------------------------------------------------------------------===//  // ExplodedGraph Viewer  //===----------------------------------------------------------------------===// @@ -233,3 +314,37 @@ void ento::registerExplodedGraphViewer(CheckerManager &mgr) {    mgr.registerChecker<ExplodedGraphViewer>();  } +bool ento::shouldRegisterExplodedGraphViewer(const LangOptions &LO) { +  return true; +} + +//===----------------------------------------------------------------------===// +// Emits a report for every Stmt that the analyzer visits. +//===----------------------------------------------------------------------===// + +namespace { + +class ReportStmts : public Checker<check::PreStmt<Stmt>> { +  BuiltinBug BT_stmtLoc{this, "Statement"}; + +public: +  void checkPreStmt(const Stmt *S, CheckerContext &C) const { +    ExplodedNode *Node = C.generateNonFatalErrorNode(); +    if (!Node) +      return; + +    auto Report = llvm::make_unique<BugReport>(BT_stmtLoc, "Statement", Node); + +    C.emitReport(std::move(Report)); +  } +}; + +} // end of anonymous namespace + +void ento::registerReportStmts(CheckerManager &mgr) { +  mgr.registerChecker<ReportStmts>(); +} + +bool ento::shouldRegisterReportStmts(const LangOptions &LO) { +  return true; +}  | 
