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 %s
3 void clang_analyzer_eval(int);
5 void myWeakFunc(void) __attribute__((weak_import
));
7 void testWeakFuncIsNull(void)
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}}
14 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{FALSE}}
18 void testWeakFuncIsNot(void)
20 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{UNKNOWN}}
22 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{TRUE}}
24 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{FALSE}}
28 void testWeakFuncIsTrue(void)
30 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{UNKNOWN}}
32 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{FALSE}}
34 clang_analyzer_eval(myWeakFunc
== NULL
); // expected-warning{{TRUE}}
38 //===----------------------------------------------------------------------===
40 //===----------------------------------------------------------------------===
41 void f(void) __attribute__((weak_import
));
42 void g(void (*fp
)(void)) __attribute__((weak_import
));
52 void g(void (*fp
)(void));
58 void f3(void (*f
)(void), void (*g
)(void)) {
59 clang_analyzer_eval(!f
); // expected-warning{{UNKNOWN}}
61 clang_analyzer_eval(!f
); // expected-warning{{FALSE}}
63 clang_analyzer_eval(!g
); // expected-warning{{UNKNOWN}}
65 clang_analyzer_eval(!g
); // expected-warning{{FALSE}}
68 //===----------------------------------------------------------------------===
70 //===----------------------------------------------------------------------===
71 void free(void *) __attribute__((weak_import
));
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'}}
79 //===----------------------------------------------------------------------===
80 // string.c : strnlen()
81 //===----------------------------------------------------------------------===
82 typedef typeof(sizeof(int)) size_t;
83 size_t strlen(const char *s
) __attribute__((weak_import
));
85 size_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}}
89 //===----------------------------------------------------------------------===
90 // unix-fns.c : dispatch_once
91 //===----------------------------------------------------------------------===
92 typedef void (^dispatch_block_t
)(void);
93 typedef long dispatch_once_t
;
94 void dispatch_once(dispatch_once_t
*predicate
, dispatch_block_t block
) __attribute__((weak_import
));
96 void 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}}
100 void 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-warning
105 //===----------------------------------------------------------------------===
106 // retain-release-path-notes.m
107 //===----------------------------------------------------------------------===
108 typedef struct CFType
*CFTypeRef
;
109 CFTypeRef
CFCreateSomething(void) __attribute__((weak_import
));
110 CFTypeRef
CFGetSomething(void) __attribute__((weak_import
));
112 CFTypeRef
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}}
117 CFTypeRef
CFGetRuleViolation (void) {
118 CFTypeRef object
= CFCreateSomething(); // expected-warning{{Potential leak of an object stored into 'object'}}