diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-03-10 04:58:55 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-03-10 04:58:55 +0000 |
commit | c8023788ace75cf0a0417b9b88e643ceebae91e2 (patch) | |
tree | 7bde59db56a5957fab4186340d9145f2d9e8b8df /lib/Checker/SVals.cpp | |
parent | dd8f569f84a73c0b0e1449475f333d101e6c9401 (diff) |
Add use-after-free check to MallocChecker.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98136 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker/SVals.cpp')
-rw-r--r-- | lib/Checker/SVals.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Checker/SVals.cpp b/lib/Checker/SVals.cpp index 28b3fce050..4bfa2cdafb 100644 --- a/lib/Checker/SVals.cpp +++ b/lib/Checker/SVals.cpp @@ -70,6 +70,25 @@ SymbolRef SVal::getAsLocSymbol() const { return NULL; } +/// Get the symbol in the SVal or its base region. +SymbolRef SVal::getLocSymbolInBase() const { + const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal>(this); + + if (!X) + return 0; + + const MemRegion *R = X->getRegion(); + + while (const SubRegion *SR = dyn_cast<SubRegion>(R)) { + if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SR)) + return SymR->getSymbol(); + else + R = SR->getSuperRegion(); + } + + return 0; +} + /// getAsSymbol - If this Sval wraps a symbol return that SymbolRef. /// Otherwise return 0. // FIXME: should we consider SymbolRef wrapped in CodeTextRegion? |