blob: 40171a39c951c9feeb0ccb65e92820d3a176c88f [file] [log] [blame]
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,osx.cocoa.SelfInit,debug.ExprInspection -verify -w %s
// This file contains crash regression tests; please do not remove any checkers
// from the RUN line because they may have been necessary to produce the crash.
// (Adding checkers should be fine.)
void clang_analyzer_eval(int);
@interface NSObject
- (id)init;
@end
@interface Foo : NSObject
@end
void touch(id, SEL);
id getObject();
int getInt();
@implementation Foo
// Bizarre crash related to the ExprEngine reaching a previously-seen
// ExplodedNode /during/ the processing of a message. Removing any
// parts of this test case seem not to trigger the crash any longer.
// <rdar://problem/12243648>
- (id)init {
// Step 0: properly call the superclass's initializer
self = [super init];
if (!self) return self;
// Step 1: Perturb the state with a new conjured symbol.
int value = getInt();
// Step 2: Loop. Some loops seem to trigger this, some don't.
// The original used a for-in loop.
while (--value) {
// Step 3: Make it impossible to retain-count 'self' by calling
// a function that takes a "callback" (in this case, a selector).
// Note that this does not trigger the crash if you use a message!
touch(self, @selector(hi));
}
// Step 4: Use 'self', so that we know it's non-nil.
[self bar];
// Step 5: Once again, make it impossible to retain-count 'self'...
// ...while letting ObjCSelfInitChecker mark this as an interesting
// message, since 'self' is an argument...
// ...but this time do it in such a way that we'll also assume that
// 'other' is non-nil. Once we've made the latter assumption, we
// should cache out.
id other = getObject();
[other use:self withSelector:@selector(hi)];
// Step 6: Check that we did, in fact, keep the assumptions about 'self'
// and 'other' being non-nil.
clang_analyzer_eval(other != 0); // expected-warning{{TRUE}}
clang_analyzer_eval(self != 0); // expected-warning{{TRUE}}
return self;
}
@end