diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-02-12 01:01:31 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-02-12 01:01:31 +0000 |
commit | 148849a74781ed16c6e6f30366f9aaf1f67b1cb1 (patch) | |
tree | d0d40b7db1bde6d8d8b6e4b1c1dee38ffbab9d71 /lib/StaticAnalyzer/Core/CFRefCount.cpp | |
parent | f4e532b5a1683a9f6c842f361c7415bf3474315f (diff) |
static analyzer: Also invalidate instance variables of a receiver in a message expression, just as we do with parameters.
Fixes <rdar://problem/8725041>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125422 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/CFRefCount.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/CFRefCount.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Core/CFRefCount.cpp b/lib/StaticAnalyzer/Core/CFRefCount.cpp index 09e69239d6..92bd4116a7 100644 --- a/lib/StaticAnalyzer/Core/CFRefCount.cpp +++ b/lib/StaticAnalyzer/Core/CFRefCount.cpp @@ -2514,6 +2514,18 @@ void CFRefCount::evalSummary(ExplodedNodeSet& Dst, // done an invalidation pass. llvm::DenseSet<SymbolRef> WhitelistedSymbols; + // Invalidate all instance variables of the receiver of a message. + // FIXME: We should be able to do better with inter-procedural analysis. + if (Receiver) { + SVal V = Receiver.getSValAsScalarOrLoc(state); + if (SymbolRef Sym = V.getAsLocSymbol()) { + if (state->get<RefBindings>(Sym)) + WhitelistedSymbols.insert(Sym); + } + if (const MemRegion *region = V.getAsRegion()) + RegionsToInvalidate.push_back(region); + } + for (unsigned idx = 0, e = callOrMsg.getNumArgs(); idx != e; ++idx) { SVal V = callOrMsg.getArgSValAsScalarOrLoc(idx); SymbolRef Sym = V.getAsLocSymbol(); |