DebugCheckers.cpp revision 02f34c5003b2c5067675f89ffce0a84c28faf722
12d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==//
22d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//
32d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
42d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//
52d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
62d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
72d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//
82d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
92d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//
102d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//  This file defines a checkers that display debugging information.
112d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//
122d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
132d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
142d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "ClangSACheckers.h"
15ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/Checker.h"
162d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
172d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "clang/Analysis/Analyses/LiveVariables.h"
1858f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek#include "clang/Analysis/Analyses/Dominators.h"
192d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
202d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisusing namespace clang;
212d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisusing namespace ento;
222d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
232d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
2458f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek// DominatorsTreeDumper
2558f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek//===----------------------------------------------------------------------===//
2658f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek
2758f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremeneknamespace {
2858f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenekclass DominatorsTreeDumper : public Checker<check::ASTCodeBody> {
2958f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenekpublic:
3058f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
3158f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek                        BugReporter &BR) const {
3258f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek    if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) {
3302f34c5003b2c5067675f89ffce0a84c28faf722Anna Zaks      DominatorTree dom;
3402f34c5003b2c5067675f89ffce0a84c28faf722Anna Zaks      dom.buildDominatorTree(*AC);
3558f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek      dom.dump();
3658f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek    }
3758f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek  }
3858f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek};
3958f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek}
4058f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek
4158f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenekvoid ento::registerDominatorsTreeDumper(CheckerManager &mgr) {
4258f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek  mgr.registerChecker<DominatorsTreeDumper>();
4358f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek}
4458f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek
4558f6f1e37ab32fdd0c8bab6771d8e09bc139e9edTed Kremenek//===----------------------------------------------------------------------===//
462d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// LiveVariablesDumper
472d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
482d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
492d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace {
50ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass LiveVariablesDumper : public Checker<check::ASTCodeBody> {
512d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic:
522d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
532d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis                        BugReporter &BR) const {
54a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    if (LiveVariables* L = mgr.getAnalysis<LiveVariables>(D)) {
552d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis      L->dumpBlockLiveness(mgr.getSourceManager());
562d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis    }
572d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  }
582d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis};
592d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
602d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
612d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerLiveVariablesDumper(CheckerManager &mgr) {
622d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  mgr.registerChecker<LiveVariablesDumper>();
632d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
642d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
652d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
662d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// CFGViewer
672d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
682d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
692d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace {
70ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass CFGViewer : public Checker<check::ASTCodeBody> {
712d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic:
722d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
732d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis                        BugReporter &BR) const {
742d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis    if (CFG *cfg = mgr.getCFG(D)) {
752d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis      cfg->viewCFG(mgr.getLangOptions());
762d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis    }
772d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  }
782d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis};
792d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
802d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
812d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerCFGViewer(CheckerManager &mgr) {
822d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  mgr.registerChecker<CFGViewer>();
832d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
842d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
852d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
862d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// CFGDumper
872d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
882d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
892d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace {
90ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass CFGDumper : public Checker<check::ASTCodeBody> {
912d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic:
922d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
932d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis                        BugReporter &BR) const {
942d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis    if (CFG *cfg = mgr.getCFG(D)) {
952d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis      cfg->dump(mgr.getLangOptions());
962d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis    }
972d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  }
982d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis};
992d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
1002d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis
1012d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerCFGDumper(CheckerManager &mgr) {
1022d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis  mgr.registerChecker<CFGDumper>();
1032d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}
104