• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -verify -fblocks %s
2
3@class NSString;
4typedef long NSInteger;
5typedef unsigned char BOOL;
6@interface NSObject {}
7+(id)alloc;
8-(id)init;
9-(id)autorelease;
10-(id)copy;
11-(id)retain;
12@end
13@interface NSNumber : NSObject
14+ (NSNumber *)numberWithInteger:(NSInteger)value __attribute__((availability(ios,introduced=2.0)));
15@end
16
17NSInteger *inoutIntegerValueGlobal;
18NSInteger *inoutIntegerValueGlobal2;
19NSString *traitNameGlobal;
20static BOOL cond;
21
22static inline void reallyPerformAction(void (^integerHandler)(NSInteger *inoutIntegerValue, NSString *traitName)) {
23  integerHandler(inoutIntegerValueGlobal, traitNameGlobal);
24  integerHandler(inoutIntegerValueGlobal2,traitNameGlobal);
25}
26
27static inline BOOL performAction(NSNumber *(^action)(NSNumber *traitValue)) {
28  __attribute__((__blocks__(byref))) BOOL didFindTrait = 0;
29  reallyPerformAction(^(NSInteger *inoutIntegerValue,NSString *traitName) {
30
31    if (cond) {
32
33      NSNumber *traitValue = @(*inoutIntegerValue);
34
35      NSNumber *newTraitValue = action(traitValue);
36
37      if (traitValue != newTraitValue) {
38        *inoutIntegerValue = newTraitValue ? *inoutIntegerValue : *inoutIntegerValue;
39      }
40      didFindTrait = 1;
41    }
42
43  });
44  return didFindTrait;
45}
46
47void runTest() {
48  __attribute__((__blocks__(byref))) NSNumber *builtinResult = ((NSNumber *)0);
49  BOOL wasBuiltinTrait = performAction(^(NSNumber *traitValue) {
50    builtinResult = [traitValue retain]; // expected-warning {{Potential leak of an object}}
51
52    return traitValue;
53  });
54  if (wasBuiltinTrait) {
55    [builtinResult autorelease];
56    return;
57  } else {
58    return;
59  }
60}
61