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 | 10b5926e292c4afb0101972322be857f4bb11875 (patch) | |
| tree | 6b62e777a6ab7ff6a326f66d16970622e6847883 | |
| parent | 1173fbdc4b9516f34e6ee54750721b3dc70532d3 (diff) | |
| download | bcm5719-llvm-10b5926e292c4afb0101972322be857f4bb11875.tar.gz bcm5719-llvm-10b5926e292c4afb0101972322be857f4bb11875.zip | |
static analyzer: Also invalidate instance variables of a receiver in a message expression, just as we do with parameters.
Fixes <rdar://problem/8725041>.
llvm-svn: 125422
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/CFRefCount.cpp | 12 | ||||
| -rw-r--r-- | clang/test/Analysis/idempotent-operations.m | 34 |
2 files changed, 46 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp b/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp index 09e69239d64..92bd4116a74 100644 --- a/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp +++ b/clang/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(); diff --git a/clang/test/Analysis/idempotent-operations.m b/clang/test/Analysis/idempotent-operations.m new file mode 100644 index 00000000000..3f68206b168 --- /dev/null +++ b/clang/test/Analysis/idempotent-operations.m @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-check-idempotent-operations -verify %s + +typedef signed char BOOL; +typedef unsigned long NSUInteger; +typedef struct _NSZone NSZone; +@protocol NSObject - (BOOL)isEqual:(id)object; +@end @interface NSObject <NSObject> { +} +@end + + +// <rdar://problem/8725041> - Don't flag idempotent operation warnings when +// a method may invalidate an instance variable. +@interface Rdar8725041 : NSObject { + id _attribute; +} + - (void) method2; +@end + +@implementation Rdar8725041 +- (BOOL) method1 { + BOOL needsUpdate = (BOOL)0; + id oldAttribute = _attribute; + [self method2]; + needsUpdate |= (_attribute != oldAttribute); // no-warning + return needsUpdate; +} + +- (void) method2 +{ + _attribute = ((void*)0); +} +@end + |

