diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-03-06 00:08:09 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-03-06 00:08:09 +0000 |
commit | ea6507fe0473c595b7fd7f45ef116355c5804939 (patch) | |
tree | 403f8836587a79e779359a352182031c8d4e4a26 /clang/Analysis/CFRefCount.cpp | |
parent | dcabdb1b3854d9eb61c50f1124c9e5a8308af6ea (diff) | |
download | bcm5719-llvm-ea6507fe0473c595b7fd7f45ef116355c5804939.tar.gz bcm5719-llvm-ea6507fe0473c595b7fd7f45ef116355c5804939.zip |
Added boilerplate to execute the CF reference count checker (which isn't yet implemented).
llvm-svn: 47982
Diffstat (limited to 'clang/Analysis/CFRefCount.cpp')
-rw-r--r-- | clang/Analysis/CFRefCount.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/clang/Analysis/CFRefCount.cpp b/clang/Analysis/CFRefCount.cpp new file mode 100644 index 00000000000..188ce7084ce --- /dev/null +++ b/clang/Analysis/CFRefCount.cpp @@ -0,0 +1,65 @@ +// CFRefCount.cpp - Transfer functions for tracking simple values -*- C++ -*-- +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This files defines the methods for CFRefCount, which implements +// a reference count checker for Core Foundation (Mac OS X). +// +//===----------------------------------------------------------------------===// + +#include "CFRefCount.h" +#include "clang/Analysis/PathSensitive/ValueState.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Analysis/LocalCheckers.h" + + +using namespace clang; + + +namespace clang { + +void CheckCFRefCount(CFG& cfg, FunctionDecl& FD, ASTContext& Ctx, + Diagnostic& Diag) { + + if (Diag.hasErrorOccurred()) + return; + + // FIXME: Refactor some day so this becomes a single function invocation. + + GRCoreEngine<GRExprEngine> Engine(cfg, FD, Ctx); + GRExprEngine* CS = &Engine.getCheckerState(); + CFRefCount TF; + CS->setTransferFunctions(TF); + Engine.ExecuteWorkList(20000); + +} + +} + +void CFRefCount::EvalCall(ExplodedNodeSet<ValueState>& Dst, + ValueStateManager& StateMgr, + GRStmtNodeBuilder<ValueState>& Builder, + ValueManager& ValMgr, + CallExpr* CE, LVal L, + ExplodedNode<ValueState>* Pred) { + + ValueState* St = Pred->getState(); + + // Invalidate all arguments passed in by reference (LVals). + + for (CallExpr::arg_iterator I = CE->arg_begin(), E = CE->arg_end(); + I != E; ++I) { + + RVal V = StateMgr.GetRVal(St, *I); + + if (isa<LVal>(V)) + St = StateMgr.SetRVal(St, cast<LVal>(V), UnknownVal()); + } + + Builder.Nodify(Dst, CE, Pred, St); +} |