120 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,debug.ExprInspection,unix.Malloc,unix.cstring,alpha.unix.cstring,unix.API,osx.API,osx.cocoa.RetainCount -Wno-null-dereference -Wno-tautological-compare -fblocks -verify -analyzer-config eagerly-assume=false %s2#define NULL 03void clang_analyzer_eval(int);4void myFunc(void);5void myWeakFunc(void) __attribute__((weak_import));6 7void testWeakFuncIsNull(void)8{9 clang_analyzer_eval(myFunc == NULL); // expected-warning{{FALSE}}10 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{UNKNOWN}}11 if (myWeakFunc == NULL) {12 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{TRUE}}13 } else {14 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{FALSE}}15 }16}17 18void testWeakFuncIsNot(void)19{20 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{UNKNOWN}}21 if (!myWeakFunc) {22 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{TRUE}}23 } else {24 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{FALSE}}25 }26}27 28void testWeakFuncIsTrue(void)29{30 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{UNKNOWN}}31 if (myWeakFunc) {32 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{FALSE}}33 } else {34 clang_analyzer_eval(myWeakFunc == NULL); // expected-warning{{TRUE}}35 }36}37 38//===----------------------------------------------------------------------===39// func.c40//===----------------------------------------------------------------------===41void f(void) __attribute__((weak_import));42void g(void (*fp)(void)) __attribute__((weak_import));43 44void f(void) {45 void (*p)(void);46 p = f;47 p = &f;48 p();49 (*p)();50}51 52void g(void (*fp)(void));53 54void f2(void) {55 g(f);56}57 58void f3(void (*f)(void), void (*g)(void)) {59 clang_analyzer_eval(!f); // expected-warning{{UNKNOWN}}60 f();61 clang_analyzer_eval(!f); // expected-warning{{FALSE}}62 63 clang_analyzer_eval(!g); // expected-warning{{UNKNOWN}}64 (*g)();65 clang_analyzer_eval(!g); // expected-warning{{FALSE}}66}67 68//===----------------------------------------------------------------------===69// free.c70//===----------------------------------------------------------------------===71void free(void *) __attribute__((weak_import));72 73void t10 (void) {74 free((void*)&t10);75 // expected-warning@-1{{Argument to 'free()' is the address of the function 't10', which is not memory allocated by 'malloc()'}}76 // expected-warning@-2{{attempt to call free on non-heap object 't10'}}77}78 79//===----------------------------------------------------------------------===80// string.c : strnlen()81//===----------------------------------------------------------------------===82typedef typeof(sizeof(int)) size_t;83size_t strlen(const char *s) __attribute__((weak_import));84 85size_t strlen_fn(void) {86 return strlen((char*)&strlen_fn); // expected-warning{{Argument to string length function is the address of the function 'strlen_fn', which is not a null-terminated string}}87}88 89//===----------------------------------------------------------------------===90// unix-fns.c : dispatch_once91//===----------------------------------------------------------------------===92typedef void (^dispatch_block_t)(void);93typedef long dispatch_once_t;94void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block) __attribute__((weak_import));95 96void test_dispatch_once(void) {97 dispatch_once_t pred = 0;98 do { if (__builtin_expect(*(&pred), ~0l) != ~0l) dispatch_once((&pred), (^(void) {})); } while (0); // expected-warning{{Call to 'dispatch_once' uses the local variable 'pred' for the predicate value}}99}100void test_dispatch_once_neg(void) {101 static dispatch_once_t pred = 0;102 do { if (__builtin_expect(*(&pred), ~0l) != ~0l) dispatch_once((&pred), (^(void) {})); } while (0); // no-warning103}104 105//===----------------------------------------------------------------------===106// retain-release-path-notes.m107//===----------------------------------------------------------------------===108typedef struct CFType *CFTypeRef;109CFTypeRef CFCreateSomething(void) __attribute__((weak_import));110CFTypeRef CFGetSomething(void) __attribute__((weak_import));111 112CFTypeRef CFCopyRuleViolation (void) {113 CFTypeRef object = CFGetSomething();114 return object; // expected-warning{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}}115}116 117CFTypeRef CFGetRuleViolation (void) {118 CFTypeRef object = CFCreateSomething(); // expected-warning{{Potential leak of an object stored into 'object'}}119 return object; }120