Skip to content
Snippets Groups Projects
Commit 148849a7 authored by Ted Kremenek's avatar Ted Kremenek
Browse files

static analyzer: Also invalidate instance variables of a receiver in a message...

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
parent f4e532b5
No related branches found
No related tags found
No related merge requests found
...@@ -2514,6 +2514,18 @@ void CFRefCount::evalSummary(ExplodedNodeSet& Dst, ...@@ -2514,6 +2514,18 @@ void CFRefCount::evalSummary(ExplodedNodeSet& Dst,
// done an invalidation pass. // done an invalidation pass.
llvm::DenseSet<SymbolRef> WhitelistedSymbols; 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) { for (unsigned idx = 0, e = callOrMsg.getNumArgs(); idx != e; ++idx) {
SVal V = callOrMsg.getArgSValAsScalarOrLoc(idx); SVal V = callOrMsg.getArgSValAsScalarOrLoc(idx);
SymbolRef Sym = V.getAsLocSymbol(); SymbolRef Sym = V.getAsLocSymbol();
......
// 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment