annotate clang/test/Sema/nonnull.c @ 169:1f21f60db75c

Added tag llvm10 for changeset 980e56f2e095
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 09:26:57 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
anatofuz
parents:
diff changeset
2 // rdar://9584012
anatofuz
parents:
diff changeset
3 //
anatofuz
parents:
diff changeset
4 // Verify All warnings are still issued with the option -fno-delete-null-pointer-checks
anatofuz
parents:
diff changeset
5 // if nullptr is passed to function with nonnull attribute.
anatofuz
parents:
diff changeset
6 // RUN: %clang_cc1 -fsyntax-only -fno-delete-null-pointer-checks -verify %s
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 typedef struct {
anatofuz
parents:
diff changeset
9 char *str;
anatofuz
parents:
diff changeset
10 } Class;
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 typedef union {
anatofuz
parents:
diff changeset
13 Class *object;
anatofuz
parents:
diff changeset
14 } Instance __attribute__((transparent_union));
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 __attribute__((nonnull(1))) void Class_init(Instance this, char *str) {
anatofuz
parents:
diff changeset
17 this.object->str = str;
anatofuz
parents:
diff changeset
18 }
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 int main(void) {
anatofuz
parents:
diff changeset
21 Class *obj;
anatofuz
parents:
diff changeset
22 Class_init(0, "Hello World"); // expected-warning {{null passed to a callee that requires a non-null argument}}
anatofuz
parents:
diff changeset
23 Class_init(obj, "Hello World");
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 void foo(const char *str) __attribute__((nonnull("foo"))); // expected-error{{'nonnull' attribute requires parameter 1 to be an integer constant}}
anatofuz
parents:
diff changeset
27 void bar(int i) __attribute__((nonnull(1))); // expected-warning {{'nonnull' attribute only applies to pointer arguments}} expected-warning {{'nonnull' attribute applied to function with no pointer arguments}}
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 void baz(__attribute__((nonnull)) const char *str);
anatofuz
parents:
diff changeset
30 void baz2(__attribute__((nonnull(1))) const char *str); // expected-warning {{'nonnull' attribute when used on parameters takes no arguments}}
anatofuz
parents:
diff changeset
31 void baz3(__attribute__((nonnull)) int x); // expected-warning {{'nonnull' attribute only applies to pointer arguments}}
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 void test_baz() {
anatofuz
parents:
diff changeset
34 baz(0); // expected-warning {{null passed to a callee that requires a non-null argument}}
anatofuz
parents:
diff changeset
35 baz2(0); // no-warning
anatofuz
parents:
diff changeset
36 baz3(0); // no-warning
anatofuz
parents:
diff changeset
37 }
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 void test_void_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
anatofuz
parents:
diff changeset
40 int test_int_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
anatofuz
parents:
diff changeset
41 void *test_ptr_returns_nonnull(void) __attribute__((returns_nonnull)); // no-warning
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 int i __attribute__((nonnull)); // expected-warning {{'nonnull' attribute only applies to functions, methods, and parameters}}
anatofuz
parents:
diff changeset
44 int j __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to Objective-C methods and functions}}
anatofuz
parents:
diff changeset
45 void *test_no_fn_proto() __attribute__((returns_nonnull)); // no-warning
anatofuz
parents:
diff changeset
46 void *test_with_fn_proto(void) __attribute__((returns_nonnull)); // no-warning
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 __attribute__((returns_nonnull))
anatofuz
parents:
diff changeset
49 void *test_bad_returns_null(void) {
anatofuz
parents:
diff changeset
50 return 0; // expected-warning {{null returned from function that requires a non-null return value}}
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 void PR18795(int (*g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
anatofuz
parents:
diff changeset
54 g(0); // expected-warning{{null passed to a callee that requires a non-null argument}}
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56 void PR18795_helper() {
anatofuz
parents:
diff changeset
57 PR18795(0); // expected-warning{{null passed to a callee that requires a non-null argument}}
anatofuz
parents:
diff changeset
58 }
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 void vararg1(int n, ...) __attribute__((nonnull(2)));
anatofuz
parents:
diff changeset
61 void vararg1_test() {
anatofuz
parents:
diff changeset
62 vararg1(0);
anatofuz
parents:
diff changeset
63 vararg1(1, (void*)0); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
64 vararg1(2, (void*)0, (void*)0); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
65 vararg1(2, (void*)&vararg1, (void*)0);
anatofuz
parents:
diff changeset
66 }
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 void vararg2(int n, ...) __attribute__((nonnull, nonnull, nonnull));
anatofuz
parents:
diff changeset
69 void vararg2_test() {
anatofuz
parents:
diff changeset
70 vararg2(0);
anatofuz
parents:
diff changeset
71 vararg2(1, (void*)0); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
72 vararg2(2, (void*)0, (void*)0); // expected-warning 2{{null passed}}
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 void vararg3(int n, ...) __attribute__((nonnull, nonnull(2), nonnull(3)));
anatofuz
parents:
diff changeset
76 void vararg3_test() {
anatofuz
parents:
diff changeset
77 vararg3(0);
anatofuz
parents:
diff changeset
78 vararg3(1, (void*)0); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
79 vararg3(2, (void*)0, (void*)0); // expected-warning 2{{null passed}}
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 void redecl(void *, void *);
anatofuz
parents:
diff changeset
83 void redecl(void *, void *) __attribute__((nonnull(1)));
anatofuz
parents:
diff changeset
84 void redecl(void *, void *) __attribute__((nonnull(2)));
anatofuz
parents:
diff changeset
85 void redecl(void *, void *);
anatofuz
parents:
diff changeset
86 void redecl_test(void *p) {
anatofuz
parents:
diff changeset
87 redecl(p, 0); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
88 redecl(0, p); // expected-warning{{null passed}}
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 // rdar://18712242
anatofuz
parents:
diff changeset
92 #define NULL (void*)0
anatofuz
parents:
diff changeset
93 __attribute__((__nonnull__)) // expected-note 2{{declared 'nonnull' here}}
anatofuz
parents:
diff changeset
94 int evil_nonnull_func(int* pointer, void * pv)
anatofuz
parents:
diff changeset
95 {
anatofuz
parents:
diff changeset
96 if (pointer == NULL) { // expected-warning {{comparison of nonnull parameter 'pointer' equal to a null pointer is 'false' on first encounter}}
anatofuz
parents:
diff changeset
97 return 0;
anatofuz
parents:
diff changeset
98 } else {
anatofuz
parents:
diff changeset
99 return *pointer;
anatofuz
parents:
diff changeset
100 }
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 pointer = pv;
anatofuz
parents:
diff changeset
103 if (!pointer)
anatofuz
parents:
diff changeset
104 return 0;
anatofuz
parents:
diff changeset
105 else
anatofuz
parents:
diff changeset
106 return *pointer;
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 if (pv == NULL) {} // expected-warning {{comparison of nonnull parameter 'pv' equal to a null pointer is 'false' on first encounter}}
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 void set_param_to_null(int**);
anatofuz
parents:
diff changeset
112 int another_evil_nonnull_func(int* pointer, char ch, void * pv) __attribute__((nonnull(1, 3))); // expected-note 2{{declared 'nonnull' here}}
anatofuz
parents:
diff changeset
113 int another_evil_nonnull_func(int* pointer, char ch, void * pv) {
anatofuz
parents:
diff changeset
114 if (pointer == NULL) { // expected-warning {{comparison of nonnull parameter 'pointer' equal to a null pointer is 'false' on first encounter}}
anatofuz
parents:
diff changeset
115 return 0;
anatofuz
parents:
diff changeset
116 } else {
anatofuz
parents:
diff changeset
117 return *pointer;
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 set_param_to_null(&pointer);
anatofuz
parents:
diff changeset
121 if (!pointer)
anatofuz
parents:
diff changeset
122 return 0;
anatofuz
parents:
diff changeset
123 else
anatofuz
parents:
diff changeset
124 return *pointer;
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 if (pv == NULL) {} // expected-warning {{comparison of nonnull parameter 'pv' equal to a null pointer is 'false' on first encounter}}
anatofuz
parents:
diff changeset
127 }
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 extern void *returns_null(void**);
anatofuz
parents:
diff changeset
130 extern void FOO();
anatofuz
parents:
diff changeset
131 extern void FEE();
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 extern void *pv;
anatofuz
parents:
diff changeset
134 __attribute__((__nonnull__)) // expected-note {{declared 'nonnull' here}}
anatofuz
parents:
diff changeset
135 void yet_another_evil_nonnull_func(int* pointer)
anatofuz
parents:
diff changeset
136 {
anatofuz
parents:
diff changeset
137 while (pv) {
anatofuz
parents:
diff changeset
138 // This comparison will not be optimized away.
anatofuz
parents:
diff changeset
139 if (pointer) { // expected-warning {{nonnull parameter 'pointer' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
140 FOO();
anatofuz
parents:
diff changeset
141 } else {
anatofuz
parents:
diff changeset
142 FEE();
anatofuz
parents:
diff changeset
143 }
anatofuz
parents:
diff changeset
144 pointer = returns_null(&pv);
anatofuz
parents:
diff changeset
145 }
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 void pr21668_1(__attribute__((nonnull)) const char *p, const char *s) { // expected-note {{declared 'nonnull' here}}
anatofuz
parents:
diff changeset
149 if (p) // expected-warning {{nonnull parameter 'p' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
150 ;
anatofuz
parents:
diff changeset
151 if (s) // No warning
anatofuz
parents:
diff changeset
152 ;
anatofuz
parents:
diff changeset
153 }
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 void pr21668_2(__attribute__((nonnull)) const char *p) {
anatofuz
parents:
diff changeset
156 p = 0;
anatofuz
parents:
diff changeset
157 if (p) // No warning
anatofuz
parents:
diff changeset
158 ;
anatofuz
parents:
diff changeset
159 }
anatofuz
parents:
diff changeset
160
anatofuz
parents:
diff changeset
161 __attribute__((returns_nonnull)) void *returns_nonnull_whee(); // expected-note 6{{declared 'returns_nonnull' here}}
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 void returns_nonnull_warning_tests() {
anatofuz
parents:
diff changeset
164 if (returns_nonnull_whee() == NULL) {} // expected-warning {{comparison of nonnull function call 'returns_nonnull_whee()' equal to a null pointer is 'false' on first encounter}}
anatofuz
parents:
diff changeset
165
anatofuz
parents:
diff changeset
166 if (returns_nonnull_whee() != NULL) {} // expected-warning {{comparison of nonnull function call 'returns_nonnull_whee()' not equal to a null pointer is 'true' on first encounter}}
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 if (returns_nonnull_whee()) {} // expected-warning {{nonnull function call 'returns_nonnull_whee()' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
169 if (!returns_nonnull_whee()) {} // expected-warning {{nonnull function call 'returns_nonnull_whee()' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 int and_again = !returns_nonnull_whee(); // expected-warning {{nonnull function call 'returns_nonnull_whee()' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
172 and_again = !returns_nonnull_whee(); // expected-warning {{nonnull function call 'returns_nonnull_whee()' will evaluate to 'true' on first encounter}}
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 void pr30828(char *p __attribute__((nonnull)));
anatofuz
parents:
diff changeset
176 void pr30828(char *p) {}
anatofuz
parents:
diff changeset
177
anatofuz
parents:
diff changeset
178 void call_pr30828() {
anatofuz
parents:
diff changeset
179 pr30828(0); // expected-warning {{null passed to a callee that requires a non-null argument}}
anatofuz
parents:
diff changeset
180 }