68 lines · plain
1// RUN: %clang_analyze_cc1 -fobjc-arc -analyzer-checker=core,debug.ExprInspection -verify %s2 3void clang_analyzer_eval(int);4void clang_analyzer_warnIfReached(void);5 6extern void __assert_fail (__const char *__assertion, __const char *__file,7 unsigned int __line, __const char *__function)8 __attribute__ ((__noreturn__));9 10#define assert(expr) \11 ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__))12 13 14@protocol NSObject15+ (nonnull instancetype)alloc;16- (nonnull instancetype)init;17@end18@interface NSObject <NSObject> {}19@end20 21@interface NSError : NSObject {22@public23 int x;24}25@end26 27 28@interface SomeClass : NSObject29+ (int)doSomethingWithError:(NSError *__autoreleasing *)error;30@end31 32@implementation SomeClass33+ (int)doSomethingWithError:(NSError *__autoreleasing *)error {34 if (error) {35 NSError *e = [[NSError alloc] init];36 assert(e);37 e->x = 5;38 *error = e;39 clang_analyzer_eval(*error != 0); // expected-warning{{TRUE}}40 }41 return 0;42}43@end44 45void testStrongOutParam(void) {46 NSError *error;47 clang_analyzer_eval(error != 0); // expected-warning{{FALSE}}48 int ok = [SomeClass doSomethingWithError:&error];49 clang_analyzer_eval(ok); // expected-warning{{FALSE}}50 clang_analyzer_eval(error != 0); // expected-warning{{TRUE}}51 clang_analyzer_eval(error->x == 5); // expected-warning{{TRUE}}52}53 54void testAutoreleasingOutParam(void) {55 NSError *__autoreleasing error;56 clang_analyzer_eval(error != 0); // expected-warning{{FALSE}}57 int ok = [SomeClass doSomethingWithError:&error];58 clang_analyzer_eval(ok); // expected-warning{{FALSE}}59 clang_analyzer_eval(error != 0); // expected-warning{{TRUE}}60 clang_analyzer_eval(error->x == 5); // expected-warning{{TRUE}}61}62 63void testNilOutParam(void) {64 int ok = [SomeClass doSomethingWithError:(void *)0];65 clang_analyzer_eval(ok); // expected-warning{{FALSE}}66}67 68