aboutsummaryrefslogtreecommitdiff
path: root/lib/Checker/SVals.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-03-10 04:58:55 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-03-10 04:58:55 +0000
commitc8023788ace75cf0a0417b9b88e643ceebae91e2 (patch)
tree7bde59db56a5957fab4186340d9145f2d9e8b8df /lib/Checker/SVals.cpp
parentdd8f569f84a73c0b0e1449475f333d101e6c9401 (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.cpp19
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?