diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-03-11 19:44:10 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-03-11 19:44:10 +0000 |
commit | 2a723e6e8065d069341da3287ad870b208e2847f (patch) | |
tree | 53567e3b8d231a56e28b3acd3677a29d67a0fb8f /clang/Analysis/CFRefCount.cpp | |
parent | 7b27ccfd5eeff99388f2da95bf6df340a0678988 (diff) | |
download | bcm5719-llvm-2a723e6e8065d069341da3287ad870b208e2847f.tar.gz bcm5719-llvm-2a723e6e8065d069341da3287ad870b208e2847f.zip |
Added pretty-printing support for checker-specific state for the CFRefCount checker.
llvm-svn: 48242
Diffstat (limited to 'clang/Analysis/CFRefCount.cpp')
-rw-r--r-- | clang/Analysis/CFRefCount.cpp | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/clang/Analysis/CFRefCount.cpp b/clang/Analysis/CFRefCount.cpp index e51353a61dc..ea9c8bfd37e 100644 --- a/clang/Analysis/CFRefCount.cpp +++ b/clang/Analysis/CFRefCount.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/ImmutableMap.h" +#include <ostream> using namespace clang; @@ -193,22 +194,66 @@ public: bool operator==(const RefVal& X) const { return Data == X.Data; } void Profile(llvm::FoldingSetNodeID& ID) const { ID.AddInteger(Data); } + + void print(std::ostream& Out) const; }; - + +void RefVal::print(std::ostream& Out) const { + switch (getKind()) { + default: assert(false); + case Owned: + Out << "Owned(" << getCount() << ")"; + break; + + case AcqOwned: + Out << "Acquired-Owned(" << getCount() << ")"; + break; + + case NotOwned: + Out << "Not-Owned"; + break; + + case Released: + Out << "Released"; + break; + + case ErrorUseAfterRelease: + Out << "Use-After-Release [ERROR]"; + break; + + case ErrorReleaseNotOwned: + Out << "Release of Not-Owned [ERROR]"; + break; + } +} class CFRefCount : public GRSimpleVals { + + // Type definitions. + typedef llvm::ImmutableMap<SymbolID, RefVal> RefBindings; typedef RefBindings::Factory RefBFactoryTy; typedef llvm::SmallPtrSet<GRExprEngine::NodeTy*,2> UseAfterReleasesTy; typedef llvm::SmallPtrSet<GRExprEngine::NodeTy*,2> ReleasesNotOwnedTy; + class BindingsPrinter : public ValueState::CheckerStatePrinter { + public: + virtual void PrintCheckerState(std::ostream& Out, void* State, + const char* nl, const char* sep); + }; + + // Instance variables. + CFRefSummaryManager Summaries; RefBFactoryTy RefBFactory; UseAfterReleasesTy UseAfterReleases; ReleasesNotOwnedTy ReleasesNotOwned; + BindingsPrinter Printer; + + // Private methods. static RefBindings GetRefBindings(ValueState& StImpl) { return RefBindings((RefBindings::TreeTy*) StImpl.CheckerState); @@ -224,10 +269,15 @@ class CFRefCount : public GRSimpleVals { RefBindings Update(RefBindings B, SymbolID sym, RefVal V, ArgEffect E, RefVal::Kind& hasError); + public: CFRefCount() {} virtual ~CFRefCount() {} + + virtual ValueState::CheckerStatePrinter* getCheckerStatePrinter() { + return &Printer; + } // Calls. @@ -241,6 +291,21 @@ public: } // end anonymous namespace +void CFRefCount::BindingsPrinter::PrintCheckerState(std::ostream& Out, + void* State, const char* nl, + const char* sep) { + RefBindings B((RefBindings::TreeTy*) State); + + if (State) + Out << sep << nl; + + for (RefBindings::iterator I=B.begin(), E=B.end(); I!=E; ++I) { + Out << (*I).first << " : "; + (*I).second.print(Out); + Out << nl; + } +} + void CFRefCount::EvalCall(ExplodedNodeSet<ValueState>& Dst, ValueStateManager& StateMgr, GRStmtNodeBuilder<ValueState>& Builder, |