2017-11-15 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.dg / builtins-nonnull.c
blobfa9eaf2327dfa76b889556dc2d600fc0aa9ace3d
1 /* PR c/17308 - nonnull attribute not as useful as it could be
2 PR c/78673 - sprintf missing attribute nonnull on destination argument
3 { dg-do "compile" }
4 { dg-additional-options "-O2 -Wnonnull -ftrack-macro-expansion=0 -std=c99" } */
6 #define va_list __builtin_va_list
8 typedef struct FILE FILE;
10 char* null (void)
12 return 0;
15 void sink (int, ...);
16 #define T(arg) sink (0, arg)
19 #define bzero __builtin_bzero
20 #define memcpy __builtin_memcpy
21 #define memmove __builtin_memmove
22 #define mempcpy __builtin_mempcpy
23 #define memset __builtin_memset
25 void test_memfuncs (void *s, unsigned n)
27 /* Bzero is not declared attribute nonnull. */
28 bzero (null (), n);
30 T (memcpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
31 T (memcpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
33 T (memmove (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
34 T (memmove (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
36 T (mempcpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
37 T (mempcpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
39 T (memset (null (), 0, n)); /* { dg-warning "argument 1 null where non-null expected" } */
42 #undef memcpy
43 #undef memmove
44 #undef mempcpy
45 #undef memset
46 #define memcpy(d, s, n) __builtin___memcpy_chk (d, s, n, n)
47 #define memmove(d, s, n) __builtin___memmove_chk (d, s, n, n)
48 #define mempcpy(d, s, n) __builtin___mempcpy_chk (d, s, n, n)
49 #define memset(d, x, n) __builtin___memset_chk (d, x, n, n)
51 void test_memfuncs_chk (void *s, unsigned n)
53 T (memcpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
54 T (memcpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
56 T (memmove (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
57 T (memmove (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
59 T (mempcpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
60 T (mempcpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
62 T (memset (null (), 0, n)); /* { dg-warning "argument 1 null where non-null expected" } */
66 #define strcat __builtin_strcat
67 #define strchr __builtin_strchr
68 #define stpcpy __builtin_stpcpy
69 #define stpncpy __builtin_stpncpy
70 #define strcpy __builtin_strcpy
71 #define strncpy __builtin_strncpy
72 #define strlen __builtin_strlen
73 #define strncat __builtin_strncat
74 #define strstr __builtin_strstr
76 void test_strfuncs (char *s, unsigned n)
78 T (strcat (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
79 T (strcat (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
81 T (strchr (null (), 'x')); /* { dg-warning "argument 1 null where non-null expected" } */
83 T (stpcpy (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
84 T (stpcpy (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
86 T (stpncpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
87 T (stpncpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
89 T (strcpy (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
90 T (strcpy (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
92 T (strncpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
93 T (strncpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
95 T (strlen (null ())); /* { dg-warning "argument 1 null where non-null expected" } */
97 T (strncat (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
98 T (strncat (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
100 T (strstr (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
101 T (strstr (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
105 #undef strcat
106 #undef stpcpy
107 #undef stpncpy
108 #undef strcpy
109 #undef strncpy
110 #undef strncat
112 #define strcat(d, s) __builtin___strcat_chk (d, s, n)
113 #define stpcpy(d, s) __builtin___stpcpy_chk (d, s, n)
114 #define stpncpy(d, s, n) __builtin___stpncpy_chk (d, s, n, n)
115 #define strcpy(d, s) __builtin___strcpy_chk (d, s, n)
116 #define strncpy(d, s, n) __builtin___strncpy_chk (d, s, n, n)
117 #define strncat(d, s, n) __builtin___strncat_chk (d, s, n, n)
119 void test_strfuncs_chk (char *s, unsigned n)
121 T (strcat (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
122 T (strcat (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
124 T (strchr (null (), 'x')); /* { dg-warning "argument 1 null where non-null expected" } */
126 T (stpcpy (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
127 T (stpcpy (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
129 T (stpncpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
130 T (stpncpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
132 T (strcpy (null (), s)); /* { dg-warning "argument 1 null where non-null expected" } */
133 T (strcpy (s, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
135 T (strncpy (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
136 T (strncpy (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
138 T (strncat (s, null (), n)); /* { dg-warning "argument 2 null where non-null expected" } */
139 T (strncat (null (), s, n)); /* { dg-warning "argument 1 null where non-null expected" } */
143 #define fprintf __builtin_fprintf
144 #define fprintf_unlocked __builtin_fprintf_unlocked
145 #define vfprintf __builtin_vfprintf
146 #define printf __builtin_printf
147 #define printf_unlocked __builtin_printf_unlocked
148 #define vprintf __builtin_vprintf
149 #define sprintf __builtin_sprintf
150 #define snprintf __builtin_snprintf
151 #define vsprintf __builtin_vsprintf
152 #define vsnprintf __builtin_vsnprintf
154 void test_stdio_funcs (FILE *f, char *d, unsigned n, va_list va)
156 T (fprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
157 T (fprintf (f, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
159 T (fprintf_unlocked (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
160 T (fprintf_unlocked (f, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
162 T (vfprintf (null (), "%i", va));/* { dg-warning "argument 1 null where non-null expected" } */
163 T (vfprintf (f, null (), va)); /* { dg-warning "argument 2 null where non-null expected" } */
165 T (vprintf (null (), va)); /* { dg-warning "argument 1 null where non-null expected" } */
167 T (printf (null ())); /* { dg-warning "argument 1 null where non-null expected" } */
168 T (printf_unlocked (null ())); /* { dg-warning "argument 1 null where non-null expected" } */
170 T (vprintf (null (), va)); /* { dg-warning "argument 1 null where non-null expected" } */
172 T (sprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
173 T (sprintf (d, null ())); /* { dg-warning "argument 2 null where non-null expected" } */
175 T (snprintf (null (), n, "%i", 0));
176 T (snprintf (d, n, null ())); /* { dg-warning "argument 3 null where non-null expected" } */
178 T (vsprintf (null (), "%i", va)); /* { dg-warning "argument 1 null where non-null expected" } */
179 T (vsprintf (d, null (), va)); /* { dg-warning "argument 2 null where non-null expected" } */
181 T (vsnprintf (null (), n, "%i", va));
182 T (vsnprintf (d, n, null (), va)); /* { dg-warning "argument 3 null where non-null expected" } */
185 #undef fprintf
186 #undef fprintf_unlocked
187 #undef vfprintf
188 #undef printf
189 #undef printf_unlocked
190 #undef vprintf
191 #undef sprintf
192 #undef snprintf
193 #undef vsprintf
194 #undef vsnprintf
196 #define fprintf(f, fmt, ...) \
197 __builtin___fprintf_chk (f, 0, fmt, __VA_ARGS__)
198 #define vfprintf(f, fmt, va) \
199 __builtin___vfprintf_chk (f, 0, fmt, va)
200 #define printf(fmt, ...) \
201 __builtin___printf_chk (0, fmt, __VA_ARGS__)
202 #define vprintf(fmt, va) \
203 __builtin___vprintf_chk (0, fmt, va)
204 #define sprintf(d, fmt, ... ) \
205 __builtin___sprintf_chk (d, 0, n, fmt, __VA_ARGS__)
206 #define snprintf(d, n, fmt, ...) \
207 __builtin___snprintf_chk (d, n, 0, n, fmt, __VA_ARGS__)
208 #define vsprintf(d, fmt, va) \
209 __builtin___vsprintf_chk (d, 0, n, fmt, va)
210 #define vsnprintf(d, n, fmt, va) \
211 __builtin___vsnprintf_chk (d, n, 0, n, fmt, va)
213 void test_stdio_funcs_chk (FILE *f, char *d, const char *fmt,
214 unsigned n, va_list va)
216 T (fprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
217 T (fprintf (f, null (), 0)); /* { dg-warning "argument 3 null where non-null expected" } */
219 T (vfprintf (null (), "%i", va));/* { dg-warning "argument 1 null where non-null expected" } */
220 T (vfprintf (f, null (), va)); /* { dg-warning "argument 3 null where non-null expected" } */
222 T (vprintf (null (), va)); /* { dg-warning "argument 2 null where non-null expected" } */
224 T (printf (null (), 0)); /* { dg-warning "argument 2 null where non-null expected" } */
226 T (vprintf (null (), va)); /* { dg-warning "argument 2 null where non-null expected" } */
228 T (sprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
229 T (sprintf (d, null (), 0)); /* { dg-warning "argument 4 null where non-null expected" } */
231 T (snprintf (null (), n, "%i", 0));
232 T (snprintf (d, n, null (), 0)); /* { dg-warning "argument 5 null where non-null expected" } */
234 T (vsprintf (null (), "%i", va)); /* { dg-warning "argument 1 null where non-null expected" } */
235 T (vsprintf (d, null (), va)); /* { dg-warning "argument 4 null where non-null expected" } */
237 T (vsnprintf (null (), n, "%i", va));
238 T (vsnprintf (d, n, null (), va)); /* { dg-warning "argument 5 null where non-null expected" } */