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