gimple-ssa-warn-access.cc revision 1.1.1.1 1 1.1 mrg /* Pass to detect and issue warnings for invalid accesses, including
2 1.1 mrg invalid or mismatched allocation/deallocation calls.
3 1.1 mrg
4 1.1 mrg Copyright (C) 2020-2022 Free Software Foundation, Inc.
5 1.1 mrg Contributed by Martin Sebor <msebor (at) redhat.com>.
6 1.1 mrg
7 1.1 mrg This file is part of GCC.
8 1.1 mrg
9 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
10 1.1 mrg the terms of the GNU General Public License as published by the Free
11 1.1 mrg Software Foundation; either version 3, or (at your option) any later
12 1.1 mrg version.
13 1.1 mrg
14 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 1.1 mrg for more details.
18 1.1 mrg
19 1.1 mrg You should have received a copy of the GNU General Public License
20 1.1 mrg along with GCC; see the file COPYING3. If not see
21 1.1 mrg <http://www.gnu.org/licenses/>. */
22 1.1 mrg
23 1.1 mrg #define INCLUDE_STRING
24 1.1 mrg #include "config.h"
25 1.1 mrg #include "system.h"
26 1.1 mrg #include "coretypes.h"
27 1.1 mrg #include "backend.h"
28 1.1 mrg #include "tree.h"
29 1.1 mrg #include "gimple.h"
30 1.1 mrg #include "tree-pass.h"
31 1.1 mrg #include "builtins.h"
32 1.1 mrg #include "diagnostic.h"
33 1.1 mrg #include "ssa.h"
34 1.1 mrg #include "gimple-pretty-print.h"
35 1.1 mrg #include "gimple-ssa-warn-access.h"
36 1.1 mrg #include "gimple-ssa-warn-restrict.h"
37 1.1 mrg #include "diagnostic-core.h"
38 1.1 mrg #include "fold-const.h"
39 1.1 mrg #include "gimple-fold.h"
40 1.1 mrg #include "gimple-iterator.h"
41 1.1 mrg #include "langhooks.h"
42 1.1 mrg #include "memmodel.h"
43 1.1 mrg #include "target.h"
44 1.1 mrg #include "tree-dfa.h"
45 1.1 mrg #include "tree-ssa.h"
46 1.1 mrg #include "tree-cfg.h"
47 1.1 mrg #include "tree-object-size.h"
48 1.1 mrg #include "tree-ssa-strlen.h"
49 1.1 mrg #include "calls.h"
50 1.1 mrg #include "cfganal.h"
51 1.1 mrg #include "intl.h"
52 1.1 mrg #include "gimple-range.h"
53 1.1 mrg #include "stringpool.h"
54 1.1 mrg #include "attribs.h"
55 1.1 mrg #include "demangle.h"
56 1.1 mrg #include "attr-fnspec.h"
57 1.1 mrg #include "pointer-query.h"
58 1.1 mrg
59 1.1 mrg /* Return true if tree node X has an associated location. */
60 1.1 mrg
61 1.1 mrg static inline location_t
62 1.1 mrg has_location (const_tree x)
63 1.1 mrg {
64 1.1 mrg if (DECL_P (x))
65 1.1 mrg return DECL_SOURCE_LOCATION (x) != UNKNOWN_LOCATION;
66 1.1 mrg
67 1.1 mrg if (EXPR_P (x))
68 1.1 mrg return EXPR_HAS_LOCATION (x);
69 1.1 mrg
70 1.1 mrg return false;
71 1.1 mrg }
72 1.1 mrg
73 1.1 mrg /* Return the associated location of STMT. */
74 1.1 mrg
75 1.1 mrg static inline location_t
76 1.1 mrg get_location (const gimple *stmt)
77 1.1 mrg {
78 1.1 mrg return gimple_location (stmt);
79 1.1 mrg }
80 1.1 mrg
81 1.1 mrg /* Return the associated location of tree node X. */
82 1.1 mrg
83 1.1 mrg static inline location_t
84 1.1 mrg get_location (tree x)
85 1.1 mrg {
86 1.1 mrg if (DECL_P (x))
87 1.1 mrg return DECL_SOURCE_LOCATION (x);
88 1.1 mrg
89 1.1 mrg if (EXPR_P (x))
90 1.1 mrg return EXPR_LOCATION (x);
91 1.1 mrg
92 1.1 mrg return UNKNOWN_LOCATION;
93 1.1 mrg }
94 1.1 mrg
95 1.1 mrg /* Overload of the nascent tree function for GIMPLE STMT. */
96 1.1 mrg
97 1.1 mrg static inline tree
98 1.1 mrg get_callee_fndecl (const gimple *stmt)
99 1.1 mrg {
100 1.1 mrg return gimple_call_fndecl (stmt);
101 1.1 mrg }
102 1.1 mrg
103 1.1 mrg static inline unsigned
104 1.1 mrg call_nargs (const gimple *stmt)
105 1.1 mrg {
106 1.1 mrg return gimple_call_num_args (stmt);
107 1.1 mrg }
108 1.1 mrg
109 1.1 mrg static inline unsigned
110 1.1 mrg call_nargs (const_tree expr)
111 1.1 mrg {
112 1.1 mrg return call_expr_nargs (expr);
113 1.1 mrg }
114 1.1 mrg
115 1.1 mrg
116 1.1 mrg static inline tree
117 1.1 mrg call_arg (const gimple *stmt, unsigned argno)
118 1.1 mrg {
119 1.1 mrg return gimple_call_arg (stmt, argno);
120 1.1 mrg }
121 1.1 mrg
122 1.1 mrg static inline tree
123 1.1 mrg call_arg (tree expr, unsigned argno)
124 1.1 mrg {
125 1.1 mrg return CALL_EXPR_ARG (expr, argno);
126 1.1 mrg }
127 1.1 mrg
128 1.1 mrg /* For a call EXPR at LOC to a function FNAME that expects a string
129 1.1 mrg in the argument ARG, issue a diagnostic due to it being a called
130 1.1 mrg with an argument that is a character array with no terminating
131 1.1 mrg NUL. SIZE is the EXACT size of the array, and BNDRNG the number
132 1.1 mrg of characters in which the NUL is expected. Either EXPR or FNAME
133 1.1 mrg may be null but noth both. SIZE may be null when BNDRNG is null. */
134 1.1 mrg
135 1.1 mrg template <class GimpleOrTree>
136 1.1 mrg static void
137 1.1 mrg warn_string_no_nul (location_t loc, GimpleOrTree expr, const char *fname,
138 1.1 mrg tree arg, tree decl, tree size, bool exact,
139 1.1 mrg const wide_int bndrng[2] /* = NULL */)
140 1.1 mrg {
141 1.1 mrg const opt_code opt = OPT_Wstringop_overread;
142 1.1 mrg if ((expr && warning_suppressed_p (expr, opt))
143 1.1 mrg || warning_suppressed_p (arg, opt))
144 1.1 mrg return;
145 1.1 mrg
146 1.1 mrg loc = expansion_point_location_if_in_system_header (loc);
147 1.1 mrg bool warned;
148 1.1 mrg
149 1.1 mrg /* Format the bound range as a string to keep the number of messages
150 1.1 mrg from exploding. */
151 1.1 mrg char bndstr[80];
152 1.1 mrg *bndstr = 0;
153 1.1 mrg if (bndrng)
154 1.1 mrg {
155 1.1 mrg if (bndrng[0] == bndrng[1])
156 1.1 mrg sprintf (bndstr, "%llu", (unsigned long long) bndrng[0].to_uhwi ());
157 1.1 mrg else
158 1.1 mrg sprintf (bndstr, "[%llu, %llu]",
159 1.1 mrg (unsigned long long) bndrng[0].to_uhwi (),
160 1.1 mrg (unsigned long long) bndrng[1].to_uhwi ());
161 1.1 mrg }
162 1.1 mrg
163 1.1 mrg const tree maxobjsize = max_object_size ();
164 1.1 mrg const wide_int maxsiz = wi::to_wide (maxobjsize);
165 1.1 mrg if (expr)
166 1.1 mrg {
167 1.1 mrg tree func = get_callee_fndecl (expr);
168 1.1 mrg if (bndrng)
169 1.1 mrg {
170 1.1 mrg if (wi::ltu_p (maxsiz, bndrng[0]))
171 1.1 mrg warned = warning_at (loc, opt,
172 1.1 mrg "%qD specified bound %s exceeds "
173 1.1 mrg "maximum object size %E",
174 1.1 mrg func, bndstr, maxobjsize);
175 1.1 mrg else
176 1.1 mrg {
177 1.1 mrg bool maybe = wi::to_wide (size) == bndrng[0];
178 1.1 mrg warned = warning_at (loc, opt,
179 1.1 mrg exact
180 1.1 mrg ? G_("%qD specified bound %s exceeds "
181 1.1 mrg "the size %E of unterminated array")
182 1.1 mrg : (maybe
183 1.1 mrg ? G_("%qD specified bound %s may "
184 1.1 mrg "exceed the size of at most %E "
185 1.1 mrg "of unterminated array")
186 1.1 mrg : G_("%qD specified bound %s exceeds "
187 1.1 mrg "the size of at most %E "
188 1.1 mrg "of unterminated array")),
189 1.1 mrg func, bndstr, size);
190 1.1 mrg }
191 1.1 mrg }
192 1.1 mrg else
193 1.1 mrg warned = warning_at (loc, opt,
194 1.1 mrg "%qD argument missing terminating nul",
195 1.1 mrg func);
196 1.1 mrg }
197 1.1 mrg else
198 1.1 mrg {
199 1.1 mrg if (bndrng)
200 1.1 mrg {
201 1.1 mrg if (wi::ltu_p (maxsiz, bndrng[0]))
202 1.1 mrg warned = warning_at (loc, opt,
203 1.1 mrg "%qs specified bound %s exceeds "
204 1.1 mrg "maximum object size %E",
205 1.1 mrg fname, bndstr, maxobjsize);
206 1.1 mrg else
207 1.1 mrg {
208 1.1 mrg bool maybe = wi::to_wide (size) == bndrng[0];
209 1.1 mrg warned = warning_at (loc, opt,
210 1.1 mrg exact
211 1.1 mrg ? G_("%qs specified bound %s exceeds "
212 1.1 mrg "the size %E of unterminated array")
213 1.1 mrg : (maybe
214 1.1 mrg ? G_("%qs specified bound %s may "
215 1.1 mrg "exceed the size of at most %E "
216 1.1 mrg "of unterminated array")
217 1.1 mrg : G_("%qs specified bound %s exceeds "
218 1.1 mrg "the size of at most %E "
219 1.1 mrg "of unterminated array")),
220 1.1 mrg fname, bndstr, size);
221 1.1 mrg }
222 1.1 mrg }
223 1.1 mrg else
224 1.1 mrg warned = warning_at (loc, opt,
225 1.1 mrg "%qs argument missing terminating nul",
226 1.1 mrg fname);
227 1.1 mrg }
228 1.1 mrg
229 1.1 mrg if (warned)
230 1.1 mrg {
231 1.1 mrg inform (get_location (decl),
232 1.1 mrg "referenced argument declared here");
233 1.1 mrg suppress_warning (arg, opt);
234 1.1 mrg if (expr)
235 1.1 mrg suppress_warning (expr, opt);
236 1.1 mrg }
237 1.1 mrg }
238 1.1 mrg
239 1.1 mrg void
240 1.1 mrg warn_string_no_nul (location_t loc, gimple *stmt, const char *fname,
241 1.1 mrg tree arg, tree decl, tree size /* = NULL_TREE */,
242 1.1 mrg bool exact /* = false */,
243 1.1 mrg const wide_int bndrng[2] /* = NULL */)
244 1.1 mrg {
245 1.1 mrg return warn_string_no_nul<gimple *> (loc, stmt, fname,
246 1.1 mrg arg, decl, size, exact, bndrng);
247 1.1 mrg }
248 1.1 mrg
249 1.1 mrg void
250 1.1 mrg warn_string_no_nul (location_t loc, tree expr, const char *fname,
251 1.1 mrg tree arg, tree decl, tree size /* = NULL_TREE */,
252 1.1 mrg bool exact /* = false */,
253 1.1 mrg const wide_int bndrng[2] /* = NULL */)
254 1.1 mrg {
255 1.1 mrg return warn_string_no_nul<tree> (loc, expr, fname,
256 1.1 mrg arg, decl, size, exact, bndrng);
257 1.1 mrg }
258 1.1 mrg
259 1.1 mrg /* If EXP refers to an unterminated constant character array return
260 1.1 mrg the declaration of the object of which the array is a member or
261 1.1 mrg element and if SIZE is not null, set *SIZE to the size of
262 1.1 mrg the unterminated array and set *EXACT if the size is exact or
263 1.1 mrg clear it otherwise. Otherwise return null. */
264 1.1 mrg
265 1.1 mrg tree
266 1.1 mrg unterminated_array (tree exp, tree *size /* = NULL */, bool *exact /* = NULL */)
267 1.1 mrg {
268 1.1 mrg /* C_STRLEN will return NULL and set DECL in the info
269 1.1 mrg structure if EXP references a unterminated array. */
270 1.1 mrg c_strlen_data lendata = { };
271 1.1 mrg tree len = c_strlen (exp, 1, &lendata);
272 1.1 mrg if (len || !lendata.minlen || !lendata.decl)
273 1.1 mrg return NULL_TREE;
274 1.1 mrg
275 1.1 mrg if (!size)
276 1.1 mrg return lendata.decl;
277 1.1 mrg
278 1.1 mrg len = lendata.minlen;
279 1.1 mrg if (lendata.off)
280 1.1 mrg {
281 1.1 mrg /* Constant offsets are already accounted for in LENDATA.MINLEN,
282 1.1 mrg but not in a SSA_NAME + CST expression. */
283 1.1 mrg if (TREE_CODE (lendata.off) == INTEGER_CST)
284 1.1 mrg *exact = true;
285 1.1 mrg else if (TREE_CODE (lendata.off) == PLUS_EXPR
286 1.1 mrg && TREE_CODE (TREE_OPERAND (lendata.off, 1)) == INTEGER_CST)
287 1.1 mrg {
288 1.1 mrg /* Subtract the offset from the size of the array. */
289 1.1 mrg *exact = false;
290 1.1 mrg tree temp = TREE_OPERAND (lendata.off, 1);
291 1.1 mrg temp = fold_convert (ssizetype, temp);
292 1.1 mrg len = fold_build2 (MINUS_EXPR, ssizetype, len, temp);
293 1.1 mrg }
294 1.1 mrg else
295 1.1 mrg *exact = false;
296 1.1 mrg }
297 1.1 mrg else
298 1.1 mrg *exact = true;
299 1.1 mrg
300 1.1 mrg *size = len;
301 1.1 mrg return lendata.decl;
302 1.1 mrg }
303 1.1 mrg
304 1.1 mrg /* For a call EXPR (which may be null) that expects a string argument
305 1.1 mrg SRC as an argument, returns false if SRC is a character array with
306 1.1 mrg no terminating NUL. When nonnull, BOUND is the number of characters
307 1.1 mrg in which to expect the terminating NUL. When EXPR is nonnull also
308 1.1 mrg issues a warning. */
309 1.1 mrg
310 1.1 mrg template <class GimpleOrTree>
311 1.1 mrg static bool
312 1.1 mrg check_nul_terminated_array (GimpleOrTree expr, tree src, tree bound)
313 1.1 mrg {
314 1.1 mrg /* The constant size of the array SRC points to. The actual size
315 1.1 mrg may be less of EXACT is true, but not more. */
316 1.1 mrg tree size;
317 1.1 mrg /* True if SRC involves a non-constant offset into the array. */
318 1.1 mrg bool exact;
319 1.1 mrg /* The unterminated constant array SRC points to. */
320 1.1 mrg tree nonstr = unterminated_array (src, &size, &exact);
321 1.1 mrg if (!nonstr)
322 1.1 mrg return true;
323 1.1 mrg
324 1.1 mrg /* NONSTR refers to the non-nul terminated constant array and SIZE
325 1.1 mrg is the constant size of the array in bytes. EXACT is true when
326 1.1 mrg SIZE is exact. */
327 1.1 mrg
328 1.1 mrg wide_int bndrng[2];
329 1.1 mrg if (bound)
330 1.1 mrg {
331 1.1 mrg value_range r;
332 1.1 mrg
333 1.1 mrg get_global_range_query ()->range_of_expr (r, bound);
334 1.1 mrg
335 1.1 mrg if (r.kind () != VR_RANGE)
336 1.1 mrg return true;
337 1.1 mrg
338 1.1 mrg bndrng[0] = r.lower_bound ();
339 1.1 mrg bndrng[1] = r.upper_bound ();
340 1.1 mrg
341 1.1 mrg if (exact)
342 1.1 mrg {
343 1.1 mrg if (wi::leu_p (bndrng[0], wi::to_wide (size)))
344 1.1 mrg return true;
345 1.1 mrg }
346 1.1 mrg else if (wi::lt_p (bndrng[0], wi::to_wide (size), UNSIGNED))
347 1.1 mrg return true;
348 1.1 mrg }
349 1.1 mrg
350 1.1 mrg if (expr)
351 1.1 mrg warn_string_no_nul (get_location (expr), expr, NULL, src, nonstr,
352 1.1 mrg size, exact, bound ? bndrng : NULL);
353 1.1 mrg
354 1.1 mrg return false;
355 1.1 mrg }
356 1.1 mrg
357 1.1 mrg bool
358 1.1 mrg check_nul_terminated_array (gimple *stmt, tree src, tree bound /* = NULL_TREE */)
359 1.1 mrg {
360 1.1 mrg return check_nul_terminated_array<gimple *>(stmt, src, bound);
361 1.1 mrg }
362 1.1 mrg
363 1.1 mrg bool
364 1.1 mrg check_nul_terminated_array (tree expr, tree src, tree bound /* = NULL_TREE */)
365 1.1 mrg {
366 1.1 mrg return check_nul_terminated_array<tree>(expr, src, bound);
367 1.1 mrg }
368 1.1 mrg
369 1.1 mrg /* Warn about passing a non-string array/pointer to a built-in function
370 1.1 mrg that expects a nul-terminated string argument. Returns true if
371 1.1 mrg a warning has been issued.*/
372 1.1 mrg
373 1.1 mrg template <class GimpleOrTree>
374 1.1 mrg static bool
375 1.1 mrg maybe_warn_nonstring_arg (tree fndecl, GimpleOrTree exp)
376 1.1 mrg {
377 1.1 mrg if (!fndecl || !fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
378 1.1 mrg return false;
379 1.1 mrg
380 1.1 mrg if (!warn_stringop_overread
381 1.1 mrg || warning_suppressed_p (exp, OPT_Wstringop_overread))
382 1.1 mrg return false;
383 1.1 mrg
384 1.1 mrg /* Avoid clearly invalid calls (more checking done below). */
385 1.1 mrg unsigned nargs = call_nargs (exp);
386 1.1 mrg if (!nargs)
387 1.1 mrg return false;
388 1.1 mrg
389 1.1 mrg /* The bound argument to a bounded string function like strncpy. */
390 1.1 mrg tree bound = NULL_TREE;
391 1.1 mrg
392 1.1 mrg /* The longest known or possible string argument to one of the comparison
393 1.1 mrg functions. If the length is less than the bound it is used instead.
394 1.1 mrg Since the length is only used for warning and not for code generation
395 1.1 mrg disable strict mode in the calls to get_range_strlen below. */
396 1.1 mrg tree maxlen = NULL_TREE;
397 1.1 mrg
398 1.1 mrg /* It's safe to call "bounded" string functions with a non-string
399 1.1 mrg argument since the functions provide an explicit bound for this
400 1.1 mrg purpose. The exception is strncat where the bound may refer to
401 1.1 mrg either the destination or the source. */
402 1.1 mrg int fncode = DECL_FUNCTION_CODE (fndecl);
403 1.1 mrg switch (fncode)
404 1.1 mrg {
405 1.1 mrg case BUILT_IN_STRCMP:
406 1.1 mrg case BUILT_IN_STRNCMP:
407 1.1 mrg case BUILT_IN_STRNCASECMP:
408 1.1 mrg {
409 1.1 mrg /* For these, if one argument refers to one or more of a set
410 1.1 mrg of string constants or arrays of known size, determine
411 1.1 mrg the range of their known or possible lengths and use it
412 1.1 mrg conservatively as the bound for the unbounded function,
413 1.1 mrg and to adjust the range of the bound of the bounded ones. */
414 1.1 mrg for (unsigned argno = 0;
415 1.1 mrg argno < MIN (nargs, 2)
416 1.1 mrg && !(maxlen && TREE_CODE (maxlen) == INTEGER_CST); argno++)
417 1.1 mrg {
418 1.1 mrg tree arg = call_arg (exp, argno);
419 1.1 mrg if (!get_attr_nonstring_decl (arg))
420 1.1 mrg {
421 1.1 mrg c_strlen_data lendata = { };
422 1.1 mrg /* Set MAXBOUND to an arbitrary non-null non-integer
423 1.1 mrg node as a request to have it set to the length of
424 1.1 mrg the longest string in a PHI. */
425 1.1 mrg lendata.maxbound = arg;
426 1.1 mrg get_range_strlen (arg, &lendata, /* eltsize = */ 1);
427 1.1 mrg maxlen = lendata.maxbound;
428 1.1 mrg }
429 1.1 mrg }
430 1.1 mrg }
431 1.1 mrg /* Fall through. */
432 1.1 mrg
433 1.1 mrg case BUILT_IN_STRNCAT:
434 1.1 mrg case BUILT_IN_STPNCPY:
435 1.1 mrg case BUILT_IN_STRNCPY:
436 1.1 mrg if (nargs > 2)
437 1.1 mrg bound = call_arg (exp, 2);
438 1.1 mrg break;
439 1.1 mrg
440 1.1 mrg case BUILT_IN_STRNDUP:
441 1.1 mrg if (nargs < 2)
442 1.1 mrg return false;
443 1.1 mrg bound = call_arg (exp, 1);
444 1.1 mrg break;
445 1.1 mrg
446 1.1 mrg case BUILT_IN_STRNLEN:
447 1.1 mrg {
448 1.1 mrg tree arg = call_arg (exp, 0);
449 1.1 mrg if (!get_attr_nonstring_decl (arg))
450 1.1 mrg {
451 1.1 mrg c_strlen_data lendata = { };
452 1.1 mrg /* Set MAXBOUND to an arbitrary non-null non-integer
453 1.1 mrg node as a request to have it set to the length of
454 1.1 mrg the longest string in a PHI. */
455 1.1 mrg lendata.maxbound = arg;
456 1.1 mrg get_range_strlen (arg, &lendata, /* eltsize = */ 1);
457 1.1 mrg maxlen = lendata.maxbound;
458 1.1 mrg }
459 1.1 mrg if (nargs > 1)
460 1.1 mrg bound = call_arg (exp, 1);
461 1.1 mrg break;
462 1.1 mrg }
463 1.1 mrg
464 1.1 mrg default:
465 1.1 mrg break;
466 1.1 mrg }
467 1.1 mrg
468 1.1 mrg /* Determine the range of the bound argument (if specified). */
469 1.1 mrg tree bndrng[2] = { NULL_TREE, NULL_TREE };
470 1.1 mrg if (bound)
471 1.1 mrg {
472 1.1 mrg STRIP_NOPS (bound);
473 1.1 mrg get_size_range (bound, bndrng);
474 1.1 mrg }
475 1.1 mrg
476 1.1 mrg location_t loc = get_location (exp);
477 1.1 mrg
478 1.1 mrg if (bndrng[0])
479 1.1 mrg {
480 1.1 mrg /* Diagnose excessive bound prior to the adjustment below and
481 1.1 mrg regardless of attribute nonstring. */
482 1.1 mrg tree maxobjsize = max_object_size ();
483 1.1 mrg if (tree_int_cst_lt (maxobjsize, bndrng[0]))
484 1.1 mrg {
485 1.1 mrg bool warned = false;
486 1.1 mrg if (tree_int_cst_equal (bndrng[0], bndrng[1]))
487 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
488 1.1 mrg "%qD specified bound %E "
489 1.1 mrg "exceeds maximum object size %E",
490 1.1 mrg fndecl, bndrng[0], maxobjsize);
491 1.1 mrg else
492 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
493 1.1 mrg "%qD specified bound [%E, %E] "
494 1.1 mrg "exceeds maximum object size %E",
495 1.1 mrg fndecl, bndrng[0], bndrng[1],
496 1.1 mrg maxobjsize);
497 1.1 mrg if (warned)
498 1.1 mrg suppress_warning (exp, OPT_Wstringop_overread);
499 1.1 mrg
500 1.1 mrg return warned;
501 1.1 mrg }
502 1.1 mrg }
503 1.1 mrg
504 1.1 mrg if (maxlen && !integer_all_onesp (maxlen))
505 1.1 mrg {
506 1.1 mrg /* Add one for the nul. */
507 1.1 mrg maxlen = const_binop (PLUS_EXPR, TREE_TYPE (maxlen), maxlen,
508 1.1 mrg size_one_node);
509 1.1 mrg
510 1.1 mrg if (!bndrng[0])
511 1.1 mrg {
512 1.1 mrg /* Conservatively use the upper bound of the lengths for
513 1.1 mrg both the lower and the upper bound of the operation. */
514 1.1 mrg bndrng[0] = maxlen;
515 1.1 mrg bndrng[1] = maxlen;
516 1.1 mrg bound = void_type_node;
517 1.1 mrg }
518 1.1 mrg else if (maxlen)
519 1.1 mrg {
520 1.1 mrg /* Replace the bound on the operation with the upper bound
521 1.1 mrg of the length of the string if the latter is smaller. */
522 1.1 mrg if (tree_int_cst_lt (maxlen, bndrng[0]))
523 1.1 mrg bndrng[0] = maxlen;
524 1.1 mrg else if (tree_int_cst_lt (maxlen, bndrng[1]))
525 1.1 mrg bndrng[1] = maxlen;
526 1.1 mrg }
527 1.1 mrg }
528 1.1 mrg
529 1.1 mrg bool any_arg_warned = false;
530 1.1 mrg /* Iterate over the built-in function's formal arguments and check
531 1.1 mrg each const char* against the actual argument. If the actual
532 1.1 mrg argument is declared attribute non-string issue a warning unless
533 1.1 mrg the argument's maximum length is bounded. */
534 1.1 mrg function_args_iterator it;
535 1.1 mrg function_args_iter_init (&it, TREE_TYPE (fndecl));
536 1.1 mrg
537 1.1 mrg for (unsigned argno = 0; ; ++argno, function_args_iter_next (&it))
538 1.1 mrg {
539 1.1 mrg /* Avoid iterating past the declared argument in a call
540 1.1 mrg to function declared without a prototype. */
541 1.1 mrg if (argno >= nargs)
542 1.1 mrg break;
543 1.1 mrg
544 1.1 mrg tree argtype = function_args_iter_cond (&it);
545 1.1 mrg if (!argtype)
546 1.1 mrg break;
547 1.1 mrg
548 1.1 mrg if (TREE_CODE (argtype) != POINTER_TYPE)
549 1.1 mrg continue;
550 1.1 mrg
551 1.1 mrg argtype = TREE_TYPE (argtype);
552 1.1 mrg
553 1.1 mrg if (TREE_CODE (argtype) != INTEGER_TYPE
554 1.1 mrg || !TYPE_READONLY (argtype))
555 1.1 mrg continue;
556 1.1 mrg
557 1.1 mrg argtype = TYPE_MAIN_VARIANT (argtype);
558 1.1 mrg if (argtype != char_type_node)
559 1.1 mrg continue;
560 1.1 mrg
561 1.1 mrg tree callarg = call_arg (exp, argno);
562 1.1 mrg if (TREE_CODE (callarg) == ADDR_EXPR)
563 1.1 mrg callarg = TREE_OPERAND (callarg, 0);
564 1.1 mrg
565 1.1 mrg /* See if the destination is declared with attribute "nonstring". */
566 1.1 mrg tree decl = get_attr_nonstring_decl (callarg);
567 1.1 mrg if (!decl)
568 1.1 mrg continue;
569 1.1 mrg
570 1.1 mrg /* The maximum number of array elements accessed. */
571 1.1 mrg offset_int wibnd = 0;
572 1.1 mrg
573 1.1 mrg if (argno && fncode == BUILT_IN_STRNCAT)
574 1.1 mrg {
575 1.1 mrg /* See if the bound in strncat is derived from the length
576 1.1 mrg of the strlen of the destination (as it's expected to be).
577 1.1 mrg If so, reset BOUND and FNCODE to trigger a warning. */
578 1.1 mrg tree dstarg = call_arg (exp, 0);
579 1.1 mrg if (is_strlen_related_p (dstarg, bound))
580 1.1 mrg {
581 1.1 mrg /* The bound applies to the destination, not to the source,
582 1.1 mrg so reset these to trigger a warning without mentioning
583 1.1 mrg the bound. */
584 1.1 mrg bound = NULL;
585 1.1 mrg fncode = 0;
586 1.1 mrg }
587 1.1 mrg else if (bndrng[1])
588 1.1 mrg /* Use the upper bound of the range for strncat. */
589 1.1 mrg wibnd = wi::to_offset (bndrng[1]);
590 1.1 mrg }
591 1.1 mrg else if (bndrng[0])
592 1.1 mrg /* Use the lower bound of the range for functions other than
593 1.1 mrg strncat. */
594 1.1 mrg wibnd = wi::to_offset (bndrng[0]);
595 1.1 mrg
596 1.1 mrg /* Determine the size of the argument array if it is one. */
597 1.1 mrg offset_int asize = wibnd;
598 1.1 mrg bool known_size = false;
599 1.1 mrg tree type = TREE_TYPE (decl);
600 1.1 mrg
601 1.1 mrg /* Determine the array size. For arrays of unknown bound and
602 1.1 mrg pointers reset BOUND to trigger the appropriate warning. */
603 1.1 mrg if (TREE_CODE (type) == ARRAY_TYPE)
604 1.1 mrg {
605 1.1 mrg if (tree arrbnd = TYPE_DOMAIN (type))
606 1.1 mrg {
607 1.1 mrg if ((arrbnd = TYPE_MAX_VALUE (arrbnd))
608 1.1 mrg && TREE_CODE (arrbnd) == INTEGER_CST)
609 1.1 mrg {
610 1.1 mrg asize = wi::to_offset (arrbnd) + 1;
611 1.1 mrg known_size = true;
612 1.1 mrg }
613 1.1 mrg }
614 1.1 mrg else if (bound == void_type_node)
615 1.1 mrg bound = NULL_TREE;
616 1.1 mrg }
617 1.1 mrg else if (bound == void_type_node)
618 1.1 mrg bound = NULL_TREE;
619 1.1 mrg
620 1.1 mrg /* In a call to strncat with a bound in a range whose lower but
621 1.1 mrg not upper bound is less than the array size, reset ASIZE to
622 1.1 mrg be the same as the bound and the other variable to trigger
623 1.1 mrg the appropriate warning below. */
624 1.1 mrg if (fncode == BUILT_IN_STRNCAT
625 1.1 mrg && bndrng[0] != bndrng[1]
626 1.1 mrg && wi::ltu_p (wi::to_offset (bndrng[0]), asize)
627 1.1 mrg && (!known_size
628 1.1 mrg || wi::ltu_p (asize, wibnd)))
629 1.1 mrg {
630 1.1 mrg asize = wibnd;
631 1.1 mrg bound = NULL_TREE;
632 1.1 mrg fncode = 0;
633 1.1 mrg }
634 1.1 mrg
635 1.1 mrg bool warned = false;
636 1.1 mrg
637 1.1 mrg auto_diagnostic_group d;
638 1.1 mrg if (wi::ltu_p (asize, wibnd))
639 1.1 mrg {
640 1.1 mrg if (bndrng[0] == bndrng[1])
641 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
642 1.1 mrg "%qD argument %i declared attribute "
643 1.1 mrg "%<nonstring%> is smaller than the specified "
644 1.1 mrg "bound %wu",
645 1.1 mrg fndecl, argno + 1, wibnd.to_uhwi ());
646 1.1 mrg else if (wi::ltu_p (asize, wi::to_offset (bndrng[0])))
647 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
648 1.1 mrg "%qD argument %i declared attribute "
649 1.1 mrg "%<nonstring%> is smaller than "
650 1.1 mrg "the specified bound [%E, %E]",
651 1.1 mrg fndecl, argno + 1, bndrng[0], bndrng[1]);
652 1.1 mrg else
653 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
654 1.1 mrg "%qD argument %i declared attribute "
655 1.1 mrg "%<nonstring%> may be smaller than "
656 1.1 mrg "the specified bound [%E, %E]",
657 1.1 mrg fndecl, argno + 1, bndrng[0], bndrng[1]);
658 1.1 mrg }
659 1.1 mrg else if (fncode == BUILT_IN_STRNCAT)
660 1.1 mrg ; /* Avoid warning for calls to strncat() when the bound
661 1.1 mrg is equal to the size of the non-string argument. */
662 1.1 mrg else if (!bound)
663 1.1 mrg warned = warning_at (loc, OPT_Wstringop_overread,
664 1.1 mrg "%qD argument %i declared attribute %<nonstring%>",
665 1.1 mrg fndecl, argno + 1);
666 1.1 mrg
667 1.1 mrg if (warned)
668 1.1 mrg {
669 1.1 mrg inform (DECL_SOURCE_LOCATION (decl),
670 1.1 mrg "argument %qD declared here", decl);
671 1.1 mrg any_arg_warned = true;
672 1.1 mrg }
673 1.1 mrg }
674 1.1 mrg
675 1.1 mrg if (any_arg_warned)
676 1.1 mrg suppress_warning (exp, OPT_Wstringop_overread);
677 1.1 mrg
678 1.1 mrg return any_arg_warned;
679 1.1 mrg }
680 1.1 mrg
681 1.1 mrg bool
682 1.1 mrg maybe_warn_nonstring_arg (tree fndecl, gimple *stmt)
683 1.1 mrg {
684 1.1 mrg return maybe_warn_nonstring_arg<gimple *>(fndecl, stmt);
685 1.1 mrg }
686 1.1 mrg
687 1.1 mrg
688 1.1 mrg bool
689 1.1 mrg maybe_warn_nonstring_arg (tree fndecl, tree expr)
690 1.1 mrg {
691 1.1 mrg return maybe_warn_nonstring_arg<tree>(fndecl, expr);
692 1.1 mrg }
693 1.1 mrg
694 1.1 mrg /* Issue a warning OPT for a bounded call EXP with a bound in RANGE
695 1.1 mrg accessing an object with SIZE. */
696 1.1 mrg
697 1.1 mrg template <class GimpleOrTree>
698 1.1 mrg static bool
699 1.1 mrg maybe_warn_for_bound (opt_code opt, location_t loc, GimpleOrTree exp, tree func,
700 1.1 mrg tree bndrng[2], tree size, const access_data *pad)
701 1.1 mrg {
702 1.1 mrg if (!bndrng[0] || warning_suppressed_p (exp, opt))
703 1.1 mrg return false;
704 1.1 mrg
705 1.1 mrg tree maxobjsize = max_object_size ();
706 1.1 mrg
707 1.1 mrg bool warned = false;
708 1.1 mrg
709 1.1 mrg if (opt == OPT_Wstringop_overread)
710 1.1 mrg {
711 1.1 mrg bool maybe = pad && pad->src.phi ();
712 1.1 mrg if (maybe)
713 1.1 mrg {
714 1.1 mrg /* Issue a "maybe" warning only if the PHI refers to objects
715 1.1 mrg at least one of which has more space remaining than the bound.
716 1.1 mrg Otherwise, if the bound is greater, use the definitive form. */
717 1.1 mrg offset_int remmax = pad->src.size_remaining ();
718 1.1 mrg if (remmax < wi::to_offset (bndrng[0]))
719 1.1 mrg maybe = false;
720 1.1 mrg }
721 1.1 mrg
722 1.1 mrg if (tree_int_cst_lt (maxobjsize, bndrng[0]))
723 1.1 mrg {
724 1.1 mrg if (bndrng[0] == bndrng[1])
725 1.1 mrg warned = (func
726 1.1 mrg ? warning_at (loc, opt,
727 1.1 mrg (maybe
728 1.1 mrg ? G_("%qD specified bound %E may "
729 1.1 mrg "exceed maximum object size %E")
730 1.1 mrg : G_("%qD specified bound %E "
731 1.1 mrg "exceeds maximum object size %E")),
732 1.1 mrg func, bndrng[0], maxobjsize)
733 1.1 mrg : warning_at (loc, opt,
734 1.1 mrg (maybe
735 1.1 mrg ? G_("specified bound %E may "
736 1.1 mrg "exceed maximum object size %E")
737 1.1 mrg : G_("specified bound %E "
738 1.1 mrg "exceeds maximum object size %E")),
739 1.1 mrg bndrng[0], maxobjsize));
740 1.1 mrg else
741 1.1 mrg warned = (func
742 1.1 mrg ? warning_at (loc, opt,
743 1.1 mrg (maybe
744 1.1 mrg ? G_("%qD specified bound [%E, %E] may "
745 1.1 mrg "exceed maximum object size %E")
746 1.1 mrg : G_("%qD specified bound [%E, %E] "
747 1.1 mrg "exceeds maximum object size %E")),
748 1.1 mrg func,
749 1.1 mrg bndrng[0], bndrng[1], maxobjsize)
750 1.1 mrg : warning_at (loc, opt,
751 1.1 mrg (maybe
752 1.1 mrg ? G_("specified bound [%E, %E] may "
753 1.1 mrg "exceed maximum object size %E")
754 1.1 mrg : G_("specified bound [%E, %E] "
755 1.1 mrg "exceeds maximum object size %E")),
756 1.1 mrg bndrng[0], bndrng[1], maxobjsize));
757 1.1 mrg }
758 1.1 mrg else if (!size || tree_int_cst_le (bndrng[0], size))
759 1.1 mrg return false;
760 1.1 mrg else if (tree_int_cst_equal (bndrng[0], bndrng[1]))
761 1.1 mrg warned = (func
762 1.1 mrg ? warning_at (loc, opt,
763 1.1 mrg (maybe
764 1.1 mrg ? G_("%qD specified bound %E may exceed "
765 1.1 mrg "source size %E")
766 1.1 mrg : G_("%qD specified bound %E exceeds "
767 1.1 mrg "source size %E")),
768 1.1 mrg func, bndrng[0], size)
769 1.1 mrg : warning_at (loc, opt,
770 1.1 mrg (maybe
771 1.1 mrg ? G_("specified bound %E may exceed "
772 1.1 mrg "source size %E")
773 1.1 mrg : G_("specified bound %E exceeds "
774 1.1 mrg "source size %E")),
775 1.1 mrg bndrng[0], size));
776 1.1 mrg else
777 1.1 mrg warned = (func
778 1.1 mrg ? warning_at (loc, opt,
779 1.1 mrg (maybe
780 1.1 mrg ? G_("%qD specified bound [%E, %E] may "
781 1.1 mrg "exceed source size %E")
782 1.1 mrg : G_("%qD specified bound [%E, %E] exceeds "
783 1.1 mrg "source size %E")),
784 1.1 mrg func, bndrng[0], bndrng[1], size)
785 1.1 mrg : warning_at (loc, opt,
786 1.1 mrg (maybe
787 1.1 mrg ? G_("specified bound [%E, %E] may exceed "
788 1.1 mrg "source size %E")
789 1.1 mrg : G_("specified bound [%E, %E] exceeds "
790 1.1 mrg "source size %E")),
791 1.1 mrg bndrng[0], bndrng[1], size));
792 1.1 mrg if (warned)
793 1.1 mrg {
794 1.1 mrg if (pad && pad->src.ref
795 1.1 mrg && has_location (pad->src.ref))
796 1.1 mrg inform (get_location (pad->src.ref),
797 1.1 mrg "source object allocated here");
798 1.1 mrg suppress_warning (exp, opt);
799 1.1 mrg }
800 1.1 mrg
801 1.1 mrg return warned;
802 1.1 mrg }
803 1.1 mrg
804 1.1 mrg bool maybe = pad && pad->dst.phi ();
805 1.1 mrg if (maybe)
806 1.1 mrg {
807 1.1 mrg /* Issue a "maybe" warning only if the PHI refers to objects
808 1.1 mrg at least one of which has more space remaining than the bound.
809 1.1 mrg Otherwise, if the bound is greater, use the definitive form. */
810 1.1 mrg offset_int remmax = pad->dst.size_remaining ();
811 1.1 mrg if (remmax < wi::to_offset (bndrng[0]))
812 1.1 mrg maybe = false;
813 1.1 mrg }
814 1.1 mrg if (tree_int_cst_lt (maxobjsize, bndrng[0]))
815 1.1 mrg {
816 1.1 mrg if (bndrng[0] == bndrng[1])
817 1.1 mrg warned = (func
818 1.1 mrg ? warning_at (loc, opt,
819 1.1 mrg (maybe
820 1.1 mrg ? G_("%qD specified size %E may "
821 1.1 mrg "exceed maximum object size %E")
822 1.1 mrg : G_("%qD specified size %E "
823 1.1 mrg "exceeds maximum object size %E")),
824 1.1 mrg func, bndrng[0], maxobjsize)
825 1.1 mrg : warning_at (loc, opt,
826 1.1 mrg (maybe
827 1.1 mrg ? G_("specified size %E may exceed "
828 1.1 mrg "maximum object size %E")
829 1.1 mrg : G_("specified size %E exceeds "
830 1.1 mrg "maximum object size %E")),
831 1.1 mrg bndrng[0], maxobjsize));
832 1.1 mrg else
833 1.1 mrg warned = (func
834 1.1 mrg ? warning_at (loc, opt,
835 1.1 mrg (maybe
836 1.1 mrg ? G_("%qD specified size between %E and %E "
837 1.1 mrg "may exceed maximum object size %E")
838 1.1 mrg : G_("%qD specified size between %E and %E "
839 1.1 mrg "exceeds maximum object size %E")),
840 1.1 mrg func, bndrng[0], bndrng[1], maxobjsize)
841 1.1 mrg : warning_at (loc, opt,
842 1.1 mrg (maybe
843 1.1 mrg ? G_("specified size between %E and %E "
844 1.1 mrg "may exceed maximum object size %E")
845 1.1 mrg : G_("specified size between %E and %E "
846 1.1 mrg "exceeds maximum object size %E")),
847 1.1 mrg bndrng[0], bndrng[1], maxobjsize));
848 1.1 mrg }
849 1.1 mrg else if (!size || tree_int_cst_le (bndrng[0], size))
850 1.1 mrg return false;
851 1.1 mrg else if (tree_int_cst_equal (bndrng[0], bndrng[1]))
852 1.1 mrg warned = (func
853 1.1 mrg ? warning_at (loc, opt,
854 1.1 mrg (maybe
855 1.1 mrg ? G_("%qD specified bound %E may exceed "
856 1.1 mrg "destination size %E")
857 1.1 mrg : G_("%qD specified bound %E exceeds "
858 1.1 mrg "destination size %E")),
859 1.1 mrg func, bndrng[0], size)
860 1.1 mrg : warning_at (loc, opt,
861 1.1 mrg (maybe
862 1.1 mrg ? G_("specified bound %E may exceed "
863 1.1 mrg "destination size %E")
864 1.1 mrg : G_("specified bound %E exceeds "
865 1.1 mrg "destination size %E")),
866 1.1 mrg bndrng[0], size));
867 1.1 mrg else
868 1.1 mrg warned = (func
869 1.1 mrg ? warning_at (loc, opt,
870 1.1 mrg (maybe
871 1.1 mrg ? G_("%qD specified bound [%E, %E] may exceed "
872 1.1 mrg "destination size %E")
873 1.1 mrg : G_("%qD specified bound [%E, %E] exceeds "
874 1.1 mrg "destination size %E")),
875 1.1 mrg func, bndrng[0], bndrng[1], size)
876 1.1 mrg : warning_at (loc, opt,
877 1.1 mrg (maybe
878 1.1 mrg ? G_("specified bound [%E, %E] exceeds "
879 1.1 mrg "destination size %E")
880 1.1 mrg : G_("specified bound [%E, %E] exceeds "
881 1.1 mrg "destination size %E")),
882 1.1 mrg bndrng[0], bndrng[1], size));
883 1.1 mrg
884 1.1 mrg if (warned)
885 1.1 mrg {
886 1.1 mrg if (pad && pad->dst.ref
887 1.1 mrg && has_location (pad->dst.ref))
888 1.1 mrg inform (get_location (pad->dst.ref),
889 1.1 mrg "destination object allocated here");
890 1.1 mrg suppress_warning (exp, opt);
891 1.1 mrg }
892 1.1 mrg
893 1.1 mrg return warned;
894 1.1 mrg }
895 1.1 mrg
896 1.1 mrg bool
897 1.1 mrg maybe_warn_for_bound (opt_code opt, location_t loc, gimple *stmt, tree func,
898 1.1 mrg tree bndrng[2], tree size,
899 1.1 mrg const access_data *pad /* = NULL */)
900 1.1 mrg {
901 1.1 mrg return maybe_warn_for_bound<gimple *> (opt, loc, stmt, func, bndrng, size,
902 1.1 mrg pad);
903 1.1 mrg }
904 1.1 mrg
905 1.1 mrg bool
906 1.1 mrg maybe_warn_for_bound (opt_code opt, location_t loc, tree expr, tree func,
907 1.1 mrg tree bndrng[2], tree size,
908 1.1 mrg const access_data *pad /* = NULL */)
909 1.1 mrg {
910 1.1 mrg return maybe_warn_for_bound<tree> (opt, loc, expr, func, bndrng, size, pad);
911 1.1 mrg }
912 1.1 mrg
913 1.1 mrg /* For an expression EXP issue an access warning controlled by option OPT
914 1.1 mrg with access to a region SIZE bytes in size in the RANGE of sizes.
915 1.1 mrg WRITE is true for a write access, READ for a read access, neither for
916 1.1 mrg call that may or may not perform an access but for which the range
917 1.1 mrg is expected to valid.
918 1.1 mrg Returns true when a warning has been issued. */
919 1.1 mrg
920 1.1 mrg template <class GimpleOrTree>
921 1.1 mrg static bool
922 1.1 mrg warn_for_access (location_t loc, tree func, GimpleOrTree exp, int opt,
923 1.1 mrg tree range[2], tree size, bool write, bool read, bool maybe)
924 1.1 mrg {
925 1.1 mrg bool warned = false;
926 1.1 mrg
927 1.1 mrg if (write && read)
928 1.1 mrg {
929 1.1 mrg if (tree_int_cst_equal (range[0], range[1]))
930 1.1 mrg warned = (func
931 1.1 mrg ? warning_n (loc, opt, tree_to_uhwi (range[0]),
932 1.1 mrg (maybe
933 1.1 mrg ? G_("%qD may access %E byte in a region "
934 1.1 mrg "of size %E")
935 1.1 mrg : G_("%qD accessing %E byte in a region "
936 1.1 mrg "of size %E")),
937 1.1 mrg (maybe
938 1.1 mrg ? G_ ("%qD may access %E bytes in a region "
939 1.1 mrg "of size %E")
940 1.1 mrg : G_ ("%qD accessing %E bytes in a region "
941 1.1 mrg "of size %E")),
942 1.1 mrg func, range[0], size)
943 1.1 mrg : warning_n (loc, opt, tree_to_uhwi (range[0]),
944 1.1 mrg (maybe
945 1.1 mrg ? G_("may access %E byte in a region "
946 1.1 mrg "of size %E")
947 1.1 mrg : G_("accessing %E byte in a region "
948 1.1 mrg "of size %E")),
949 1.1 mrg (maybe
950 1.1 mrg ? G_("may access %E bytes in a region "
951 1.1 mrg "of size %E")
952 1.1 mrg : G_("accessing %E bytes in a region "
953 1.1 mrg "of size %E")),
954 1.1 mrg range[0], size));
955 1.1 mrg else if (tree_int_cst_sign_bit (range[1]))
956 1.1 mrg {
957 1.1 mrg /* Avoid printing the upper bound if it's invalid. */
958 1.1 mrg warned = (func
959 1.1 mrg ? warning_at (loc, opt,
960 1.1 mrg (maybe
961 1.1 mrg ? G_("%qD may access %E or more bytes "
962 1.1 mrg "in a region of size %E")
963 1.1 mrg : G_("%qD accessing %E or more bytes "
964 1.1 mrg "in a region of size %E")),
965 1.1 mrg func, range[0], size)
966 1.1 mrg : warning_at (loc, opt,
967 1.1 mrg (maybe
968 1.1 mrg ? G_("may access %E or more bytes "
969 1.1 mrg "in a region of size %E")
970 1.1 mrg : G_("accessing %E or more bytes "
971 1.1 mrg "in a region of size %E")),
972 1.1 mrg range[0], size));
973 1.1 mrg }
974 1.1 mrg else
975 1.1 mrg warned = (func
976 1.1 mrg ? warning_at (loc, opt,
977 1.1 mrg (maybe
978 1.1 mrg ? G_("%qD may access between %E and %E "
979 1.1 mrg "bytes in a region of size %E")
980 1.1 mrg : G_("%qD accessing between %E and %E "
981 1.1 mrg "bytes in a region of size %E")),
982 1.1 mrg func, range[0], range[1], size)
983 1.1 mrg : warning_at (loc, opt,
984 1.1 mrg (maybe
985 1.1 mrg ? G_("may access between %E and %E bytes "
986 1.1 mrg "in a region of size %E")
987 1.1 mrg : G_("accessing between %E and %E bytes "
988 1.1 mrg "in a region of size %E")),
989 1.1 mrg range[0], range[1], size));
990 1.1 mrg return warned;
991 1.1 mrg }
992 1.1 mrg
993 1.1 mrg if (write)
994 1.1 mrg {
995 1.1 mrg if (tree_int_cst_equal (range[0], range[1]))
996 1.1 mrg warned = (func
997 1.1 mrg ? warning_n (loc, opt, tree_to_uhwi (range[0]),
998 1.1 mrg (maybe
999 1.1 mrg ? G_("%qD may write %E byte into a region "
1000 1.1 mrg "of size %E")
1001 1.1 mrg : G_("%qD writing %E byte into a region "
1002 1.1 mrg "of size %E overflows the destination")),
1003 1.1 mrg (maybe
1004 1.1 mrg ? G_("%qD may write %E bytes into a region "
1005 1.1 mrg "of size %E")
1006 1.1 mrg : G_("%qD writing %E bytes into a region "
1007 1.1 mrg "of size %E overflows the destination")),
1008 1.1 mrg func, range[0], size)
1009 1.1 mrg : warning_n (loc, opt, tree_to_uhwi (range[0]),
1010 1.1 mrg (maybe
1011 1.1 mrg ? G_("may write %E byte into a region "
1012 1.1 mrg "of size %E")
1013 1.1 mrg : G_("writing %E byte into a region "
1014 1.1 mrg "of size %E overflows the destination")),
1015 1.1 mrg (maybe
1016 1.1 mrg ? G_("may write %E bytes into a region "
1017 1.1 mrg "of size %E")
1018 1.1 mrg : G_("writing %E bytes into a region "
1019 1.1 mrg "of size %E overflows the destination")),
1020 1.1 mrg range[0], size));
1021 1.1 mrg else if (tree_int_cst_sign_bit (range[1]))
1022 1.1 mrg {
1023 1.1 mrg /* Avoid printing the upper bound if it's invalid. */
1024 1.1 mrg warned = (func
1025 1.1 mrg ? warning_at (loc, opt,
1026 1.1 mrg (maybe
1027 1.1 mrg ? G_("%qD may write %E or more bytes "
1028 1.1 mrg "into a region of size %E")
1029 1.1 mrg : G_("%qD writing %E or more bytes "
1030 1.1 mrg "into a region of size %E overflows "
1031 1.1 mrg "the destination")),
1032 1.1 mrg func, range[0], size)
1033 1.1 mrg : warning_at (loc, opt,
1034 1.1 mrg (maybe
1035 1.1 mrg ? G_("may write %E or more bytes into "
1036 1.1 mrg "a region of size %E")
1037 1.1 mrg : G_("writing %E or more bytes into "
1038 1.1 mrg "a region of size %E overflows "
1039 1.1 mrg "the destination")),
1040 1.1 mrg range[0], size));
1041 1.1 mrg }
1042 1.1 mrg else
1043 1.1 mrg warned = (func
1044 1.1 mrg ? warning_at (loc, opt,
1045 1.1 mrg (maybe
1046 1.1 mrg ? G_("%qD may write between %E and %E bytes "
1047 1.1 mrg "into a region of size %E")
1048 1.1 mrg : G_("%qD writing between %E and %E bytes "
1049 1.1 mrg "into a region of size %E overflows "
1050 1.1 mrg "the destination")),
1051 1.1 mrg func, range[0], range[1], size)
1052 1.1 mrg : warning_at (loc, opt,
1053 1.1 mrg (maybe
1054 1.1 mrg ? G_("may write between %E and %E bytes "
1055 1.1 mrg "into a region of size %E")
1056 1.1 mrg : G_("writing between %E and %E bytes "
1057 1.1 mrg "into a region of size %E overflows "
1058 1.1 mrg "the destination")),
1059 1.1 mrg range[0], range[1], size));
1060 1.1 mrg return warned;
1061 1.1 mrg }
1062 1.1 mrg
1063 1.1 mrg if (read)
1064 1.1 mrg {
1065 1.1 mrg if (tree_int_cst_equal (range[0], range[1]))
1066 1.1 mrg warned = (func
1067 1.1 mrg ? warning_n (loc, OPT_Wstringop_overread,
1068 1.1 mrg tree_to_uhwi (range[0]),
1069 1.1 mrg (maybe
1070 1.1 mrg ? G_("%qD may read %E byte from a region "
1071 1.1 mrg "of size %E")
1072 1.1 mrg : G_("%qD reading %E byte from a region "
1073 1.1 mrg "of size %E")),
1074 1.1 mrg (maybe
1075 1.1 mrg ? G_("%qD may read %E bytes from a region "
1076 1.1 mrg "of size %E")
1077 1.1 mrg : G_("%qD reading %E bytes from a region "
1078 1.1 mrg "of size %E")),
1079 1.1 mrg func, range[0], size)
1080 1.1 mrg : warning_n (loc, OPT_Wstringop_overread,
1081 1.1 mrg tree_to_uhwi (range[0]),
1082 1.1 mrg (maybe
1083 1.1 mrg ? G_("may read %E byte from a region "
1084 1.1 mrg "of size %E")
1085 1.1 mrg : G_("reading %E byte from a region "
1086 1.1 mrg "of size %E")),
1087 1.1 mrg (maybe
1088 1.1 mrg ? G_("may read %E bytes from a region "
1089 1.1 mrg "of size %E")
1090 1.1 mrg : G_("reading %E bytes from a region "
1091 1.1 mrg "of size %E")),
1092 1.1 mrg range[0], size));
1093 1.1 mrg else if (tree_int_cst_sign_bit (range[1]))
1094 1.1 mrg {
1095 1.1 mrg /* Avoid printing the upper bound if it's invalid. */
1096 1.1 mrg warned = (func
1097 1.1 mrg ? warning_at (loc, OPT_Wstringop_overread,
1098 1.1 mrg (maybe
1099 1.1 mrg ? G_("%qD may read %E or more bytes "
1100 1.1 mrg "from a region of size %E")
1101 1.1 mrg : G_("%qD reading %E or more bytes "
1102 1.1 mrg "from a region of size %E")),
1103 1.1 mrg func, range[0], size)
1104 1.1 mrg : warning_at (loc, OPT_Wstringop_overread,
1105 1.1 mrg (maybe
1106 1.1 mrg ? G_("may read %E or more bytes "
1107 1.1 mrg "from a region of size %E")
1108 1.1 mrg : G_("reading %E or more bytes "
1109 1.1 mrg "from a region of size %E")),
1110 1.1 mrg range[0], size));
1111 1.1 mrg }
1112 1.1 mrg else
1113 1.1 mrg warned = (func
1114 1.1 mrg ? warning_at (loc, OPT_Wstringop_overread,
1115 1.1 mrg (maybe
1116 1.1 mrg ? G_("%qD may read between %E and %E bytes "
1117 1.1 mrg "from a region of size %E")
1118 1.1 mrg : G_("%qD reading between %E and %E bytes "
1119 1.1 mrg "from a region of size %E")),
1120 1.1 mrg func, range[0], range[1], size)
1121 1.1 mrg : warning_at (loc, opt,
1122 1.1 mrg (maybe
1123 1.1 mrg ? G_("may read between %E and %E bytes "
1124 1.1 mrg "from a region of size %E")
1125 1.1 mrg : G_("reading between %E and %E bytes "
1126 1.1 mrg "from a region of size %E")),
1127 1.1 mrg range[0], range[1], size));
1128 1.1 mrg
1129 1.1 mrg if (warned)
1130 1.1 mrg suppress_warning (exp, OPT_Wstringop_overread);
1131 1.1 mrg
1132 1.1 mrg return warned;
1133 1.1 mrg }
1134 1.1 mrg
1135 1.1 mrg if (tree_int_cst_equal (range[0], range[1])
1136 1.1 mrg || tree_int_cst_sign_bit (range[1]))
1137 1.1 mrg warned = (func
1138 1.1 mrg ? warning_n (loc, OPT_Wstringop_overread,
1139 1.1 mrg tree_to_uhwi (range[0]),
1140 1.1 mrg "%qD expecting %E byte in a region of size %E",
1141 1.1 mrg "%qD expecting %E bytes in a region of size %E",
1142 1.1 mrg func, range[0], size)
1143 1.1 mrg : warning_n (loc, OPT_Wstringop_overread,
1144 1.1 mrg tree_to_uhwi (range[0]),
1145 1.1 mrg "expecting %E byte in a region of size %E",
1146 1.1 mrg "expecting %E bytes in a region of size %E",
1147 1.1 mrg range[0], size));
1148 1.1 mrg else if (tree_int_cst_sign_bit (range[1]))
1149 1.1 mrg {
1150 1.1 mrg /* Avoid printing the upper bound if it's invalid. */
1151 1.1 mrg warned = (func
1152 1.1 mrg ? warning_at (loc, OPT_Wstringop_overread,
1153 1.1 mrg "%qD expecting %E or more bytes in a region "
1154 1.1 mrg "of size %E",
1155 1.1 mrg func, range[0], size)
1156 1.1 mrg : warning_at (loc, OPT_Wstringop_overread,
1157 1.1 mrg "expecting %E or more bytes in a region "
1158 1.1 mrg "of size %E",
1159 1.1 mrg range[0], size));
1160 1.1 mrg }
1161 1.1 mrg else
1162 1.1 mrg warned = (func
1163 1.1 mrg ? warning_at (loc, OPT_Wstringop_overread,
1164 1.1 mrg "%qD expecting between %E and %E bytes in "
1165 1.1 mrg "a region of size %E",
1166 1.1 mrg func, range[0], range[1], size)
1167 1.1 mrg : warning_at (loc, OPT_Wstringop_overread,
1168 1.1 mrg "expecting between %E and %E bytes in "
1169 1.1 mrg "a region of size %E",
1170 1.1 mrg range[0], range[1], size));
1171 1.1 mrg
1172 1.1 mrg if (warned)
1173 1.1 mrg suppress_warning (exp, OPT_Wstringop_overread);
1174 1.1 mrg
1175 1.1 mrg return warned;
1176 1.1 mrg }
1177 1.1 mrg
1178 1.1 mrg static bool
1179 1.1 mrg warn_for_access (location_t loc, tree func, gimple *stmt, int opt,
1180 1.1 mrg tree range[2], tree size, bool write, bool read, bool maybe)
1181 1.1 mrg {
1182 1.1 mrg return warn_for_access<gimple *>(loc, func, stmt, opt, range, size,
1183 1.1 mrg write, read, maybe);
1184 1.1 mrg }
1185 1.1 mrg
1186 1.1 mrg static bool
1187 1.1 mrg warn_for_access (location_t loc, tree func, tree expr, int opt,
1188 1.1 mrg tree range[2], tree size, bool write, bool read, bool maybe)
1189 1.1 mrg {
1190 1.1 mrg return warn_for_access<tree>(loc, func, expr, opt, range, size,
1191 1.1 mrg write, read, maybe);
1192 1.1 mrg }
1193 1.1 mrg
1194 1.1 mrg /* Helper to set RANGE to the range of BOUND if it's nonnull, bounded
1195 1.1 mrg by BNDRNG if nonnull and valid. */
1196 1.1 mrg
1197 1.1 mrg static void
1198 1.1 mrg get_size_range (range_query *query, tree bound, gimple *stmt, tree range[2],
1199 1.1 mrg const offset_int bndrng[2])
1200 1.1 mrg {
1201 1.1 mrg if (bound)
1202 1.1 mrg get_size_range (query, bound, stmt, range);
1203 1.1 mrg
1204 1.1 mrg if (!bndrng || (bndrng[0] == 0 && bndrng[1] == HOST_WIDE_INT_M1U))
1205 1.1 mrg return;
1206 1.1 mrg
1207 1.1 mrg if (range[0] && TREE_CODE (range[0]) == INTEGER_CST)
1208 1.1 mrg {
1209 1.1 mrg offset_int r[] =
1210 1.1 mrg { wi::to_offset (range[0]), wi::to_offset (range[1]) };
1211 1.1 mrg if (r[0] < bndrng[0])
1212 1.1 mrg range[0] = wide_int_to_tree (sizetype, bndrng[0]);
1213 1.1 mrg if (bndrng[1] < r[1])
1214 1.1 mrg range[1] = wide_int_to_tree (sizetype, bndrng[1]);
1215 1.1 mrg }
1216 1.1 mrg else
1217 1.1 mrg {
1218 1.1 mrg range[0] = wide_int_to_tree (sizetype, bndrng[0]);
1219 1.1 mrg range[1] = wide_int_to_tree (sizetype, bndrng[1]);
1220 1.1 mrg }
1221 1.1 mrg }
1222 1.1 mrg
1223 1.1 mrg /* Try to verify that the sizes and lengths of the arguments to a string
1224 1.1 mrg manipulation function given by EXP are within valid bounds and that
1225 1.1 mrg the operation does not lead to buffer overflow or read past the end.
1226 1.1 mrg Arguments other than EXP may be null. When non-null, the arguments
1227 1.1 mrg have the following meaning:
1228 1.1 mrg DST is the destination of a copy call or NULL otherwise.
1229 1.1 mrg SRC is the source of a copy call or NULL otherwise.
1230 1.1 mrg DSTWRITE is the number of bytes written into the destination obtained
1231 1.1 mrg from the user-supplied size argument to the function (such as in
1232 1.1 mrg memcpy(DST, SRCs, DSTWRITE) or strncpy(DST, DRC, DSTWRITE).
1233 1.1 mrg MAXREAD is the user-supplied bound on the length of the source sequence
1234 1.1 mrg (such as in strncat(d, s, N). It specifies the upper limit on the number
1235 1.1 mrg of bytes to write. If NULL, it's taken to be the same as DSTWRITE.
1236 1.1 mrg SRCSTR is the source string (such as in strcpy(DST, SRC)) when the
1237 1.1 mrg expression EXP is a string function call (as opposed to a memory call
1238 1.1 mrg like memcpy). As an exception, SRCSTR can also be an integer denoting
1239 1.1 mrg the precomputed size of the source string or object (for functions like
1240 1.1 mrg memcpy).
1241 1.1 mrg DSTSIZE is the size of the destination object.
1242 1.1 mrg
1243 1.1 mrg When DSTWRITE is null LEN is checked to verify that it doesn't exceed
1244 1.1 mrg SIZE_MAX.
1245 1.1 mrg
1246 1.1 mrg WRITE is true for write accesses, READ is true for reads. Both are
1247 1.1 mrg false for simple size checks in calls to functions that neither read
1248 1.1 mrg from nor write to the region.
1249 1.1 mrg
1250 1.1 mrg When nonnull, PAD points to a more detailed description of the access.
1251 1.1 mrg
1252 1.1 mrg If the call is successfully verified as safe return true, otherwise
1253 1.1 mrg return false. */
1254 1.1 mrg
1255 1.1 mrg template <class GimpleOrTree>
1256 1.1 mrg static bool
1257 1.1 mrg check_access (GimpleOrTree exp, tree dstwrite,
1258 1.1 mrg tree maxread, tree srcstr, tree dstsize,
1259 1.1 mrg access_mode mode, const access_data *pad,
1260 1.1 mrg range_query *rvals)
1261 1.1 mrg {
1262 1.1 mrg /* The size of the largest object is half the address space, or
1263 1.1 mrg PTRDIFF_MAX. (This is way too permissive.) */
1264 1.1 mrg tree maxobjsize = max_object_size ();
1265 1.1 mrg
1266 1.1 mrg /* Either an approximate/minimum the length of the source string for
1267 1.1 mrg string functions or the size of the source object for raw memory
1268 1.1 mrg functions. */
1269 1.1 mrg tree slen = NULL_TREE;
1270 1.1 mrg
1271 1.1 mrg /* The range of the access in bytes; first set to the write access
1272 1.1 mrg for functions that write and then read for those that also (or
1273 1.1 mrg just) read. */
1274 1.1 mrg tree range[2] = { NULL_TREE, NULL_TREE };
1275 1.1 mrg
1276 1.1 mrg /* Set to true when the exact number of bytes written by a string
1277 1.1 mrg function like strcpy is not known and the only thing that is
1278 1.1 mrg known is that it must be at least one (for the terminating nul). */
1279 1.1 mrg bool at_least_one = false;
1280 1.1 mrg if (srcstr)
1281 1.1 mrg {
1282 1.1 mrg /* SRCSTR is normally a pointer to string but as a special case
1283 1.1 mrg it can be an integer denoting the length of a string. */
1284 1.1 mrg if (POINTER_TYPE_P (TREE_TYPE (srcstr)))
1285 1.1 mrg {
1286 1.1 mrg if (!check_nul_terminated_array (exp, srcstr, maxread))
1287 1.1 mrg /* Return if the array is not nul-terminated and a warning
1288 1.1 mrg has been issued. */
1289 1.1 mrg return false;
1290 1.1 mrg
1291 1.1 mrg /* Try to determine the range of lengths the source string
1292 1.1 mrg refers to. If it can be determined and is less than
1293 1.1 mrg the upper bound given by MAXREAD add one to it for
1294 1.1 mrg the terminating nul. Otherwise, set it to one for
1295 1.1 mrg the same reason, or to MAXREAD as appropriate. */
1296 1.1 mrg c_strlen_data lendata = { };
1297 1.1 mrg get_range_strlen (srcstr, &lendata, /* eltsize = */ 1);
1298 1.1 mrg range[0] = lendata.minlen;
1299 1.1 mrg range[1] = lendata.maxbound ? lendata.maxbound : lendata.maxlen;
1300 1.1 mrg if (range[0]
1301 1.1 mrg && TREE_CODE (range[0]) == INTEGER_CST
1302 1.1 mrg && TREE_CODE (range[1]) == INTEGER_CST
1303 1.1 mrg && (!maxread || TREE_CODE (maxread) == INTEGER_CST))
1304 1.1 mrg {
1305 1.1 mrg if (maxread && tree_int_cst_le (maxread, range[0]))
1306 1.1 mrg range[0] = range[1] = maxread;
1307 1.1 mrg else
1308 1.1 mrg range[0] = fold_build2 (PLUS_EXPR, size_type_node,
1309 1.1 mrg range[0], size_one_node);
1310 1.1 mrg
1311 1.1 mrg if (maxread && tree_int_cst_le (maxread, range[1]))
1312 1.1 mrg range[1] = maxread;
1313 1.1 mrg else if (!integer_all_onesp (range[1]))
1314 1.1 mrg range[1] = fold_build2 (PLUS_EXPR, size_type_node,
1315 1.1 mrg range[1], size_one_node);
1316 1.1 mrg
1317 1.1 mrg slen = range[0];
1318 1.1 mrg }
1319 1.1 mrg else
1320 1.1 mrg {
1321 1.1 mrg at_least_one = true;
1322 1.1 mrg slen = size_one_node;
1323 1.1 mrg }
1324 1.1 mrg }
1325 1.1 mrg else
1326 1.1 mrg slen = srcstr;
1327 1.1 mrg }
1328 1.1 mrg
1329 1.1 mrg if (!dstwrite && !maxread)
1330 1.1 mrg {
1331 1.1 mrg /* When the only available piece of data is the object size
1332 1.1 mrg there is nothing to do. */
1333 1.1 mrg if (!slen)
1334 1.1 mrg return true;
1335 1.1 mrg
1336 1.1 mrg /* Otherwise, when the length of the source sequence is known
1337 1.1 mrg (as with strlen), set DSTWRITE to it. */
1338 1.1 mrg if (!range[0])
1339 1.1 mrg dstwrite = slen;
1340 1.1 mrg }
1341 1.1 mrg
1342 1.1 mrg if (!dstsize)
1343 1.1 mrg dstsize = maxobjsize;
1344 1.1 mrg
1345 1.1 mrg /* Set RANGE to that of DSTWRITE if non-null, bounded by PAD->DST_BNDRNG
1346 1.1 mrg if valid. */
1347 1.1 mrg gimple *stmt = pad ? pad->stmt : nullptr;
1348 1.1 mrg get_size_range (rvals, dstwrite, stmt, range, pad ? pad->dst_bndrng : NULL);
1349 1.1 mrg
1350 1.1 mrg tree func = get_callee_fndecl (exp);
1351 1.1 mrg /* Read vs write access by built-ins can be determined from the const
1352 1.1 mrg qualifiers on the pointer argument. In the absence of attribute
1353 1.1 mrg access, non-const qualified pointer arguments to user-defined
1354 1.1 mrg functions are assumed to both read and write the objects. */
1355 1.1 mrg const bool builtin = func ? fndecl_built_in_p (func) : false;
1356 1.1 mrg
1357 1.1 mrg /* First check the number of bytes to be written against the maximum
1358 1.1 mrg object size. */
1359 1.1 mrg if (range[0]
1360 1.1 mrg && TREE_CODE (range[0]) == INTEGER_CST
1361 1.1 mrg && tree_int_cst_lt (maxobjsize, range[0]))
1362 1.1 mrg {
1363 1.1 mrg location_t loc = get_location (exp);
1364 1.1 mrg maybe_warn_for_bound (OPT_Wstringop_overflow_, loc, exp, func, range,
1365 1.1 mrg NULL_TREE, pad);
1366 1.1 mrg return false;
1367 1.1 mrg }
1368 1.1 mrg
1369 1.1 mrg /* The number of bytes to write is "exact" if DSTWRITE is non-null,
1370 1.1 mrg constant, and in range of unsigned HOST_WIDE_INT. */
1371 1.1 mrg bool exactwrite = dstwrite && tree_fits_uhwi_p (dstwrite);
1372 1.1 mrg
1373 1.1 mrg /* Next check the number of bytes to be written against the destination
1374 1.1 mrg object size. */
1375 1.1 mrg if (range[0] || !exactwrite || integer_all_onesp (dstwrite))
1376 1.1 mrg {
1377 1.1 mrg if (range[0]
1378 1.1 mrg && TREE_CODE (range[0]) == INTEGER_CST
1379 1.1 mrg && ((tree_fits_uhwi_p (dstsize)
1380 1.1 mrg && tree_int_cst_lt (dstsize, range[0]))
1381 1.1 mrg || (dstwrite
1382 1.1 mrg && tree_fits_uhwi_p (dstwrite)
1383 1.1 mrg && tree_int_cst_lt (dstwrite, range[0]))))
1384 1.1 mrg {
1385 1.1 mrg const opt_code opt = OPT_Wstringop_overflow_;
1386 1.1 mrg if (warning_suppressed_p (exp, opt)
1387 1.1 mrg || (pad && pad->dst.ref
1388 1.1 mrg && warning_suppressed_p (pad->dst.ref, opt)))
1389 1.1 mrg return false;
1390 1.1 mrg
1391 1.1 mrg location_t loc = get_location (exp);
1392 1.1 mrg bool warned = false;
1393 1.1 mrg if (dstwrite == slen && at_least_one)
1394 1.1 mrg {
1395 1.1 mrg /* This is a call to strcpy with a destination of 0 size
1396 1.1 mrg and a source of unknown length. The call will write
1397 1.1 mrg at least one byte past the end of the destination. */
1398 1.1 mrg warned = (func
1399 1.1 mrg ? warning_at (loc, opt,
1400 1.1 mrg "%qD writing %E or more bytes into "
1401 1.1 mrg "a region of size %E overflows "
1402 1.1 mrg "the destination",
1403 1.1 mrg func, range[0], dstsize)
1404 1.1 mrg : warning_at (loc, opt,
1405 1.1 mrg "writing %E or more bytes into "
1406 1.1 mrg "a region of size %E overflows "
1407 1.1 mrg "the destination",
1408 1.1 mrg range[0], dstsize));
1409 1.1 mrg }
1410 1.1 mrg else
1411 1.1 mrg {
1412 1.1 mrg const bool read
1413 1.1 mrg = mode == access_read_only || mode == access_read_write;
1414 1.1 mrg const bool write
1415 1.1 mrg = mode == access_write_only || mode == access_read_write;
1416 1.1 mrg const bool maybe = pad && pad->dst.parmarray;
1417 1.1 mrg warned = warn_for_access (loc, func, exp,
1418 1.1 mrg OPT_Wstringop_overflow_,
1419 1.1 mrg range, dstsize,
1420 1.1 mrg write, read && !builtin, maybe);
1421 1.1 mrg }
1422 1.1 mrg
1423 1.1 mrg if (warned)
1424 1.1 mrg {
1425 1.1 mrg suppress_warning (exp, OPT_Wstringop_overflow_);
1426 1.1 mrg if (pad)
1427 1.1 mrg pad->dst.inform_access (pad->mode);
1428 1.1 mrg }
1429 1.1 mrg
1430 1.1 mrg /* Return error when an overflow has been detected. */
1431 1.1 mrg return false;
1432 1.1 mrg }
1433 1.1 mrg }
1434 1.1 mrg
1435 1.1 mrg /* Check the maximum length of the source sequence against the size
1436 1.1 mrg of the destination object if known, or against the maximum size
1437 1.1 mrg of an object. */
1438 1.1 mrg if (maxread)
1439 1.1 mrg {
1440 1.1 mrg /* Set RANGE to that of MAXREAD, bounded by PAD->SRC_BNDRNG if
1441 1.1 mrg PAD is nonnull and BNDRNG is valid. */
1442 1.1 mrg get_size_range (rvals, maxread, stmt, range, pad ? pad->src_bndrng : NULL);
1443 1.1 mrg
1444 1.1 mrg location_t loc = get_location (exp);
1445 1.1 mrg tree size = dstsize;
1446 1.1 mrg if (pad && pad->mode == access_read_only)
1447 1.1 mrg size = wide_int_to_tree (sizetype, pad->src.size_remaining ());
1448 1.1 mrg
1449 1.1 mrg if (range[0] && maxread && tree_fits_uhwi_p (size))
1450 1.1 mrg {
1451 1.1 mrg if (tree_int_cst_lt (maxobjsize, range[0]))
1452 1.1 mrg {
1453 1.1 mrg maybe_warn_for_bound (OPT_Wstringop_overread, loc, exp, func,
1454 1.1 mrg range, size, pad);
1455 1.1 mrg return false;
1456 1.1 mrg }
1457 1.1 mrg
1458 1.1 mrg if (size != maxobjsize && tree_int_cst_lt (size, range[0]))
1459 1.1 mrg {
1460 1.1 mrg opt_code opt = (dstwrite || mode != access_read_only
1461 1.1 mrg ? OPT_Wstringop_overflow_
1462 1.1 mrg : OPT_Wstringop_overread);
1463 1.1 mrg maybe_warn_for_bound (opt, loc, exp, func, range, size, pad);
1464 1.1 mrg return false;
1465 1.1 mrg }
1466 1.1 mrg }
1467 1.1 mrg
1468 1.1 mrg maybe_warn_nonstring_arg (func, exp);
1469 1.1 mrg }
1470 1.1 mrg
1471 1.1 mrg /* Check for reading past the end of SRC. */
1472 1.1 mrg bool overread = (slen
1473 1.1 mrg && slen == srcstr
1474 1.1 mrg && dstwrite
1475 1.1 mrg && range[0]
1476 1.1 mrg && TREE_CODE (slen) == INTEGER_CST
1477 1.1 mrg && tree_int_cst_lt (slen, range[0]));
1478 1.1 mrg /* If none is determined try to get a better answer based on the details
1479 1.1 mrg in PAD. */
1480 1.1 mrg if (!overread
1481 1.1 mrg && pad
1482 1.1 mrg && pad->src.sizrng[1] >= 0
1483 1.1 mrg && pad->src.offrng[0] >= 0
1484 1.1 mrg && (pad->src.offrng[1] < 0
1485 1.1 mrg || pad->src.offrng[0] <= pad->src.offrng[1]))
1486 1.1 mrg {
1487 1.1 mrg /* Set RANGE to that of MAXREAD, bounded by PAD->SRC_BNDRNG if
1488 1.1 mrg PAD is nonnull and BNDRNG is valid. */
1489 1.1 mrg get_size_range (rvals, maxread, stmt, range, pad ? pad->src_bndrng : NULL);
1490 1.1 mrg /* Set OVERREAD for reads starting just past the end of an object. */
1491 1.1 mrg overread = pad->src.sizrng[1] - pad->src.offrng[0] < pad->src_bndrng[0];
1492 1.1 mrg range[0] = wide_int_to_tree (sizetype, pad->src_bndrng[0]);
1493 1.1 mrg slen = size_zero_node;
1494 1.1 mrg }
1495 1.1 mrg
1496 1.1 mrg if (overread)
1497 1.1 mrg {
1498 1.1 mrg const opt_code opt = OPT_Wstringop_overread;
1499 1.1 mrg if (warning_suppressed_p (exp, opt)
1500 1.1 mrg || (srcstr && warning_suppressed_p (srcstr, opt))
1501 1.1 mrg || (pad && pad->src.ref
1502 1.1 mrg && warning_suppressed_p (pad->src.ref, opt)))
1503 1.1 mrg return false;
1504 1.1 mrg
1505 1.1 mrg location_t loc = get_location (exp);
1506 1.1 mrg const bool read
1507 1.1 mrg = mode == access_read_only || mode == access_read_write;
1508 1.1 mrg const bool maybe = pad && pad->dst.parmarray;
1509 1.1 mrg if (warn_for_access (loc, func, exp, opt, range, slen, false, read,
1510 1.1 mrg maybe))
1511 1.1 mrg {
1512 1.1 mrg suppress_warning (exp, opt);
1513 1.1 mrg if (pad)
1514 1.1 mrg pad->src.inform_access (access_read_only);
1515 1.1 mrg }
1516 1.1 mrg return false;
1517 1.1 mrg }
1518 1.1 mrg
1519 1.1 mrg return true;
1520 1.1 mrg }
1521 1.1 mrg
1522 1.1 mrg static bool
1523 1.1 mrg check_access (gimple *stmt, tree dstwrite,
1524 1.1 mrg tree maxread, tree srcstr, tree dstsize,
1525 1.1 mrg access_mode mode, const access_data *pad,
1526 1.1 mrg range_query *rvals)
1527 1.1 mrg {
1528 1.1 mrg return check_access<gimple *> (stmt, dstwrite, maxread, srcstr, dstsize,
1529 1.1 mrg mode, pad, rvals);
1530 1.1 mrg }
1531 1.1 mrg
1532 1.1 mrg bool
1533 1.1 mrg check_access (tree expr, tree dstwrite,
1534 1.1 mrg tree maxread, tree srcstr, tree dstsize,
1535 1.1 mrg access_mode mode, const access_data *pad /* = NULL */)
1536 1.1 mrg {
1537 1.1 mrg return check_access<tree> (expr, dstwrite, maxread, srcstr, dstsize,
1538 1.1 mrg mode, pad, nullptr);
1539 1.1 mrg }
1540 1.1 mrg
1541 1.1 mrg /* Return true if STMT is a call to an allocation function. Unless
1542 1.1 mrg ALL_ALLOC is set, consider only functions that return dynamically
1543 1.1 mrg allocated objects. Otherwise return true even for all forms of
1544 1.1 mrg alloca (including VLA). */
1545 1.1 mrg
1546 1.1 mrg static bool
1547 1.1 mrg fndecl_alloc_p (tree fndecl, bool all_alloc)
1548 1.1 mrg {
1549 1.1 mrg if (!fndecl)
1550 1.1 mrg return false;
1551 1.1 mrg
1552 1.1 mrg /* A call to operator new isn't recognized as one to a built-in. */
1553 1.1 mrg if (DECL_IS_OPERATOR_NEW_P (fndecl))
1554 1.1 mrg return true;
1555 1.1 mrg
1556 1.1 mrg if (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
1557 1.1 mrg {
1558 1.1 mrg switch (DECL_FUNCTION_CODE (fndecl))
1559 1.1 mrg {
1560 1.1 mrg case BUILT_IN_ALLOCA:
1561 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN:
1562 1.1 mrg return all_alloc;
1563 1.1 mrg case BUILT_IN_ALIGNED_ALLOC:
1564 1.1 mrg case BUILT_IN_CALLOC:
1565 1.1 mrg case BUILT_IN_GOMP_ALLOC:
1566 1.1 mrg case BUILT_IN_MALLOC:
1567 1.1 mrg case BUILT_IN_REALLOC:
1568 1.1 mrg case BUILT_IN_STRDUP:
1569 1.1 mrg case BUILT_IN_STRNDUP:
1570 1.1 mrg return true;
1571 1.1 mrg default:
1572 1.1 mrg break;
1573 1.1 mrg }
1574 1.1 mrg }
1575 1.1 mrg
1576 1.1 mrg /* A function is considered an allocation function if it's declared
1577 1.1 mrg with attribute malloc with an argument naming its associated
1578 1.1 mrg deallocation function. */
1579 1.1 mrg tree attrs = DECL_ATTRIBUTES (fndecl);
1580 1.1 mrg if (!attrs)
1581 1.1 mrg return false;
1582 1.1 mrg
1583 1.1 mrg for (tree allocs = attrs;
1584 1.1 mrg (allocs = lookup_attribute ("malloc", allocs));
1585 1.1 mrg allocs = TREE_CHAIN (allocs))
1586 1.1 mrg {
1587 1.1 mrg tree args = TREE_VALUE (allocs);
1588 1.1 mrg if (!args)
1589 1.1 mrg continue;
1590 1.1 mrg
1591 1.1 mrg if (TREE_VALUE (args))
1592 1.1 mrg return true;
1593 1.1 mrg }
1594 1.1 mrg
1595 1.1 mrg return false;
1596 1.1 mrg }
1597 1.1 mrg
1598 1.1 mrg /* Return true if STMT is a call to an allocation function. A wrapper
1599 1.1 mrg around fndecl_alloc_p. */
1600 1.1 mrg
1601 1.1 mrg static bool
1602 1.1 mrg gimple_call_alloc_p (gimple *stmt, bool all_alloc = false)
1603 1.1 mrg {
1604 1.1 mrg return fndecl_alloc_p (gimple_call_fndecl (stmt), all_alloc);
1605 1.1 mrg }
1606 1.1 mrg
1607 1.1 mrg /* Return true if DELC doesn't refer to an operator delete that's
1608 1.1 mrg suitable to call with a pointer returned from the operator new
1609 1.1 mrg described by NEWC. */
1610 1.1 mrg
1611 1.1 mrg static bool
1612 1.1 mrg new_delete_mismatch_p (const demangle_component &newc,
1613 1.1 mrg const demangle_component &delc)
1614 1.1 mrg {
1615 1.1 mrg if (newc.type != delc.type)
1616 1.1 mrg return true;
1617 1.1 mrg
1618 1.1 mrg switch (newc.type)
1619 1.1 mrg {
1620 1.1 mrg case DEMANGLE_COMPONENT_NAME:
1621 1.1 mrg {
1622 1.1 mrg int len = newc.u.s_name.len;
1623 1.1 mrg const char *news = newc.u.s_name.s;
1624 1.1 mrg const char *dels = delc.u.s_name.s;
1625 1.1 mrg if (len != delc.u.s_name.len || memcmp (news, dels, len))
1626 1.1 mrg return true;
1627 1.1 mrg
1628 1.1 mrg if (news[len] == 'n')
1629 1.1 mrg {
1630 1.1 mrg if (news[len + 1] == 'a')
1631 1.1 mrg return dels[len] != 'd' || dels[len + 1] != 'a';
1632 1.1 mrg if (news[len + 1] == 'w')
1633 1.1 mrg return dels[len] != 'd' || dels[len + 1] != 'l';
1634 1.1 mrg }
1635 1.1 mrg return false;
1636 1.1 mrg }
1637 1.1 mrg
1638 1.1 mrg case DEMANGLE_COMPONENT_OPERATOR:
1639 1.1 mrg /* Operator mismatches are handled above. */
1640 1.1 mrg return false;
1641 1.1 mrg
1642 1.1 mrg case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
1643 1.1 mrg if (newc.u.s_extended_operator.args != delc.u.s_extended_operator.args)
1644 1.1 mrg return true;
1645 1.1 mrg return new_delete_mismatch_p (*newc.u.s_extended_operator.name,
1646 1.1 mrg *delc.u.s_extended_operator.name);
1647 1.1 mrg
1648 1.1 mrg case DEMANGLE_COMPONENT_FIXED_TYPE:
1649 1.1 mrg if (newc.u.s_fixed.accum != delc.u.s_fixed.accum
1650 1.1 mrg || newc.u.s_fixed.sat != delc.u.s_fixed.sat)
1651 1.1 mrg return true;
1652 1.1 mrg return new_delete_mismatch_p (*newc.u.s_fixed.length,
1653 1.1 mrg *delc.u.s_fixed.length);
1654 1.1 mrg
1655 1.1 mrg case DEMANGLE_COMPONENT_CTOR:
1656 1.1 mrg if (newc.u.s_ctor.kind != delc.u.s_ctor.kind)
1657 1.1 mrg return true;
1658 1.1 mrg return new_delete_mismatch_p (*newc.u.s_ctor.name,
1659 1.1 mrg *delc.u.s_ctor.name);
1660 1.1 mrg
1661 1.1 mrg case DEMANGLE_COMPONENT_DTOR:
1662 1.1 mrg if (newc.u.s_dtor.kind != delc.u.s_dtor.kind)
1663 1.1 mrg return true;
1664 1.1 mrg return new_delete_mismatch_p (*newc.u.s_dtor.name,
1665 1.1 mrg *delc.u.s_dtor.name);
1666 1.1 mrg
1667 1.1 mrg case DEMANGLE_COMPONENT_BUILTIN_TYPE:
1668 1.1 mrg {
1669 1.1 mrg /* The demangler API provides no better way to compare built-in
1670 1.1 mrg types except to by comparing their demangled names. */
1671 1.1 mrg size_t nsz, dsz;
1672 1.1 mrg demangle_component *pnc = const_cast<demangle_component *>(&newc);
1673 1.1 mrg demangle_component *pdc = const_cast<demangle_component *>(&delc);
1674 1.1 mrg char *nts = cplus_demangle_print (0, pnc, 16, &nsz);
1675 1.1 mrg char *dts = cplus_demangle_print (0, pdc, 16, &dsz);
1676 1.1 mrg if (!nts != !dts)
1677 1.1 mrg return true;
1678 1.1 mrg bool mismatch = strcmp (nts, dts);
1679 1.1 mrg free (nts);
1680 1.1 mrg free (dts);
1681 1.1 mrg return mismatch;
1682 1.1 mrg }
1683 1.1 mrg
1684 1.1 mrg case DEMANGLE_COMPONENT_SUB_STD:
1685 1.1 mrg if (newc.u.s_string.len != delc.u.s_string.len)
1686 1.1 mrg return true;
1687 1.1 mrg return memcmp (newc.u.s_string.string, delc.u.s_string.string,
1688 1.1 mrg newc.u.s_string.len);
1689 1.1 mrg
1690 1.1 mrg case DEMANGLE_COMPONENT_FUNCTION_PARAM:
1691 1.1 mrg case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
1692 1.1 mrg case DEMANGLE_COMPONENT_UNNAMED_TYPE:
1693 1.1 mrg return newc.u.s_number.number != delc.u.s_number.number;
1694 1.1 mrg
1695 1.1 mrg case DEMANGLE_COMPONENT_CHARACTER:
1696 1.1 mrg return newc.u.s_character.character != delc.u.s_character.character;
1697 1.1 mrg
1698 1.1 mrg case DEMANGLE_COMPONENT_DEFAULT_ARG:
1699 1.1 mrg case DEMANGLE_COMPONENT_LAMBDA:
1700 1.1 mrg if (newc.u.s_unary_num.num != delc.u.s_unary_num.num)
1701 1.1 mrg return true;
1702 1.1 mrg return new_delete_mismatch_p (*newc.u.s_unary_num.sub,
1703 1.1 mrg *delc.u.s_unary_num.sub);
1704 1.1 mrg default:
1705 1.1 mrg break;
1706 1.1 mrg }
1707 1.1 mrg
1708 1.1 mrg if (!newc.u.s_binary.left != !delc.u.s_binary.left)
1709 1.1 mrg return true;
1710 1.1 mrg
1711 1.1 mrg if (!newc.u.s_binary.left)
1712 1.1 mrg return false;
1713 1.1 mrg
1714 1.1 mrg if (new_delete_mismatch_p (*newc.u.s_binary.left, *delc.u.s_binary.left)
1715 1.1 mrg || !newc.u.s_binary.right != !delc.u.s_binary.right)
1716 1.1 mrg return true;
1717 1.1 mrg
1718 1.1 mrg if (newc.u.s_binary.right)
1719 1.1 mrg return new_delete_mismatch_p (*newc.u.s_binary.right,
1720 1.1 mrg *delc.u.s_binary.right);
1721 1.1 mrg return false;
1722 1.1 mrg }
1723 1.1 mrg
1724 1.1 mrg /* Return true if DELETE_DECL is an operator delete that's not suitable
1725 1.1 mrg to call with a pointer returned from NEW_DECL. */
1726 1.1 mrg
1727 1.1 mrg static bool
1728 1.1 mrg new_delete_mismatch_p (tree new_decl, tree delete_decl)
1729 1.1 mrg {
1730 1.1 mrg tree new_name = DECL_ASSEMBLER_NAME (new_decl);
1731 1.1 mrg tree delete_name = DECL_ASSEMBLER_NAME (delete_decl);
1732 1.1 mrg
1733 1.1 mrg /* valid_new_delete_pair_p() returns a conservative result (currently
1734 1.1 mrg it only handles global operators). A true result is reliable but
1735 1.1 mrg a false result doesn't necessarily mean the operators don't match
1736 1.1 mrg unless CERTAIN is set. */
1737 1.1 mrg bool certain;
1738 1.1 mrg if (valid_new_delete_pair_p (new_name, delete_name, &certain))
1739 1.1 mrg return false;
1740 1.1 mrg /* CERTAIN is set when the negative result is certain. */
1741 1.1 mrg if (certain)
1742 1.1 mrg return true;
1743 1.1 mrg
1744 1.1 mrg /* For anything not handled by valid_new_delete_pair_p() such as member
1745 1.1 mrg operators compare the individual demangled components of the mangled
1746 1.1 mrg name. */
1747 1.1 mrg const char *new_str = IDENTIFIER_POINTER (new_name);
1748 1.1 mrg const char *del_str = IDENTIFIER_POINTER (delete_name);
1749 1.1 mrg
1750 1.1 mrg void *np = NULL, *dp = NULL;
1751 1.1 mrg demangle_component *ndc = cplus_demangle_v3_components (new_str, 0, &np);
1752 1.1 mrg demangle_component *ddc = cplus_demangle_v3_components (del_str, 0, &dp);
1753 1.1 mrg bool mismatch = new_delete_mismatch_p (*ndc, *ddc);
1754 1.1 mrg free (np);
1755 1.1 mrg free (dp);
1756 1.1 mrg return mismatch;
1757 1.1 mrg }
1758 1.1 mrg
1759 1.1 mrg /* ALLOC_DECL and DEALLOC_DECL are pair of allocation and deallocation
1760 1.1 mrg functions. Return true if the latter is suitable to deallocate objects
1761 1.1 mrg allocated by calls to the former. */
1762 1.1 mrg
1763 1.1 mrg static bool
1764 1.1 mrg matching_alloc_calls_p (tree alloc_decl, tree dealloc_decl)
1765 1.1 mrg {
1766 1.1 mrg /* Set to alloc_kind_t::builtin if ALLOC_DECL is associated with
1767 1.1 mrg a built-in deallocator. */
1768 1.1 mrg enum class alloc_kind_t { none, builtin, user }
1769 1.1 mrg alloc_dealloc_kind = alloc_kind_t::none;
1770 1.1 mrg
1771 1.1 mrg if (DECL_IS_OPERATOR_NEW_P (alloc_decl))
1772 1.1 mrg {
1773 1.1 mrg if (DECL_IS_OPERATOR_DELETE_P (dealloc_decl))
1774 1.1 mrg /* Return true iff both functions are of the same array or
1775 1.1 mrg singleton form and false otherwise. */
1776 1.1 mrg return !new_delete_mismatch_p (alloc_decl, dealloc_decl);
1777 1.1 mrg
1778 1.1 mrg /* Return false for deallocation functions that are known not
1779 1.1 mrg to match. */
1780 1.1 mrg if (fndecl_built_in_p (dealloc_decl, BUILT_IN_FREE)
1781 1.1 mrg || fndecl_built_in_p (dealloc_decl, BUILT_IN_REALLOC))
1782 1.1 mrg return false;
1783 1.1 mrg /* Otherwise proceed below to check the deallocation function's
1784 1.1 mrg "*dealloc" attributes to look for one that mentions this operator
1785 1.1 mrg new. */
1786 1.1 mrg }
1787 1.1 mrg else if (fndecl_built_in_p (alloc_decl, BUILT_IN_NORMAL))
1788 1.1 mrg {
1789 1.1 mrg switch (DECL_FUNCTION_CODE (alloc_decl))
1790 1.1 mrg {
1791 1.1 mrg case BUILT_IN_ALLOCA:
1792 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN:
1793 1.1 mrg return false;
1794 1.1 mrg
1795 1.1 mrg case BUILT_IN_ALIGNED_ALLOC:
1796 1.1 mrg case BUILT_IN_CALLOC:
1797 1.1 mrg case BUILT_IN_GOMP_ALLOC:
1798 1.1 mrg case BUILT_IN_MALLOC:
1799 1.1 mrg case BUILT_IN_REALLOC:
1800 1.1 mrg case BUILT_IN_STRDUP:
1801 1.1 mrg case BUILT_IN_STRNDUP:
1802 1.1 mrg if (DECL_IS_OPERATOR_DELETE_P (dealloc_decl))
1803 1.1 mrg return false;
1804 1.1 mrg
1805 1.1 mrg if (fndecl_built_in_p (dealloc_decl, BUILT_IN_FREE)
1806 1.1 mrg || fndecl_built_in_p (dealloc_decl, BUILT_IN_REALLOC))
1807 1.1 mrg return true;
1808 1.1 mrg
1809 1.1 mrg alloc_dealloc_kind = alloc_kind_t::builtin;
1810 1.1 mrg break;
1811 1.1 mrg
1812 1.1 mrg default:
1813 1.1 mrg break;
1814 1.1 mrg }
1815 1.1 mrg }
1816 1.1 mrg
1817 1.1 mrg /* Set if DEALLOC_DECL both allocates and deallocates. */
1818 1.1 mrg alloc_kind_t realloc_kind = alloc_kind_t::none;
1819 1.1 mrg
1820 1.1 mrg if (fndecl_built_in_p (dealloc_decl, BUILT_IN_NORMAL))
1821 1.1 mrg {
1822 1.1 mrg built_in_function dealloc_code = DECL_FUNCTION_CODE (dealloc_decl);
1823 1.1 mrg if (dealloc_code == BUILT_IN_REALLOC)
1824 1.1 mrg realloc_kind = alloc_kind_t::builtin;
1825 1.1 mrg
1826 1.1 mrg for (tree amats = DECL_ATTRIBUTES (alloc_decl);
1827 1.1 mrg (amats = lookup_attribute ("malloc", amats));
1828 1.1 mrg amats = TREE_CHAIN (amats))
1829 1.1 mrg {
1830 1.1 mrg tree args = TREE_VALUE (amats);
1831 1.1 mrg if (!args)
1832 1.1 mrg continue;
1833 1.1 mrg
1834 1.1 mrg tree fndecl = TREE_VALUE (args);
1835 1.1 mrg if (!fndecl || !DECL_P (fndecl))
1836 1.1 mrg continue;
1837 1.1 mrg
1838 1.1 mrg if (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
1839 1.1 mrg && dealloc_code == DECL_FUNCTION_CODE (fndecl))
1840 1.1 mrg return true;
1841 1.1 mrg }
1842 1.1 mrg }
1843 1.1 mrg
1844 1.1 mrg const bool alloc_builtin = fndecl_built_in_p (alloc_decl, BUILT_IN_NORMAL);
1845 1.1 mrg alloc_kind_t realloc_dealloc_kind = alloc_kind_t::none;
1846 1.1 mrg
1847 1.1 mrg /* If DEALLOC_DECL has an internal "*dealloc" attribute scan the list
1848 1.1 mrg of its associated allocation functions for ALLOC_DECL.
1849 1.1 mrg If the corresponding ALLOC_DECL is found they're a matching pair,
1850 1.1 mrg otherwise they're not.
1851 1.1 mrg With DDATS set to the Deallocator's *Dealloc ATtributes... */
1852 1.1 mrg for (tree ddats = DECL_ATTRIBUTES (dealloc_decl);
1853 1.1 mrg (ddats = lookup_attribute ("*dealloc", ddats));
1854 1.1 mrg ddats = TREE_CHAIN (ddats))
1855 1.1 mrg {
1856 1.1 mrg tree args = TREE_VALUE (ddats);
1857 1.1 mrg if (!args)
1858 1.1 mrg continue;
1859 1.1 mrg
1860 1.1 mrg tree alloc = TREE_VALUE (args);
1861 1.1 mrg if (!alloc)
1862 1.1 mrg continue;
1863 1.1 mrg
1864 1.1 mrg if (alloc == DECL_NAME (dealloc_decl))
1865 1.1 mrg realloc_kind = alloc_kind_t::user;
1866 1.1 mrg
1867 1.1 mrg if (DECL_P (alloc))
1868 1.1 mrg {
1869 1.1 mrg gcc_checking_assert (fndecl_built_in_p (alloc, BUILT_IN_NORMAL));
1870 1.1 mrg
1871 1.1 mrg switch (DECL_FUNCTION_CODE (alloc))
1872 1.1 mrg {
1873 1.1 mrg case BUILT_IN_ALIGNED_ALLOC:
1874 1.1 mrg case BUILT_IN_CALLOC:
1875 1.1 mrg case BUILT_IN_GOMP_ALLOC:
1876 1.1 mrg case BUILT_IN_MALLOC:
1877 1.1 mrg case BUILT_IN_REALLOC:
1878 1.1 mrg case BUILT_IN_STRDUP:
1879 1.1 mrg case BUILT_IN_STRNDUP:
1880 1.1 mrg realloc_dealloc_kind = alloc_kind_t::builtin;
1881 1.1 mrg break;
1882 1.1 mrg default:
1883 1.1 mrg break;
1884 1.1 mrg }
1885 1.1 mrg
1886 1.1 mrg if (!alloc_builtin)
1887 1.1 mrg continue;
1888 1.1 mrg
1889 1.1 mrg if (DECL_FUNCTION_CODE (alloc) != DECL_FUNCTION_CODE (alloc_decl))
1890 1.1 mrg continue;
1891 1.1 mrg
1892 1.1 mrg return true;
1893 1.1 mrg }
1894 1.1 mrg
1895 1.1 mrg if (alloc == DECL_NAME (alloc_decl))
1896 1.1 mrg return true;
1897 1.1 mrg }
1898 1.1 mrg
1899 1.1 mrg if (realloc_kind == alloc_kind_t::none)
1900 1.1 mrg return false;
1901 1.1 mrg
1902 1.1 mrg hash_set<tree> common_deallocs;
1903 1.1 mrg /* Special handling for deallocators. Iterate over both the allocator's
1904 1.1 mrg and the reallocator's associated deallocator functions looking for
1905 1.1 mrg the first one in common. If one is found, the de/reallocator is
1906 1.1 mrg a match for the allocator even though the latter isn't directly
1907 1.1 mrg associated with the former. This simplifies declarations in system
1908 1.1 mrg headers.
1909 1.1 mrg With AMATS set to the Allocator's Malloc ATtributes,
1910 1.1 mrg and RMATS set to Reallocator's Malloc ATtributes... */
1911 1.1 mrg for (tree amats = DECL_ATTRIBUTES (alloc_decl);
1912 1.1 mrg (amats = lookup_attribute ("malloc", amats));
1913 1.1 mrg amats = amats ? TREE_CHAIN (amats) : NULL_TREE)
1914 1.1 mrg if (tree args = amats ? TREE_VALUE (amats) : NULL_TREE)
1915 1.1 mrg if (tree adealloc = TREE_VALUE (args))
1916 1.1 mrg {
1917 1.1 mrg if (DECL_P (adealloc)
1918 1.1 mrg && fndecl_built_in_p (adealloc, BUILT_IN_NORMAL))
1919 1.1 mrg {
1920 1.1 mrg built_in_function fncode = DECL_FUNCTION_CODE (adealloc);
1921 1.1 mrg if (fncode == BUILT_IN_FREE || fncode == BUILT_IN_REALLOC)
1922 1.1 mrg {
1923 1.1 mrg if (realloc_kind == alloc_kind_t::builtin)
1924 1.1 mrg return true;
1925 1.1 mrg alloc_dealloc_kind = alloc_kind_t::builtin;
1926 1.1 mrg }
1927 1.1 mrg continue;
1928 1.1 mrg }
1929 1.1 mrg
1930 1.1 mrg common_deallocs.add (adealloc);
1931 1.1 mrg }
1932 1.1 mrg for (tree rmats = DECL_ATTRIBUTES (dealloc_decl);
1933 1.1 mrg (rmats = lookup_attribute ("malloc", rmats));
1934 1.1 mrg rmats = rmats ? TREE_CHAIN (rmats) : NULL_TREE)
1935 1.1 mrg if (tree args = rmats ? TREE_VALUE (rmats) : NULL_TREE)
1936 1.1 mrg if (tree ddealloc = TREE_VALUE (args))
1937 1.1 mrg {
1938 1.1 mrg if (DECL_P (ddealloc)
1939 1.1 mrg && fndecl_built_in_p (ddealloc, BUILT_IN_NORMAL))
1940 1.1 mrg {
1941 1.1 mrg built_in_function fncode = DECL_FUNCTION_CODE (ddealloc);
1942 1.1 mrg if (fncode == BUILT_IN_FREE || fncode == BUILT_IN_REALLOC)
1943 1.1 mrg {
1944 1.1 mrg if (alloc_dealloc_kind == alloc_kind_t::builtin)
1945 1.1 mrg return true;
1946 1.1 mrg realloc_dealloc_kind = alloc_kind_t::builtin;
1947 1.1 mrg }
1948 1.1 mrg continue;
1949 1.1 mrg }
1950 1.1 mrg
1951 1.1 mrg if (common_deallocs.contains (ddealloc))
1952 1.1 mrg return true;
1953 1.1 mrg }
1954 1.1 mrg
1955 1.1 mrg /* Succeed only if ALLOC_DECL and the reallocator DEALLOC_DECL share
1956 1.1 mrg a built-in deallocator. */
1957 1.1 mrg return (alloc_dealloc_kind == alloc_kind_t::builtin
1958 1.1 mrg && realloc_dealloc_kind == alloc_kind_t::builtin);
1959 1.1 mrg }
1960 1.1 mrg
1961 1.1 mrg /* Return true if DEALLOC_DECL is a function suitable to deallocate
1962 1.1 mrg objects allocated by the ALLOC call. */
1963 1.1 mrg
1964 1.1 mrg static bool
1965 1.1 mrg matching_alloc_calls_p (gimple *alloc, tree dealloc_decl)
1966 1.1 mrg {
1967 1.1 mrg tree alloc_decl = gimple_call_fndecl (alloc);
1968 1.1 mrg if (!alloc_decl)
1969 1.1 mrg return true;
1970 1.1 mrg
1971 1.1 mrg return matching_alloc_calls_p (alloc_decl, dealloc_decl);
1972 1.1 mrg }
1973 1.1 mrg
1974 1.1 mrg /* Diagnose a call EXP to deallocate a pointer referenced by AREF if it
1975 1.1 mrg includes a nonzero offset. Such a pointer cannot refer to the beginning
1976 1.1 mrg of an allocated object. A negative offset may refer to it only if
1977 1.1 mrg the target pointer is unknown. */
1978 1.1 mrg
1979 1.1 mrg static bool
1980 1.1 mrg warn_dealloc_offset (location_t loc, gimple *call, const access_ref &aref)
1981 1.1 mrg {
1982 1.1 mrg if (aref.deref || aref.offrng[0] <= 0 || aref.offrng[1] <= 0)
1983 1.1 mrg return false;
1984 1.1 mrg
1985 1.1 mrg tree dealloc_decl = gimple_call_fndecl (call);
1986 1.1 mrg if (!dealloc_decl)
1987 1.1 mrg return false;
1988 1.1 mrg
1989 1.1 mrg if (DECL_IS_OPERATOR_DELETE_P (dealloc_decl)
1990 1.1 mrg && !DECL_IS_REPLACEABLE_OPERATOR (dealloc_decl))
1991 1.1 mrg {
1992 1.1 mrg /* A call to a user-defined operator delete with a pointer plus offset
1993 1.1 mrg may be valid if it's returned from an unknown function (i.e., one
1994 1.1 mrg that's not operator new). */
1995 1.1 mrg if (TREE_CODE (aref.ref) == SSA_NAME)
1996 1.1 mrg {
1997 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (aref.ref);
1998 1.1 mrg if (is_gimple_call (def_stmt))
1999 1.1 mrg {
2000 1.1 mrg tree alloc_decl = gimple_call_fndecl (def_stmt);
2001 1.1 mrg if (!alloc_decl || !DECL_IS_OPERATOR_NEW_P (alloc_decl))
2002 1.1 mrg return false;
2003 1.1 mrg }
2004 1.1 mrg }
2005 1.1 mrg }
2006 1.1 mrg
2007 1.1 mrg char offstr[80];
2008 1.1 mrg offstr[0] = '\0';
2009 1.1 mrg if (wi::fits_shwi_p (aref.offrng[0]))
2010 1.1 mrg {
2011 1.1 mrg if (aref.offrng[0] == aref.offrng[1]
2012 1.1 mrg || !wi::fits_shwi_p (aref.offrng[1]))
2013 1.1 mrg sprintf (offstr, " %lli",
2014 1.1 mrg (long long)aref.offrng[0].to_shwi ());
2015 1.1 mrg else
2016 1.1 mrg sprintf (offstr, " [%lli, %lli]",
2017 1.1 mrg (long long)aref.offrng[0].to_shwi (),
2018 1.1 mrg (long long)aref.offrng[1].to_shwi ());
2019 1.1 mrg }
2020 1.1 mrg
2021 1.1 mrg if (!warning_at (loc, OPT_Wfree_nonheap_object,
2022 1.1 mrg "%qD called on pointer %qE with nonzero offset%s",
2023 1.1 mrg dealloc_decl, aref.ref, offstr))
2024 1.1 mrg return false;
2025 1.1 mrg
2026 1.1 mrg if (DECL_P (aref.ref))
2027 1.1 mrg inform (get_location (aref.ref), "declared here");
2028 1.1 mrg else if (TREE_CODE (aref.ref) == SSA_NAME)
2029 1.1 mrg {
2030 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (aref.ref);
2031 1.1 mrg if (is_gimple_call (def_stmt))
2032 1.1 mrg {
2033 1.1 mrg location_t def_loc = get_location (def_stmt);
2034 1.1 mrg tree alloc_decl = gimple_call_fndecl (def_stmt);
2035 1.1 mrg if (alloc_decl)
2036 1.1 mrg inform (def_loc,
2037 1.1 mrg "returned from %qD", alloc_decl);
2038 1.1 mrg else if (tree alloc_fntype = gimple_call_fntype (def_stmt))
2039 1.1 mrg inform (def_loc,
2040 1.1 mrg "returned from %qT", alloc_fntype);
2041 1.1 mrg else
2042 1.1 mrg inform (def_loc, "obtained here");
2043 1.1 mrg }
2044 1.1 mrg }
2045 1.1 mrg
2046 1.1 mrg return true;
2047 1.1 mrg }
2048 1.1 mrg
2049 1.1 mrg namespace {
2050 1.1 mrg
2051 1.1 mrg const pass_data pass_data_waccess = {
2052 1.1 mrg GIMPLE_PASS,
2053 1.1 mrg "waccess",
2054 1.1 mrg OPTGROUP_NONE,
2055 1.1 mrg TV_WARN_ACCESS, /* timer variable */
2056 1.1 mrg PROP_cfg, /* properties_required */
2057 1.1 mrg 0, /* properties_provided */
2058 1.1 mrg 0, /* properties_destroyed */
2059 1.1 mrg 0, /* properties_start */
2060 1.1 mrg 0, /* properties_finish */
2061 1.1 mrg };
2062 1.1 mrg
2063 1.1 mrg /* Pass to detect invalid accesses. */
2064 1.1 mrg class pass_waccess : public gimple_opt_pass
2065 1.1 mrg {
2066 1.1 mrg public:
2067 1.1 mrg pass_waccess (gcc::context *);
2068 1.1 mrg
2069 1.1 mrg ~pass_waccess ();
2070 1.1 mrg
2071 1.1 mrg opt_pass *clone ();
2072 1.1 mrg
2073 1.1 mrg virtual bool gate (function *);
2074 1.1 mrg
2075 1.1 mrg void set_pass_param (unsigned, bool);
2076 1.1 mrg
2077 1.1 mrg virtual unsigned int execute (function *);
2078 1.1 mrg
2079 1.1 mrg private:
2080 1.1 mrg /* Not copyable or assignable. */
2081 1.1 mrg pass_waccess (pass_waccess &) = delete;
2082 1.1 mrg void operator= (pass_waccess &) = delete;
2083 1.1 mrg
2084 1.1 mrg /* Check a call to an atomic built-in function. */
2085 1.1 mrg bool check_atomic_builtin (gcall *);
2086 1.1 mrg
2087 1.1 mrg /* Check a call to a built-in function. */
2088 1.1 mrg bool check_builtin (gcall *);
2089 1.1 mrg
2090 1.1 mrg /* Check a call to an ordinary function for invalid accesses. */
2091 1.1 mrg bool check_call_access (gcall *);
2092 1.1 mrg
2093 1.1 mrg /* Check a non-call statement. */
2094 1.1 mrg void check_stmt (gimple *);
2095 1.1 mrg
2096 1.1 mrg /* Check statements in a basic block. */
2097 1.1 mrg void check_block (basic_block);
2098 1.1 mrg
2099 1.1 mrg /* Check a call to a function. */
2100 1.1 mrg void check_call (gcall *);
2101 1.1 mrg
2102 1.1 mrg /* Check a call to the named built-in function. */
2103 1.1 mrg void check_alloca (gcall *);
2104 1.1 mrg void check_alloc_size_call (gcall *);
2105 1.1 mrg void check_strcat (gcall *);
2106 1.1 mrg void check_strncat (gcall *);
2107 1.1 mrg void check_stxcpy (gcall *);
2108 1.1 mrg void check_stxncpy (gcall *);
2109 1.1 mrg void check_strncmp (gcall *);
2110 1.1 mrg void check_memop_access (gimple *, tree, tree, tree);
2111 1.1 mrg void check_read_access (gimple *, tree, tree = NULL_TREE, int = 1);
2112 1.1 mrg
2113 1.1 mrg void maybe_check_dealloc_call (gcall *);
2114 1.1 mrg void maybe_check_access_sizes (rdwr_map *, tree, tree, gimple *);
2115 1.1 mrg bool maybe_warn_memmodel (gimple *, tree, tree, const unsigned char *);
2116 1.1 mrg void check_atomic_memmodel (gimple *, tree, tree, const unsigned char *);
2117 1.1 mrg
2118 1.1 mrg /* Check for uses of indeterminate pointers. */
2119 1.1 mrg void check_pointer_uses (gimple *, tree, tree = NULL_TREE, bool = false);
2120 1.1 mrg
2121 1.1 mrg /* Return the argument that a call returns. */
2122 1.1 mrg tree gimple_call_return_arg (gcall *);
2123 1.1 mrg
2124 1.1 mrg /* Check a call for uses of a dangling pointer arguments. */
2125 1.1 mrg void check_call_dangling (gcall *);
2126 1.1 mrg
2127 1.1 mrg /* Check uses of a dangling pointer or those derived from it. */
2128 1.1 mrg void check_dangling_uses (tree, tree, bool = false, bool = false);
2129 1.1 mrg void check_dangling_uses ();
2130 1.1 mrg void check_dangling_stores ();
2131 1.1 mrg void check_dangling_stores (basic_block, hash_set<tree> &, auto_bitmap &);
2132 1.1 mrg
2133 1.1 mrg void warn_invalid_pointer (tree, gimple *, gimple *, tree, bool, bool = false);
2134 1.1 mrg
2135 1.1 mrg /* Return true if use follows an invalidating statement. */
2136 1.1 mrg bool use_after_inval_p (gimple *, gimple *, bool = false);
2137 1.1 mrg
2138 1.1 mrg /* A pointer_query object to store information about pointers and
2139 1.1 mrg their targets in. */
2140 1.1 mrg pointer_query m_ptr_qry;
2141 1.1 mrg /* Mapping from DECLs and their clobber statements in the function. */
2142 1.1 mrg hash_map<tree, gimple *> m_clobbers;
2143 1.1 mrg /* A bit is set for each basic block whose statements have been assigned
2144 1.1 mrg valid UIDs. */
2145 1.1 mrg bitmap m_bb_uids_set;
2146 1.1 mrg /* The current function. */
2147 1.1 mrg function *m_func;
2148 1.1 mrg /* True to run checks for uses of dangling pointers. */
2149 1.1 mrg bool m_check_dangling_p;
2150 1.1 mrg /* True to run checks early on in the optimization pipeline. */
2151 1.1 mrg bool m_early_checks_p;
2152 1.1 mrg };
2153 1.1 mrg
2154 1.1 mrg /* Construct the pass. */
2155 1.1 mrg
2156 1.1 mrg pass_waccess::pass_waccess (gcc::context *ctxt)
2157 1.1 mrg : gimple_opt_pass (pass_data_waccess, ctxt),
2158 1.1 mrg m_ptr_qry (NULL),
2159 1.1 mrg m_clobbers (),
2160 1.1 mrg m_bb_uids_set (),
2161 1.1 mrg m_func (),
2162 1.1 mrg m_check_dangling_p (),
2163 1.1 mrg m_early_checks_p ()
2164 1.1 mrg {
2165 1.1 mrg }
2166 1.1 mrg
2167 1.1 mrg /* Return a copy of the pass with RUN_NUMBER one greater than THIS. */
2168 1.1 mrg
2169 1.1 mrg opt_pass*
2170 1.1 mrg pass_waccess::clone ()
2171 1.1 mrg {
2172 1.1 mrg return new pass_waccess (m_ctxt);
2173 1.1 mrg }
2174 1.1 mrg
2175 1.1 mrg /* Release pointer_query cache. */
2176 1.1 mrg
2177 1.1 mrg pass_waccess::~pass_waccess ()
2178 1.1 mrg {
2179 1.1 mrg m_ptr_qry.flush_cache ();
2180 1.1 mrg }
2181 1.1 mrg
2182 1.1 mrg void
2183 1.1 mrg pass_waccess::set_pass_param (unsigned int n, bool early)
2184 1.1 mrg {
2185 1.1 mrg gcc_assert (n == 0);
2186 1.1 mrg
2187 1.1 mrg m_early_checks_p = early;
2188 1.1 mrg }
2189 1.1 mrg
2190 1.1 mrg /* Return true when any checks performed by the pass are enabled. */
2191 1.1 mrg
2192 1.1 mrg bool
2193 1.1 mrg pass_waccess::gate (function *)
2194 1.1 mrg {
2195 1.1 mrg return (warn_free_nonheap_object
2196 1.1 mrg || warn_mismatched_alloc
2197 1.1 mrg || warn_mismatched_new_delete);
2198 1.1 mrg }
2199 1.1 mrg
2200 1.1 mrg /* Initialize ALLOC_OBJECT_SIZE_LIMIT based on the -Walloc-size-larger-than=
2201 1.1 mrg setting if the option is specified, or to the maximum object size if it
2202 1.1 mrg is not. Return the initialized value. */
2203 1.1 mrg
2204 1.1 mrg static tree
2205 1.1 mrg alloc_max_size (void)
2206 1.1 mrg {
2207 1.1 mrg HOST_WIDE_INT limit = warn_alloc_size_limit;
2208 1.1 mrg if (limit == HOST_WIDE_INT_MAX)
2209 1.1 mrg limit = tree_to_shwi (TYPE_MAX_VALUE (ptrdiff_type_node));
2210 1.1 mrg
2211 1.1 mrg return build_int_cst (size_type_node, limit);
2212 1.1 mrg }
2213 1.1 mrg
2214 1.1 mrg /* Diagnose a call EXP to function FN decorated with attribute alloc_size
2215 1.1 mrg whose argument numbers given by IDX with values given by ARGS exceed
2216 1.1 mrg the maximum object size or cause an unsigned overflow (wrapping) when
2217 1.1 mrg multiplied. FN is null when EXP is a call via a function pointer.
2218 1.1 mrg When ARGS[0] is null the function does nothing. ARGS[1] may be null
2219 1.1 mrg for functions like malloc, and non-null for those like calloc that
2220 1.1 mrg are decorated with a two-argument attribute alloc_size. */
2221 1.1 mrg
2222 1.1 mrg void
2223 1.1 mrg maybe_warn_alloc_args_overflow (gimple *stmt, const tree args[2],
2224 1.1 mrg const int idx[2])
2225 1.1 mrg {
2226 1.1 mrg /* The range each of the (up to) two arguments is known to be in. */
2227 1.1 mrg tree argrange[2][2] = { { NULL_TREE, NULL_TREE }, { NULL_TREE, NULL_TREE } };
2228 1.1 mrg
2229 1.1 mrg /* Maximum object size set by -Walloc-size-larger-than= or SIZE_MAX / 2. */
2230 1.1 mrg tree maxobjsize = alloc_max_size ();
2231 1.1 mrg
2232 1.1 mrg location_t loc = get_location (stmt);
2233 1.1 mrg
2234 1.1 mrg tree fn = gimple_call_fndecl (stmt);
2235 1.1 mrg tree fntype = fn ? TREE_TYPE (fn) : gimple_call_fntype (stmt);
2236 1.1 mrg bool warned = false;
2237 1.1 mrg
2238 1.1 mrg /* Validate each argument individually. */
2239 1.1 mrg for (unsigned i = 0; i != 2 && args[i]; ++i)
2240 1.1 mrg {
2241 1.1 mrg if (TREE_CODE (args[i]) == INTEGER_CST)
2242 1.1 mrg {
2243 1.1 mrg argrange[i][0] = args[i];
2244 1.1 mrg argrange[i][1] = args[i];
2245 1.1 mrg
2246 1.1 mrg if (tree_int_cst_lt (args[i], integer_zero_node))
2247 1.1 mrg {
2248 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2249 1.1 mrg "argument %i value %qE is negative",
2250 1.1 mrg idx[i] + 1, args[i]);
2251 1.1 mrg }
2252 1.1 mrg else if (integer_zerop (args[i]))
2253 1.1 mrg {
2254 1.1 mrg /* Avoid issuing -Walloc-zero for allocation functions other
2255 1.1 mrg than __builtin_alloca that are declared with attribute
2256 1.1 mrg returns_nonnull because there's no portability risk. This
2257 1.1 mrg avoids warning for such calls to libiberty's xmalloc and
2258 1.1 mrg friends.
2259 1.1 mrg Also avoid issuing the warning for calls to function named
2260 1.1 mrg "alloca". */
2261 1.1 mrg if (fn && fndecl_built_in_p (fn, BUILT_IN_ALLOCA)
2262 1.1 mrg ? IDENTIFIER_LENGTH (DECL_NAME (fn)) != 6
2263 1.1 mrg : !lookup_attribute ("returns_nonnull",
2264 1.1 mrg TYPE_ATTRIBUTES (fntype)))
2265 1.1 mrg warned = warning_at (loc, OPT_Walloc_zero,
2266 1.1 mrg "argument %i value is zero",
2267 1.1 mrg idx[i] + 1);
2268 1.1 mrg }
2269 1.1 mrg else if (tree_int_cst_lt (maxobjsize, args[i]))
2270 1.1 mrg {
2271 1.1 mrg /* G++ emits calls to ::operator new[](SIZE_MAX) in C++98
2272 1.1 mrg mode and with -fno-exceptions as a way to indicate array
2273 1.1 mrg size overflow. There's no good way to detect C++98 here
2274 1.1 mrg so avoid diagnosing these calls for all C++ modes. */
2275 1.1 mrg if (i == 0
2276 1.1 mrg && fn
2277 1.1 mrg && !args[1]
2278 1.1 mrg && lang_GNU_CXX ()
2279 1.1 mrg && DECL_IS_OPERATOR_NEW_P (fn)
2280 1.1 mrg && integer_all_onesp (args[i]))
2281 1.1 mrg continue;
2282 1.1 mrg
2283 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2284 1.1 mrg "argument %i value %qE exceeds "
2285 1.1 mrg "maximum object size %E",
2286 1.1 mrg idx[i] + 1, args[i], maxobjsize);
2287 1.1 mrg }
2288 1.1 mrg }
2289 1.1 mrg else if (TREE_CODE (args[i]) == SSA_NAME
2290 1.1 mrg && get_size_range (args[i], argrange[i]))
2291 1.1 mrg {
2292 1.1 mrg /* Verify that the argument's range is not negative (including
2293 1.1 mrg upper bound of zero). */
2294 1.1 mrg if (tree_int_cst_lt (argrange[i][0], integer_zero_node)
2295 1.1 mrg && tree_int_cst_le (argrange[i][1], integer_zero_node))
2296 1.1 mrg {
2297 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2298 1.1 mrg "argument %i range [%E, %E] is negative",
2299 1.1 mrg idx[i] + 1,
2300 1.1 mrg argrange[i][0], argrange[i][1]);
2301 1.1 mrg }
2302 1.1 mrg else if (tree_int_cst_lt (maxobjsize, argrange[i][0]))
2303 1.1 mrg {
2304 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2305 1.1 mrg "argument %i range [%E, %E] exceeds "
2306 1.1 mrg "maximum object size %E",
2307 1.1 mrg idx[i] + 1,
2308 1.1 mrg argrange[i][0], argrange[i][1],
2309 1.1 mrg maxobjsize);
2310 1.1 mrg }
2311 1.1 mrg }
2312 1.1 mrg }
2313 1.1 mrg
2314 1.1 mrg if (!argrange[0][0])
2315 1.1 mrg return;
2316 1.1 mrg
2317 1.1 mrg /* For a two-argument alloc_size, validate the product of the two
2318 1.1 mrg arguments if both of their values or ranges are known. */
2319 1.1 mrg if (!warned && tree_fits_uhwi_p (argrange[0][0])
2320 1.1 mrg && argrange[1][0] && tree_fits_uhwi_p (argrange[1][0])
2321 1.1 mrg && !integer_onep (argrange[0][0])
2322 1.1 mrg && !integer_onep (argrange[1][0]))
2323 1.1 mrg {
2324 1.1 mrg /* Check for overflow in the product of a function decorated with
2325 1.1 mrg attribute alloc_size (X, Y). */
2326 1.1 mrg unsigned szprec = TYPE_PRECISION (size_type_node);
2327 1.1 mrg wide_int x = wi::to_wide (argrange[0][0], szprec);
2328 1.1 mrg wide_int y = wi::to_wide (argrange[1][0], szprec);
2329 1.1 mrg
2330 1.1 mrg wi::overflow_type vflow;
2331 1.1 mrg wide_int prod = wi::umul (x, y, &vflow);
2332 1.1 mrg
2333 1.1 mrg if (vflow)
2334 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2335 1.1 mrg "product %<%E * %E%> of arguments %i and %i "
2336 1.1 mrg "exceeds %<SIZE_MAX%>",
2337 1.1 mrg argrange[0][0], argrange[1][0],
2338 1.1 mrg idx[0] + 1, idx[1] + 1);
2339 1.1 mrg else if (wi::ltu_p (wi::to_wide (maxobjsize, szprec), prod))
2340 1.1 mrg warned = warning_at (loc, OPT_Walloc_size_larger_than_,
2341 1.1 mrg "product %<%E * %E%> of arguments %i and %i "
2342 1.1 mrg "exceeds maximum object size %E",
2343 1.1 mrg argrange[0][0], argrange[1][0],
2344 1.1 mrg idx[0] + 1, idx[1] + 1,
2345 1.1 mrg maxobjsize);
2346 1.1 mrg
2347 1.1 mrg if (warned)
2348 1.1 mrg {
2349 1.1 mrg /* Print the full range of each of the two arguments to make
2350 1.1 mrg it clear when it is, in fact, in a range and not constant. */
2351 1.1 mrg if (argrange[0][0] != argrange [0][1])
2352 1.1 mrg inform (loc, "argument %i in the range [%E, %E]",
2353 1.1 mrg idx[0] + 1, argrange[0][0], argrange[0][1]);
2354 1.1 mrg if (argrange[1][0] != argrange [1][1])
2355 1.1 mrg inform (loc, "argument %i in the range [%E, %E]",
2356 1.1 mrg idx[1] + 1, argrange[1][0], argrange[1][1]);
2357 1.1 mrg }
2358 1.1 mrg }
2359 1.1 mrg
2360 1.1 mrg if (warned && fn)
2361 1.1 mrg {
2362 1.1 mrg location_t fnloc = DECL_SOURCE_LOCATION (fn);
2363 1.1 mrg
2364 1.1 mrg if (DECL_IS_UNDECLARED_BUILTIN (fn))
2365 1.1 mrg inform (loc,
2366 1.1 mrg "in a call to built-in allocation function %qD", fn);
2367 1.1 mrg else
2368 1.1 mrg inform (fnloc,
2369 1.1 mrg "in a call to allocation function %qD declared here", fn);
2370 1.1 mrg }
2371 1.1 mrg }
2372 1.1 mrg
2373 1.1 mrg /* Check a call to an alloca function for an excessive size. */
2374 1.1 mrg
2375 1.1 mrg void
2376 1.1 mrg pass_waccess::check_alloca (gcall *stmt)
2377 1.1 mrg {
2378 1.1 mrg if (m_early_checks_p)
2379 1.1 mrg return;
2380 1.1 mrg
2381 1.1 mrg if ((warn_vla_limit >= HOST_WIDE_INT_MAX
2382 1.1 mrg && warn_alloc_size_limit < warn_vla_limit)
2383 1.1 mrg || (warn_alloca_limit >= HOST_WIDE_INT_MAX
2384 1.1 mrg && warn_alloc_size_limit < warn_alloca_limit))
2385 1.1 mrg {
2386 1.1 mrg /* -Walloca-larger-than and -Wvla-larger-than settings of less
2387 1.1 mrg than HWI_MAX override the more general -Walloc-size-larger-than
2388 1.1 mrg so unless either of the former options is smaller than the last
2389 1.1 mrg one (which would imply that the call was already checked), check
2390 1.1 mrg the alloca arguments for overflow. */
2391 1.1 mrg const tree alloc_args[] = { call_arg (stmt, 0), NULL_TREE };
2392 1.1 mrg const int idx[] = { 0, -1 };
2393 1.1 mrg maybe_warn_alloc_args_overflow (stmt, alloc_args, idx);
2394 1.1 mrg }
2395 1.1 mrg }
2396 1.1 mrg
2397 1.1 mrg /* Check a call to an allocation function for an excessive size. */
2398 1.1 mrg
2399 1.1 mrg void
2400 1.1 mrg pass_waccess::check_alloc_size_call (gcall *stmt)
2401 1.1 mrg {
2402 1.1 mrg if (m_early_checks_p)
2403 1.1 mrg return;
2404 1.1 mrg
2405 1.1 mrg if (gimple_call_num_args (stmt) < 1)
2406 1.1 mrg /* Avoid invalid calls to functions without a prototype. */
2407 1.1 mrg return;
2408 1.1 mrg
2409 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
2410 1.1 mrg if (fndecl && gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
2411 1.1 mrg {
2412 1.1 mrg /* Alloca is handled separately. */
2413 1.1 mrg switch (DECL_FUNCTION_CODE (fndecl))
2414 1.1 mrg {
2415 1.1 mrg case BUILT_IN_ALLOCA:
2416 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN:
2417 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX:
2418 1.1 mrg return;
2419 1.1 mrg default:
2420 1.1 mrg break;
2421 1.1 mrg }
2422 1.1 mrg }
2423 1.1 mrg
2424 1.1 mrg tree fntype = gimple_call_fntype (stmt);
2425 1.1 mrg tree fntypeattrs = TYPE_ATTRIBUTES (fntype);
2426 1.1 mrg
2427 1.1 mrg tree alloc_size = lookup_attribute ("alloc_size", fntypeattrs);
2428 1.1 mrg if (!alloc_size)
2429 1.1 mrg return;
2430 1.1 mrg
2431 1.1 mrg /* Extract attribute alloc_size from the type of the called expression
2432 1.1 mrg (which could be a function or a function pointer) and if set, store
2433 1.1 mrg the indices of the corresponding arguments in ALLOC_IDX, and then
2434 1.1 mrg the actual argument(s) at those indices in ALLOC_ARGS. */
2435 1.1 mrg int idx[2] = { -1, -1 };
2436 1.1 mrg tree alloc_args[] = { NULL_TREE, NULL_TREE };
2437 1.1 mrg unsigned nargs = gimple_call_num_args (stmt);
2438 1.1 mrg
2439 1.1 mrg tree args = TREE_VALUE (alloc_size);
2440 1.1 mrg idx[0] = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
2441 1.1 mrg /* Avoid invalid calls to functions without a prototype. */
2442 1.1 mrg if ((unsigned) idx[0] >= nargs)
2443 1.1 mrg return;
2444 1.1 mrg alloc_args[0] = call_arg (stmt, idx[0]);
2445 1.1 mrg if (TREE_CHAIN (args))
2446 1.1 mrg {
2447 1.1 mrg idx[1] = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
2448 1.1 mrg if ((unsigned) idx[1] >= nargs)
2449 1.1 mrg return;
2450 1.1 mrg alloc_args[1] = call_arg (stmt, idx[1]);
2451 1.1 mrg }
2452 1.1 mrg
2453 1.1 mrg maybe_warn_alloc_args_overflow (stmt, alloc_args, idx);
2454 1.1 mrg }
2455 1.1 mrg
2456 1.1 mrg /* Check a call STMT to strcat() for overflow and warn if it does. */
2457 1.1 mrg
2458 1.1 mrg void
2459 1.1 mrg pass_waccess::check_strcat (gcall *stmt)
2460 1.1 mrg {
2461 1.1 mrg if (m_early_checks_p)
2462 1.1 mrg return;
2463 1.1 mrg
2464 1.1 mrg if (!warn_stringop_overflow && !warn_stringop_overread)
2465 1.1 mrg return;
2466 1.1 mrg
2467 1.1 mrg tree dest = call_arg (stmt, 0);
2468 1.1 mrg tree src = call_arg (stmt, 1);
2469 1.1 mrg
2470 1.1 mrg /* There is no way here to determine the length of the string in
2471 1.1 mrg the destination to which the SRC string is being appended so
2472 1.1 mrg just diagnose cases when the source string is longer than
2473 1.1 mrg the destination object. */
2474 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_write, NULL_TREE,
2475 1.1 mrg true, NULL_TREE, true);
2476 1.1 mrg const int ost = warn_stringop_overflow ? warn_stringop_overflow - 1 : 1;
2477 1.1 mrg compute_objsize (src, stmt, ost, &data.src, &m_ptr_qry);
2478 1.1 mrg tree destsize = compute_objsize (dest, stmt, ost, &data.dst, &m_ptr_qry);
2479 1.1 mrg
2480 1.1 mrg check_access (stmt, /*dstwrite=*/NULL_TREE, /*maxread=*/NULL_TREE,
2481 1.1 mrg src, destsize, data.mode, &data, m_ptr_qry.rvals);
2482 1.1 mrg }
2483 1.1 mrg
2484 1.1 mrg /* Check a call STMT to strcat() for overflow and warn if it does. */
2485 1.1 mrg
2486 1.1 mrg void
2487 1.1 mrg pass_waccess::check_strncat (gcall *stmt)
2488 1.1 mrg {
2489 1.1 mrg if (m_early_checks_p)
2490 1.1 mrg return;
2491 1.1 mrg
2492 1.1 mrg if (!warn_stringop_overflow && !warn_stringop_overread)
2493 1.1 mrg return;
2494 1.1 mrg
2495 1.1 mrg tree dest = call_arg (stmt, 0);
2496 1.1 mrg tree src = call_arg (stmt, 1);
2497 1.1 mrg /* The upper bound on the number of bytes to write. */
2498 1.1 mrg tree maxread = call_arg (stmt, 2);
2499 1.1 mrg
2500 1.1 mrg /* Detect unterminated source (only). */
2501 1.1 mrg if (!check_nul_terminated_array (stmt, src, maxread))
2502 1.1 mrg return;
2503 1.1 mrg
2504 1.1 mrg /* The length of the source sequence. */
2505 1.1 mrg tree slen = c_strlen (src, 1);
2506 1.1 mrg
2507 1.1 mrg /* Try to determine the range of lengths that the source expression
2508 1.1 mrg refers to. Since the lengths are only used for warning and not
2509 1.1 mrg for code generation disable strict mode below. */
2510 1.1 mrg tree maxlen = slen;
2511 1.1 mrg if (!maxlen)
2512 1.1 mrg {
2513 1.1 mrg c_strlen_data lendata = { };
2514 1.1 mrg get_range_strlen (src, &lendata, /* eltsize = */ 1);
2515 1.1 mrg maxlen = lendata.maxbound;
2516 1.1 mrg }
2517 1.1 mrg
2518 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_write);
2519 1.1 mrg /* Try to verify that the destination is big enough for the shortest
2520 1.1 mrg string. First try to determine the size of the destination object
2521 1.1 mrg into which the source is being copied. */
2522 1.1 mrg const int ost = warn_stringop_overflow - 1;
2523 1.1 mrg tree destsize = compute_objsize (dest, stmt, ost, &data.dst, &m_ptr_qry);
2524 1.1 mrg
2525 1.1 mrg /* Add one for the terminating nul. */
2526 1.1 mrg tree srclen = (maxlen
2527 1.1 mrg ? fold_build2 (PLUS_EXPR, size_type_node, maxlen,
2528 1.1 mrg size_one_node)
2529 1.1 mrg : NULL_TREE);
2530 1.1 mrg
2531 1.1 mrg /* The strncat function copies at most MAXREAD bytes and always appends
2532 1.1 mrg the terminating nul so the specified upper bound should never be equal
2533 1.1 mrg to (or greater than) the size of the destination. */
2534 1.1 mrg if (tree_fits_uhwi_p (maxread) && tree_fits_uhwi_p (destsize)
2535 1.1 mrg && tree_int_cst_equal (destsize, maxread))
2536 1.1 mrg {
2537 1.1 mrg location_t loc = get_location (stmt);
2538 1.1 mrg warning_at (loc, OPT_Wstringop_overflow_,
2539 1.1 mrg "%qD specified bound %E equals destination size",
2540 1.1 mrg get_callee_fndecl (stmt), maxread);
2541 1.1 mrg
2542 1.1 mrg return;
2543 1.1 mrg }
2544 1.1 mrg
2545 1.1 mrg if (!srclen
2546 1.1 mrg || (maxread && tree_fits_uhwi_p (maxread)
2547 1.1 mrg && tree_fits_uhwi_p (srclen)
2548 1.1 mrg && tree_int_cst_lt (maxread, srclen)))
2549 1.1 mrg srclen = maxread;
2550 1.1 mrg
2551 1.1 mrg check_access (stmt, /*dstwrite=*/NULL_TREE, maxread, srclen,
2552 1.1 mrg destsize, data.mode, &data, m_ptr_qry.rvals);
2553 1.1 mrg }
2554 1.1 mrg
2555 1.1 mrg /* Check a call STMT to stpcpy() or strcpy() for overflow and warn
2556 1.1 mrg if it does. */
2557 1.1 mrg
2558 1.1 mrg void
2559 1.1 mrg pass_waccess::check_stxcpy (gcall *stmt)
2560 1.1 mrg {
2561 1.1 mrg if (m_early_checks_p)
2562 1.1 mrg return;
2563 1.1 mrg
2564 1.1 mrg tree dst = call_arg (stmt, 0);
2565 1.1 mrg tree src = call_arg (stmt, 1);
2566 1.1 mrg
2567 1.1 mrg tree size;
2568 1.1 mrg bool exact;
2569 1.1 mrg if (tree nonstr = unterminated_array (src, &size, &exact))
2570 1.1 mrg {
2571 1.1 mrg /* NONSTR refers to the non-nul terminated constant array. */
2572 1.1 mrg warn_string_no_nul (get_location (stmt), stmt, NULL, src, nonstr,
2573 1.1 mrg size, exact);
2574 1.1 mrg return;
2575 1.1 mrg }
2576 1.1 mrg
2577 1.1 mrg if (warn_stringop_overflow)
2578 1.1 mrg {
2579 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_write, NULL_TREE,
2580 1.1 mrg true, NULL_TREE, true);
2581 1.1 mrg const int ost = warn_stringop_overflow ? warn_stringop_overflow - 1 : 1;
2582 1.1 mrg compute_objsize (src, stmt, ost, &data.src, &m_ptr_qry);
2583 1.1 mrg tree dstsize = compute_objsize (dst, stmt, ost, &data.dst, &m_ptr_qry);
2584 1.1 mrg check_access (stmt, /*dstwrite=*/ NULL_TREE,
2585 1.1 mrg /*maxread=*/ NULL_TREE, /*srcstr=*/ src,
2586 1.1 mrg dstsize, data.mode, &data, m_ptr_qry.rvals);
2587 1.1 mrg }
2588 1.1 mrg
2589 1.1 mrg /* Check to see if the argument was declared attribute nonstring
2590 1.1 mrg and if so, issue a warning since at this point it's not known
2591 1.1 mrg to be nul-terminated. */
2592 1.1 mrg tree fndecl = get_callee_fndecl (stmt);
2593 1.1 mrg maybe_warn_nonstring_arg (fndecl, stmt);
2594 1.1 mrg }
2595 1.1 mrg
2596 1.1 mrg /* Check a call STMT to stpncpy() or strncpy() for overflow and warn
2597 1.1 mrg if it does. */
2598 1.1 mrg
2599 1.1 mrg void
2600 1.1 mrg pass_waccess::check_stxncpy (gcall *stmt)
2601 1.1 mrg {
2602 1.1 mrg if (m_early_checks_p || !warn_stringop_overflow)
2603 1.1 mrg return;
2604 1.1 mrg
2605 1.1 mrg tree dst = call_arg (stmt, 0);
2606 1.1 mrg tree src = call_arg (stmt, 1);
2607 1.1 mrg /* The number of bytes to write (not the maximum). */
2608 1.1 mrg tree len = call_arg (stmt, 2);
2609 1.1 mrg
2610 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_write, len, true, len,
2611 1.1 mrg true);
2612 1.1 mrg const int ost = warn_stringop_overflow ? warn_stringop_overflow - 1 : 1;
2613 1.1 mrg compute_objsize (src, stmt, ost, &data.src, &m_ptr_qry);
2614 1.1 mrg tree dstsize = compute_objsize (dst, stmt, ost, &data.dst, &m_ptr_qry);
2615 1.1 mrg
2616 1.1 mrg check_access (stmt, /*dstwrite=*/len, /*maxread=*/len, src, dstsize,
2617 1.1 mrg data.mode, &data, m_ptr_qry.rvals);
2618 1.1 mrg }
2619 1.1 mrg
2620 1.1 mrg /* Check a call STMT to stpncpy() or strncpy() for overflow and warn
2621 1.1 mrg if it does. */
2622 1.1 mrg
2623 1.1 mrg void
2624 1.1 mrg pass_waccess::check_strncmp (gcall *stmt)
2625 1.1 mrg {
2626 1.1 mrg if (m_early_checks_p || !warn_stringop_overread)
2627 1.1 mrg return;
2628 1.1 mrg
2629 1.1 mrg tree arg1 = call_arg (stmt, 0);
2630 1.1 mrg tree arg2 = call_arg (stmt, 1);
2631 1.1 mrg tree bound = call_arg (stmt, 2);
2632 1.1 mrg
2633 1.1 mrg /* First check each argument separately, considering the bound. */
2634 1.1 mrg if (!check_nul_terminated_array (stmt, arg1, bound)
2635 1.1 mrg || !check_nul_terminated_array (stmt, arg2, bound))
2636 1.1 mrg return;
2637 1.1 mrg
2638 1.1 mrg /* A strncmp read from each argument is constrained not just by
2639 1.1 mrg the bound but also by the length of the shorter string. Specifying
2640 1.1 mrg a bound that's larger than the size of either array makes no sense
2641 1.1 mrg and is likely a bug. When the length of neither of the two strings
2642 1.1 mrg is known but the sizes of both of the arrays they are stored in is,
2643 1.1 mrg issue a warning if the bound is larger than the size of
2644 1.1 mrg the larger of the two arrays. */
2645 1.1 mrg
2646 1.1 mrg c_strlen_data lendata1{ }, lendata2{ };
2647 1.1 mrg tree len1 = c_strlen (arg1, 1, &lendata1);
2648 1.1 mrg tree len2 = c_strlen (arg2, 1, &lendata2);
2649 1.1 mrg
2650 1.1 mrg if (len1 && TREE_CODE (len1) != INTEGER_CST)
2651 1.1 mrg len1 = NULL_TREE;
2652 1.1 mrg if (len2 && TREE_CODE (len2) != INTEGER_CST)
2653 1.1 mrg len2 = NULL_TREE;
2654 1.1 mrg
2655 1.1 mrg if (len1 && len2)
2656 1.1 mrg /* If the length of both arguments was computed they must both be
2657 1.1 mrg nul-terminated and no further checking is necessary regardless
2658 1.1 mrg of the bound. */
2659 1.1 mrg return;
2660 1.1 mrg
2661 1.1 mrg /* Check to see if the argument was declared with attribute nonstring
2662 1.1 mrg and if so, issue a warning since at this point it's not known to be
2663 1.1 mrg nul-terminated. */
2664 1.1 mrg if (maybe_warn_nonstring_arg (get_callee_fndecl (stmt), stmt))
2665 1.1 mrg return;
2666 1.1 mrg
2667 1.1 mrg access_data adata1 (m_ptr_qry.rvals, stmt, access_read_only, NULL_TREE, false,
2668 1.1 mrg bound, true);
2669 1.1 mrg access_data adata2 (m_ptr_qry.rvals, stmt, access_read_only, NULL_TREE, false,
2670 1.1 mrg bound, true);
2671 1.1 mrg
2672 1.1 mrg /* Determine the range of the bound first and bail if it fails; it's
2673 1.1 mrg cheaper than computing the size of the objects. */
2674 1.1 mrg tree bndrng[2] = { NULL_TREE, NULL_TREE };
2675 1.1 mrg get_size_range (m_ptr_qry.rvals, bound, stmt, bndrng, adata1.src_bndrng);
2676 1.1 mrg if (!bndrng[0] || integer_zerop (bndrng[0]))
2677 1.1 mrg return;
2678 1.1 mrg
2679 1.1 mrg if (len1 && tree_int_cst_lt (len1, bndrng[0]))
2680 1.1 mrg bndrng[0] = len1;
2681 1.1 mrg if (len2 && tree_int_cst_lt (len2, bndrng[0]))
2682 1.1 mrg bndrng[0] = len2;
2683 1.1 mrg
2684 1.1 mrg /* compute_objsize almost never fails (and ultimately should never
2685 1.1 mrg fail). Don't bother to handle the rare case when it does. */
2686 1.1 mrg if (!compute_objsize (arg1, stmt, 1, &adata1.src, &m_ptr_qry)
2687 1.1 mrg || !compute_objsize (arg2, stmt, 1, &adata2.src, &m_ptr_qry))
2688 1.1 mrg return;
2689 1.1 mrg
2690 1.1 mrg /* Compute the size of the remaining space in each array after
2691 1.1 mrg subtracting any offset into it. */
2692 1.1 mrg offset_int rem1 = adata1.src.size_remaining ();
2693 1.1 mrg offset_int rem2 = adata2.src.size_remaining ();
2694 1.1 mrg
2695 1.1 mrg /* Cap REM1 and REM2 at the other if the other's argument is known
2696 1.1 mrg to be an unterminated array, either because there's no space
2697 1.1 mrg left in it after adding its offset or because it's constant and
2698 1.1 mrg has no nul. */
2699 1.1 mrg if (rem1 == 0 || (rem1 < rem2 && lendata1.decl))
2700 1.1 mrg rem2 = rem1;
2701 1.1 mrg else if (rem2 == 0 || (rem2 < rem1 && lendata2.decl))
2702 1.1 mrg rem1 = rem2;
2703 1.1 mrg
2704 1.1 mrg /* Point PAD at the array to reference in the note if a warning
2705 1.1 mrg is issued. */
2706 1.1 mrg access_data *pad = len1 ? &adata2 : &adata1;
2707 1.1 mrg offset_int maxrem = wi::max (rem1, rem2, UNSIGNED);
2708 1.1 mrg if (lendata1.decl || lendata2.decl
2709 1.1 mrg || maxrem < wi::to_offset (bndrng[0]))
2710 1.1 mrg {
2711 1.1 mrg /* Warn when either argument isn't nul-terminated or the maximum
2712 1.1 mrg remaining space in the two arrays is less than the bound. */
2713 1.1 mrg tree func = get_callee_fndecl (stmt);
2714 1.1 mrg location_t loc = gimple_location (stmt);
2715 1.1 mrg maybe_warn_for_bound (OPT_Wstringop_overread, loc, stmt, func,
2716 1.1 mrg bndrng, wide_int_to_tree (sizetype, maxrem),
2717 1.1 mrg pad);
2718 1.1 mrg }
2719 1.1 mrg }
2720 1.1 mrg
2721 1.1 mrg /* Determine and check the sizes of the source and the destination
2722 1.1 mrg of calls to __builtin_{bzero,memcpy,mempcpy,memset} calls. STMT is
2723 1.1 mrg the call statement, DEST is the destination argument, SRC is the source
2724 1.1 mrg argument or null, and SIZE is the number of bytes being accessed. Use
2725 1.1 mrg Object Size type-0 regardless of the OPT_Wstringop_overflow_ setting.
2726 1.1 mrg Return true on success (no overflow or invalid sizes), false otherwise. */
2727 1.1 mrg
2728 1.1 mrg void
2729 1.1 mrg pass_waccess::check_memop_access (gimple *stmt, tree dest, tree src, tree size)
2730 1.1 mrg {
2731 1.1 mrg if (m_early_checks_p)
2732 1.1 mrg return;
2733 1.1 mrg
2734 1.1 mrg /* For functions like memset and memcpy that operate on raw memory
2735 1.1 mrg try to determine the size of the largest source and destination
2736 1.1 mrg object using type-0 Object Size regardless of the object size
2737 1.1 mrg type specified by the option. */
2738 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_write);
2739 1.1 mrg tree srcsize
2740 1.1 mrg = src ? compute_objsize (src, stmt, 0, &data.src, &m_ptr_qry) : NULL_TREE;
2741 1.1 mrg tree dstsize = compute_objsize (dest, stmt, 0, &data.dst, &m_ptr_qry);
2742 1.1 mrg
2743 1.1 mrg check_access (stmt, size, /*maxread=*/NULL_TREE, srcsize, dstsize,
2744 1.1 mrg data.mode, &data, m_ptr_qry.rvals);
2745 1.1 mrg }
2746 1.1 mrg
2747 1.1 mrg /* A convenience wrapper for check_access to check access by a read-only
2748 1.1 mrg function like puts or strcmp. */
2749 1.1 mrg
2750 1.1 mrg void
2751 1.1 mrg pass_waccess::check_read_access (gimple *stmt, tree src,
2752 1.1 mrg tree bound /* = NULL_TREE */,
2753 1.1 mrg int ost /* = 1 */)
2754 1.1 mrg {
2755 1.1 mrg if (m_early_checks_p || !warn_stringop_overread)
2756 1.1 mrg return;
2757 1.1 mrg
2758 1.1 mrg if (bound && !useless_type_conversion_p (size_type_node, TREE_TYPE (bound)))
2759 1.1 mrg bound = fold_convert (size_type_node, bound);
2760 1.1 mrg
2761 1.1 mrg tree fndecl = get_callee_fndecl (stmt);
2762 1.1 mrg maybe_warn_nonstring_arg (fndecl, stmt);
2763 1.1 mrg
2764 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access_read_only, NULL_TREE,
2765 1.1 mrg false, bound, true);
2766 1.1 mrg compute_objsize (src, stmt, ost, &data.src, &m_ptr_qry);
2767 1.1 mrg check_access (stmt, /*dstwrite=*/ NULL_TREE, /*maxread=*/ bound,
2768 1.1 mrg /*srcstr=*/ src, /*dstsize=*/ NULL_TREE, data.mode,
2769 1.1 mrg &data, m_ptr_qry.rvals);
2770 1.1 mrg }
2771 1.1 mrg
2772 1.1 mrg /* Return true if memory model ORD is constant in the context of STMT and
2773 1.1 mrg set *CSTVAL to the constant value. Otherwise return false. Warn for
2774 1.1 mrg invalid ORD. */
2775 1.1 mrg
2776 1.1 mrg bool
2777 1.1 mrg memmodel_to_uhwi (tree ord, gimple *stmt, unsigned HOST_WIDE_INT *cstval)
2778 1.1 mrg {
2779 1.1 mrg unsigned HOST_WIDE_INT val;
2780 1.1 mrg
2781 1.1 mrg if (TREE_CODE (ord) == INTEGER_CST)
2782 1.1 mrg {
2783 1.1 mrg if (!tree_fits_uhwi_p (ord))
2784 1.1 mrg return false;
2785 1.1 mrg val = tree_to_uhwi (ord);
2786 1.1 mrg }
2787 1.1 mrg else
2788 1.1 mrg {
2789 1.1 mrg /* Use the range query to determine constant values in the absence
2790 1.1 mrg of constant propagation (such as at -O0). */
2791 1.1 mrg value_range rng;
2792 1.1 mrg if (!get_range_query (cfun)->range_of_expr (rng, ord, stmt)
2793 1.1 mrg || !rng.constant_p ()
2794 1.1 mrg || !rng.singleton_p (&ord))
2795 1.1 mrg return false;
2796 1.1 mrg
2797 1.1 mrg wide_int lob = rng.lower_bound ();
2798 1.1 mrg if (!wi::fits_uhwi_p (lob))
2799 1.1 mrg return false;
2800 1.1 mrg
2801 1.1 mrg val = lob.to_shwi ();
2802 1.1 mrg }
2803 1.1 mrg
2804 1.1 mrg if (targetm.memmodel_check)
2805 1.1 mrg /* This might warn for an invalid VAL but return a conservatively
2806 1.1 mrg valid result. */
2807 1.1 mrg val = targetm.memmodel_check (val);
2808 1.1 mrg else if (val & ~MEMMODEL_MASK)
2809 1.1 mrg {
2810 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
2811 1.1 mrg location_t loc = gimple_location (stmt);
2812 1.1 mrg loc = expansion_point_location_if_in_system_header (loc);
2813 1.1 mrg
2814 1.1 mrg warning_at (loc, OPT_Winvalid_memory_model,
2815 1.1 mrg "unknown architecture specifier in memory model "
2816 1.1 mrg "%wi for %qD", val, fndecl);
2817 1.1 mrg return false;
2818 1.1 mrg }
2819 1.1 mrg
2820 1.1 mrg *cstval = val;
2821 1.1 mrg
2822 1.1 mrg return true;
2823 1.1 mrg }
2824 1.1 mrg
2825 1.1 mrg /* Valid memory model for each set of atomic built-in functions. */
2826 1.1 mrg
2827 1.1 mrg struct memmodel_pair
2828 1.1 mrg {
2829 1.1 mrg memmodel modval;
2830 1.1 mrg const char* modname;
2831 1.1 mrg
2832 1.1 mrg #define MEMMODEL_PAIR(val, str) \
2833 1.1 mrg { MEMMODEL_ ## val, "memory_order_" str }
2834 1.1 mrg };
2835 1.1 mrg
2836 1.1 mrg /* Valid memory models in the order of increasing strength. */
2837 1.1 mrg
2838 1.1 mrg static const memmodel_pair memory_models[] =
2839 1.1 mrg { MEMMODEL_PAIR (RELAXED, "relaxed"),
2840 1.1 mrg MEMMODEL_PAIR (SEQ_CST, "seq_cst"),
2841 1.1 mrg MEMMODEL_PAIR (ACQUIRE, "acquire"),
2842 1.1 mrg MEMMODEL_PAIR (CONSUME, "consume"),
2843 1.1 mrg MEMMODEL_PAIR (RELEASE, "release"),
2844 1.1 mrg MEMMODEL_PAIR (ACQ_REL, "acq_rel")
2845 1.1 mrg };
2846 1.1 mrg
2847 1.1 mrg /* Return the name of the memory model VAL. */
2848 1.1 mrg
2849 1.1 mrg static const char*
2850 1.1 mrg memmodel_name (unsigned HOST_WIDE_INT val)
2851 1.1 mrg {
2852 1.1 mrg val = memmodel_base (val);
2853 1.1 mrg
2854 1.1 mrg for (unsigned i = 0; i != sizeof memory_models / sizeof *memory_models; ++i)
2855 1.1 mrg {
2856 1.1 mrg if (val == memory_models[i].modval)
2857 1.1 mrg return memory_models[i].modname;
2858 1.1 mrg }
2859 1.1 mrg return NULL;
2860 1.1 mrg }
2861 1.1 mrg
2862 1.1 mrg /* Indices of valid MEMORY_MODELS above for corresponding atomic operations. */
2863 1.1 mrg static const unsigned char load_models[] = { 0, 1, 2, 3, UCHAR_MAX };
2864 1.1 mrg static const unsigned char store_models[] = { 0, 1, 4, UCHAR_MAX };
2865 1.1 mrg static const unsigned char xchg_models[] = { 0, 1, 3, 4, 5, UCHAR_MAX };
2866 1.1 mrg static const unsigned char flag_clr_models[] = { 0, 1, 4, UCHAR_MAX };
2867 1.1 mrg static const unsigned char all_models[] = { 0, 1, 2, 3, 4, 5, UCHAR_MAX };
2868 1.1 mrg
2869 1.1 mrg /* Check the success memory model argument ORD_SUCS to the call STMT to
2870 1.1 mrg an atomic function and warn if it's invalid. If nonnull, also check
2871 1.1 mrg the failure memory model ORD_FAIL and warn if it's invalid. Return
2872 1.1 mrg true if a warning has been issued. */
2873 1.1 mrg
2874 1.1 mrg bool
2875 1.1 mrg pass_waccess::maybe_warn_memmodel (gimple *stmt, tree ord_sucs,
2876 1.1 mrg tree ord_fail, const unsigned char *valid)
2877 1.1 mrg {
2878 1.1 mrg unsigned HOST_WIDE_INT sucs, fail = 0;
2879 1.1 mrg if (!memmodel_to_uhwi (ord_sucs, stmt, &sucs)
2880 1.1 mrg || (ord_fail && !memmodel_to_uhwi (ord_fail, stmt, &fail)))
2881 1.1 mrg return false;
2882 1.1 mrg
2883 1.1 mrg bool is_valid = false;
2884 1.1 mrg if (valid)
2885 1.1 mrg for (unsigned i = 0; valid[i] != UCHAR_MAX; ++i)
2886 1.1 mrg {
2887 1.1 mrg memmodel model = memory_models[valid[i]].modval;
2888 1.1 mrg if (memmodel_base (sucs) == model)
2889 1.1 mrg {
2890 1.1 mrg is_valid = true;
2891 1.1 mrg break;
2892 1.1 mrg }
2893 1.1 mrg }
2894 1.1 mrg else
2895 1.1 mrg is_valid = true;
2896 1.1 mrg
2897 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
2898 1.1 mrg location_t loc = gimple_location (stmt);
2899 1.1 mrg loc = expansion_point_location_if_in_system_header (loc);
2900 1.1 mrg
2901 1.1 mrg if (!is_valid)
2902 1.1 mrg {
2903 1.1 mrg bool warned = false;
2904 1.1 mrg if (const char *modname = memmodel_name (sucs))
2905 1.1 mrg warned = warning_at (loc, OPT_Winvalid_memory_model,
2906 1.1 mrg "invalid memory model %qs for %qD",
2907 1.1 mrg modname, fndecl);
2908 1.1 mrg else
2909 1.1 mrg warned = warning_at (loc, OPT_Winvalid_memory_model,
2910 1.1 mrg "invalid memory model %wi for %qD",
2911 1.1 mrg sucs, fndecl);
2912 1.1 mrg
2913 1.1 mrg if (!warned)
2914 1.1 mrg return false;
2915 1.1 mrg
2916 1.1 mrg /* Print a note with the valid memory models. */
2917 1.1 mrg pretty_printer pp;
2918 1.1 mrg pp_show_color (&pp) = pp_show_color (global_dc->printer);
2919 1.1 mrg for (unsigned i = 0; valid[i] != UCHAR_MAX; ++i)
2920 1.1 mrg {
2921 1.1 mrg const char *modname = memory_models[valid[i]].modname;
2922 1.1 mrg pp_printf (&pp, "%s%qs", i ? ", " : "", modname);
2923 1.1 mrg }
2924 1.1 mrg
2925 1.1 mrg inform (loc, "valid models are %s", pp_formatted_text (&pp));
2926 1.1 mrg return true;
2927 1.1 mrg }
2928 1.1 mrg
2929 1.1 mrg if (!ord_fail)
2930 1.1 mrg return false;
2931 1.1 mrg
2932 1.1 mrg if (fail == MEMMODEL_RELEASE || fail == MEMMODEL_ACQ_REL)
2933 1.1 mrg if (const char *failname = memmodel_name (fail))
2934 1.1 mrg {
2935 1.1 mrg /* If both memory model arguments are valid but their combination
2936 1.1 mrg is not, use their names in the warning. */
2937 1.1 mrg if (!warning_at (loc, OPT_Winvalid_memory_model,
2938 1.1 mrg "invalid failure memory model %qs for %qD",
2939 1.1 mrg failname, fndecl))
2940 1.1 mrg return false;
2941 1.1 mrg
2942 1.1 mrg inform (loc,
2943 1.1 mrg "valid failure models are %qs, %qs, %qs, %qs",
2944 1.1 mrg "memory_order_relaxed", "memory_order_seq_cst",
2945 1.1 mrg "memory_order_acquire", "memory_order_consume");
2946 1.1 mrg return true;
2947 1.1 mrg }
2948 1.1 mrg
2949 1.1 mrg if (memmodel_base (fail) <= memmodel_base (sucs))
2950 1.1 mrg return false;
2951 1.1 mrg
2952 1.1 mrg if (const char *sucsname = memmodel_name (sucs))
2953 1.1 mrg if (const char *failname = memmodel_name (fail))
2954 1.1 mrg {
2955 1.1 mrg /* If both memory model arguments are valid but their combination
2956 1.1 mrg is not, use their names in the warning. */
2957 1.1 mrg if (!warning_at (loc, OPT_Winvalid_memory_model,
2958 1.1 mrg "failure memory model %qs cannot be stronger "
2959 1.1 mrg "than success memory model %qs for %qD",
2960 1.1 mrg failname, sucsname, fndecl))
2961 1.1 mrg return false;
2962 1.1 mrg
2963 1.1 mrg /* Print a note with the valid failure memory models which are
2964 1.1 mrg those with a value less than or equal to the success mode. */
2965 1.1 mrg char buf[120];
2966 1.1 mrg *buf = '\0';
2967 1.1 mrg for (unsigned i = 0;
2968 1.1 mrg memory_models[i].modval <= memmodel_base (sucs); ++i)
2969 1.1 mrg {
2970 1.1 mrg if (*buf)
2971 1.1 mrg strcat (buf, ", ");
2972 1.1 mrg
2973 1.1 mrg const char *modname = memory_models[valid[i]].modname;
2974 1.1 mrg sprintf (buf + strlen (buf), "'%s'", modname);
2975 1.1 mrg }
2976 1.1 mrg
2977 1.1 mrg inform (loc, "valid models are %s", buf);
2978 1.1 mrg return true;
2979 1.1 mrg }
2980 1.1 mrg
2981 1.1 mrg /* If either memory model argument value is invalid use the numerical
2982 1.1 mrg value of both in the message. */
2983 1.1 mrg return warning_at (loc, OPT_Winvalid_memory_model,
2984 1.1 mrg "failure memory model %wi cannot be stronger "
2985 1.1 mrg "than success memory model %wi for %qD",
2986 1.1 mrg fail, sucs, fndecl);
2987 1.1 mrg }
2988 1.1 mrg
2989 1.1 mrg /* Wrapper for the above. */
2990 1.1 mrg
2991 1.1 mrg void
2992 1.1 mrg pass_waccess::check_atomic_memmodel (gimple *stmt, tree ord_sucs,
2993 1.1 mrg tree ord_fail, const unsigned char *valid)
2994 1.1 mrg {
2995 1.1 mrg if (warning_suppressed_p (stmt, OPT_Winvalid_memory_model))
2996 1.1 mrg return;
2997 1.1 mrg
2998 1.1 mrg if (!maybe_warn_memmodel (stmt, ord_sucs, ord_fail, valid))
2999 1.1 mrg return;
3000 1.1 mrg
3001 1.1 mrg suppress_warning (stmt, OPT_Winvalid_memory_model);
3002 1.1 mrg }
3003 1.1 mrg
3004 1.1 mrg /* Check a call STMT to an atomic or sync built-in. */
3005 1.1 mrg
3006 1.1 mrg bool
3007 1.1 mrg pass_waccess::check_atomic_builtin (gcall *stmt)
3008 1.1 mrg {
3009 1.1 mrg tree callee = gimple_call_fndecl (stmt);
3010 1.1 mrg if (!callee)
3011 1.1 mrg return false;
3012 1.1 mrg
3013 1.1 mrg /* The size in bytes of the access by the function, and the number
3014 1.1 mrg of the second argument to check (if any). */
3015 1.1 mrg unsigned bytes = 0, arg2 = UINT_MAX;
3016 1.1 mrg unsigned sucs_arg = UINT_MAX, fail_arg = UINT_MAX;
3017 1.1 mrg /* Points to the array of indices of valid memory models. */
3018 1.1 mrg const unsigned char *pvalid_models = NULL;
3019 1.1 mrg
3020 1.1 mrg switch (DECL_FUNCTION_CODE (callee))
3021 1.1 mrg {
3022 1.1 mrg #define BUILTIN_ACCESS_SIZE_FNSPEC(N) \
3023 1.1 mrg BUILT_IN_SYNC_FETCH_AND_ADD_ ## N: \
3024 1.1 mrg case BUILT_IN_SYNC_FETCH_AND_SUB_ ## N: \
3025 1.1 mrg case BUILT_IN_SYNC_FETCH_AND_OR_ ## N: \
3026 1.1 mrg case BUILT_IN_SYNC_FETCH_AND_AND_ ## N: \
3027 1.1 mrg case BUILT_IN_SYNC_FETCH_AND_XOR_ ## N: \
3028 1.1 mrg case BUILT_IN_SYNC_FETCH_AND_NAND_ ## N: \
3029 1.1 mrg case BUILT_IN_SYNC_ADD_AND_FETCH_ ## N: \
3030 1.1 mrg case BUILT_IN_SYNC_SUB_AND_FETCH_ ## N: \
3031 1.1 mrg case BUILT_IN_SYNC_OR_AND_FETCH_ ## N: \
3032 1.1 mrg case BUILT_IN_SYNC_AND_AND_FETCH_ ## N: \
3033 1.1 mrg case BUILT_IN_SYNC_XOR_AND_FETCH_ ## N: \
3034 1.1 mrg case BUILT_IN_SYNC_NAND_AND_FETCH_ ## N: \
3035 1.1 mrg case BUILT_IN_SYNC_LOCK_TEST_AND_SET_ ## N: \
3036 1.1 mrg case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_ ## N: \
3037 1.1 mrg case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_ ## N: \
3038 1.1 mrg case BUILT_IN_SYNC_LOCK_RELEASE_ ## N: \
3039 1.1 mrg bytes = N; \
3040 1.1 mrg break; \
3041 1.1 mrg case BUILT_IN_ATOMIC_LOAD_ ## N: \
3042 1.1 mrg pvalid_models = load_models; \
3043 1.1 mrg sucs_arg = 1; \
3044 1.1 mrg /* FALLTHROUGH */ \
3045 1.1 mrg case BUILT_IN_ATOMIC_STORE_ ## N: \
3046 1.1 mrg if (!pvalid_models) \
3047 1.1 mrg pvalid_models = store_models; \
3048 1.1 mrg /* FALLTHROUGH */ \
3049 1.1 mrg case BUILT_IN_ATOMIC_ADD_FETCH_ ## N: \
3050 1.1 mrg case BUILT_IN_ATOMIC_SUB_FETCH_ ## N: \
3051 1.1 mrg case BUILT_IN_ATOMIC_AND_FETCH_ ## N: \
3052 1.1 mrg case BUILT_IN_ATOMIC_NAND_FETCH_ ## N: \
3053 1.1 mrg case BUILT_IN_ATOMIC_XOR_FETCH_ ## N: \
3054 1.1 mrg case BUILT_IN_ATOMIC_OR_FETCH_ ## N: \
3055 1.1 mrg case BUILT_IN_ATOMIC_FETCH_ADD_ ## N: \
3056 1.1 mrg case BUILT_IN_ATOMIC_FETCH_SUB_ ## N: \
3057 1.1 mrg case BUILT_IN_ATOMIC_FETCH_AND_ ## N: \
3058 1.1 mrg case BUILT_IN_ATOMIC_FETCH_NAND_ ## N: \
3059 1.1 mrg case BUILT_IN_ATOMIC_FETCH_OR_ ## N: \
3060 1.1 mrg case BUILT_IN_ATOMIC_FETCH_XOR_ ## N: \
3061 1.1 mrg bytes = N; \
3062 1.1 mrg if (sucs_arg == UINT_MAX) \
3063 1.1 mrg sucs_arg = 2; \
3064 1.1 mrg if (!pvalid_models) \
3065 1.1 mrg pvalid_models = all_models; \
3066 1.1 mrg break; \
3067 1.1 mrg case BUILT_IN_ATOMIC_EXCHANGE_ ## N: \
3068 1.1 mrg bytes = N; \
3069 1.1 mrg sucs_arg = 3; \
3070 1.1 mrg pvalid_models = xchg_models; \
3071 1.1 mrg break; \
3072 1.1 mrg case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_ ## N: \
3073 1.1 mrg bytes = N; \
3074 1.1 mrg sucs_arg = 4; \
3075 1.1 mrg fail_arg = 5; \
3076 1.1 mrg pvalid_models = all_models; \
3077 1.1 mrg arg2 = 1
3078 1.1 mrg
3079 1.1 mrg case BUILTIN_ACCESS_SIZE_FNSPEC (1);
3080 1.1 mrg break;
3081 1.1 mrg case BUILTIN_ACCESS_SIZE_FNSPEC (2);
3082 1.1 mrg break;
3083 1.1 mrg case BUILTIN_ACCESS_SIZE_FNSPEC (4);
3084 1.1 mrg break;
3085 1.1 mrg case BUILTIN_ACCESS_SIZE_FNSPEC (8);
3086 1.1 mrg break;
3087 1.1 mrg case BUILTIN_ACCESS_SIZE_FNSPEC (16);
3088 1.1 mrg break;
3089 1.1 mrg
3090 1.1 mrg case BUILT_IN_ATOMIC_CLEAR:
3091 1.1 mrg sucs_arg = 1;
3092 1.1 mrg pvalid_models = flag_clr_models;
3093 1.1 mrg break;
3094 1.1 mrg
3095 1.1 mrg default:
3096 1.1 mrg return false;
3097 1.1 mrg }
3098 1.1 mrg
3099 1.1 mrg unsigned nargs = gimple_call_num_args (stmt);
3100 1.1 mrg if (sucs_arg < nargs)
3101 1.1 mrg {
3102 1.1 mrg tree ord_sucs = gimple_call_arg (stmt, sucs_arg);
3103 1.1 mrg tree ord_fail = NULL_TREE;
3104 1.1 mrg if (fail_arg < nargs)
3105 1.1 mrg ord_fail = gimple_call_arg (stmt, fail_arg);
3106 1.1 mrg check_atomic_memmodel (stmt, ord_sucs, ord_fail, pvalid_models);
3107 1.1 mrg }
3108 1.1 mrg
3109 1.1 mrg if (!bytes)
3110 1.1 mrg return true;
3111 1.1 mrg
3112 1.1 mrg tree size = build_int_cstu (sizetype, bytes);
3113 1.1 mrg tree dst = gimple_call_arg (stmt, 0);
3114 1.1 mrg check_memop_access (stmt, dst, NULL_TREE, size);
3115 1.1 mrg
3116 1.1 mrg if (arg2 != UINT_MAX)
3117 1.1 mrg {
3118 1.1 mrg tree dst = gimple_call_arg (stmt, arg2);
3119 1.1 mrg check_memop_access (stmt, dst, NULL_TREE, size);
3120 1.1 mrg }
3121 1.1 mrg
3122 1.1 mrg return true;
3123 1.1 mrg }
3124 1.1 mrg
3125 1.1 mrg /* Check call STMT to a built-in function for invalid accesses. Return
3126 1.1 mrg true if a call has been handled. */
3127 1.1 mrg
3128 1.1 mrg bool
3129 1.1 mrg pass_waccess::check_builtin (gcall *stmt)
3130 1.1 mrg {
3131 1.1 mrg tree callee = gimple_call_fndecl (stmt);
3132 1.1 mrg if (!callee)
3133 1.1 mrg return false;
3134 1.1 mrg
3135 1.1 mrg switch (DECL_FUNCTION_CODE (callee))
3136 1.1 mrg {
3137 1.1 mrg case BUILT_IN_ALLOCA:
3138 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN:
3139 1.1 mrg case BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX:
3140 1.1 mrg check_alloca (stmt);
3141 1.1 mrg return true;
3142 1.1 mrg
3143 1.1 mrg case BUILT_IN_EXECL:
3144 1.1 mrg case BUILT_IN_EXECLE:
3145 1.1 mrg case BUILT_IN_EXECLP:
3146 1.1 mrg case BUILT_IN_EXECV:
3147 1.1 mrg case BUILT_IN_EXECVE:
3148 1.1 mrg case BUILT_IN_EXECVP:
3149 1.1 mrg check_read_access (stmt, call_arg (stmt, 0));
3150 1.1 mrg return true;
3151 1.1 mrg
3152 1.1 mrg case BUILT_IN_FREE:
3153 1.1 mrg case BUILT_IN_REALLOC:
3154 1.1 mrg if (!m_early_checks_p)
3155 1.1 mrg {
3156 1.1 mrg tree arg = call_arg (stmt, 0);
3157 1.1 mrg if (TREE_CODE (arg) == SSA_NAME)
3158 1.1 mrg check_pointer_uses (stmt, arg);
3159 1.1 mrg }
3160 1.1 mrg return true;
3161 1.1 mrg
3162 1.1 mrg case BUILT_IN_GETTEXT:
3163 1.1 mrg case BUILT_IN_PUTS:
3164 1.1 mrg case BUILT_IN_PUTS_UNLOCKED:
3165 1.1 mrg case BUILT_IN_STRDUP:
3166 1.1 mrg check_read_access (stmt, call_arg (stmt, 0));
3167 1.1 mrg return true;
3168 1.1 mrg
3169 1.1 mrg case BUILT_IN_INDEX:
3170 1.1 mrg case BUILT_IN_RINDEX:
3171 1.1 mrg case BUILT_IN_STRCHR:
3172 1.1 mrg case BUILT_IN_STRRCHR:
3173 1.1 mrg case BUILT_IN_STRLEN:
3174 1.1 mrg check_read_access (stmt, call_arg (stmt, 0));
3175 1.1 mrg return true;
3176 1.1 mrg
3177 1.1 mrg case BUILT_IN_FPUTS:
3178 1.1 mrg case BUILT_IN_FPUTS_UNLOCKED:
3179 1.1 mrg check_read_access (stmt, call_arg (stmt, 0));
3180 1.1 mrg return true;
3181 1.1 mrg
3182 1.1 mrg case BUILT_IN_STRNDUP:
3183 1.1 mrg case BUILT_IN_STRNLEN:
3184 1.1 mrg {
3185 1.1 mrg tree str = call_arg (stmt, 0);
3186 1.1 mrg tree len = call_arg (stmt, 1);
3187 1.1 mrg check_read_access (stmt, str, len);
3188 1.1 mrg return true;
3189 1.1 mrg }
3190 1.1 mrg
3191 1.1 mrg case BUILT_IN_STRCAT:
3192 1.1 mrg check_strcat (stmt);
3193 1.1 mrg return true;
3194 1.1 mrg
3195 1.1 mrg case BUILT_IN_STRNCAT:
3196 1.1 mrg check_strncat (stmt);
3197 1.1 mrg return true;
3198 1.1 mrg
3199 1.1 mrg case BUILT_IN_STPCPY:
3200 1.1 mrg case BUILT_IN_STRCPY:
3201 1.1 mrg check_stxcpy (stmt);
3202 1.1 mrg return true;
3203 1.1 mrg
3204 1.1 mrg case BUILT_IN_STPNCPY:
3205 1.1 mrg case BUILT_IN_STRNCPY:
3206 1.1 mrg check_stxncpy (stmt);
3207 1.1 mrg return true;
3208 1.1 mrg
3209 1.1 mrg case BUILT_IN_STRCASECMP:
3210 1.1 mrg case BUILT_IN_STRCMP:
3211 1.1 mrg case BUILT_IN_STRPBRK:
3212 1.1 mrg case BUILT_IN_STRSPN:
3213 1.1 mrg case BUILT_IN_STRCSPN:
3214 1.1 mrg case BUILT_IN_STRSTR:
3215 1.1 mrg check_read_access (stmt, call_arg (stmt, 0));
3216 1.1 mrg check_read_access (stmt, call_arg (stmt, 1));
3217 1.1 mrg return true;
3218 1.1 mrg
3219 1.1 mrg case BUILT_IN_STRNCASECMP:
3220 1.1 mrg case BUILT_IN_STRNCMP:
3221 1.1 mrg check_strncmp (stmt);
3222 1.1 mrg return true;
3223 1.1 mrg
3224 1.1 mrg case BUILT_IN_MEMCMP:
3225 1.1 mrg {
3226 1.1 mrg tree a1 = call_arg (stmt, 0);
3227 1.1 mrg tree a2 = call_arg (stmt, 1);
3228 1.1 mrg tree len = call_arg (stmt, 2);
3229 1.1 mrg check_read_access (stmt, a1, len, 0);
3230 1.1 mrg check_read_access (stmt, a2, len, 0);
3231 1.1 mrg return true;
3232 1.1 mrg }
3233 1.1 mrg
3234 1.1 mrg case BUILT_IN_MEMCPY:
3235 1.1 mrg case BUILT_IN_MEMPCPY:
3236 1.1 mrg case BUILT_IN_MEMMOVE:
3237 1.1 mrg {
3238 1.1 mrg tree dst = call_arg (stmt, 0);
3239 1.1 mrg tree src = call_arg (stmt, 1);
3240 1.1 mrg tree len = call_arg (stmt, 2);
3241 1.1 mrg check_memop_access (stmt, dst, src, len);
3242 1.1 mrg return true;
3243 1.1 mrg }
3244 1.1 mrg
3245 1.1 mrg case BUILT_IN_MEMCHR:
3246 1.1 mrg {
3247 1.1 mrg tree src = call_arg (stmt, 0);
3248 1.1 mrg tree len = call_arg (stmt, 2);
3249 1.1 mrg check_read_access (stmt, src, len, 0);
3250 1.1 mrg return true;
3251 1.1 mrg }
3252 1.1 mrg
3253 1.1 mrg case BUILT_IN_MEMSET:
3254 1.1 mrg {
3255 1.1 mrg tree dst = call_arg (stmt, 0);
3256 1.1 mrg tree len = call_arg (stmt, 2);
3257 1.1 mrg check_memop_access (stmt, dst, NULL_TREE, len);
3258 1.1 mrg return true;
3259 1.1 mrg }
3260 1.1 mrg
3261 1.1 mrg default:
3262 1.1 mrg if (check_atomic_builtin (stmt))
3263 1.1 mrg return true;
3264 1.1 mrg break;
3265 1.1 mrg }
3266 1.1 mrg
3267 1.1 mrg return false;
3268 1.1 mrg }
3269 1.1 mrg
3270 1.1 mrg /* Returns the type of the argument ARGNO to function with type FNTYPE
3271 1.1 mrg or null when the type cannot be determined or no such argument exists. */
3272 1.1 mrg
3273 1.1 mrg static tree
3274 1.1 mrg fntype_argno_type (tree fntype, unsigned argno)
3275 1.1 mrg {
3276 1.1 mrg if (!prototype_p (fntype))
3277 1.1 mrg return NULL_TREE;
3278 1.1 mrg
3279 1.1 mrg tree argtype;
3280 1.1 mrg function_args_iterator it;
3281 1.1 mrg FOREACH_FUNCTION_ARGS (fntype, argtype, it)
3282 1.1 mrg if (argno-- == 0)
3283 1.1 mrg return argtype;
3284 1.1 mrg
3285 1.1 mrg return NULL_TREE;
3286 1.1 mrg }
3287 1.1 mrg
3288 1.1 mrg /* Helper to append the "human readable" attribute access specification
3289 1.1 mrg described by ACCESS to the array ATTRSTR with size STRSIZE. Used in
3290 1.1 mrg diagnostics. */
3291 1.1 mrg
3292 1.1 mrg static inline void
3293 1.1 mrg append_attrname (const std::pair<int, attr_access> &access,
3294 1.1 mrg char *attrstr, size_t strsize)
3295 1.1 mrg {
3296 1.1 mrg if (access.second.internal_p)
3297 1.1 mrg return;
3298 1.1 mrg
3299 1.1 mrg tree str = access.second.to_external_string ();
3300 1.1 mrg gcc_assert (strsize >= (size_t) TREE_STRING_LENGTH (str));
3301 1.1 mrg strcpy (attrstr, TREE_STRING_POINTER (str));
3302 1.1 mrg }
3303 1.1 mrg
3304 1.1 mrg /* Iterate over attribute access read-only, read-write, and write-only
3305 1.1 mrg arguments and diagnose past-the-end accesses and related problems
3306 1.1 mrg in the function call EXP. */
3307 1.1 mrg
3308 1.1 mrg void
3309 1.1 mrg pass_waccess::maybe_check_access_sizes (rdwr_map *rwm, tree fndecl, tree fntype,
3310 1.1 mrg gimple *stmt)
3311 1.1 mrg {
3312 1.1 mrg if (warning_suppressed_p (stmt, OPT_Wnonnull)
3313 1.1 mrg || warning_suppressed_p (stmt, OPT_Wstringop_overflow_))
3314 1.1 mrg return;
3315 1.1 mrg
3316 1.1 mrg auto_diagnostic_group adg;
3317 1.1 mrg
3318 1.1 mrg /* Set if a warning has been issued for any argument (used to decide
3319 1.1 mrg whether to emit an informational note at the end). */
3320 1.1 mrg opt_code opt_warned = no_warning;
3321 1.1 mrg
3322 1.1 mrg /* A string describing the attributes that the warnings issued by this
3323 1.1 mrg function apply to. Used to print one informational note per function
3324 1.1 mrg call, rather than one per warning. That reduces clutter. */
3325 1.1 mrg char attrstr[80];
3326 1.1 mrg attrstr[0] = 0;
3327 1.1 mrg
3328 1.1 mrg for (rdwr_map::iterator it = rwm->begin (); it != rwm->end (); ++it)
3329 1.1 mrg {
3330 1.1 mrg std::pair<int, attr_access> access = *it;
3331 1.1 mrg
3332 1.1 mrg /* Get the function call arguments corresponding to the attribute's
3333 1.1 mrg positional arguments. When both arguments have been specified
3334 1.1 mrg there will be two entries in *RWM, one for each. They are
3335 1.1 mrg cross-referenced by their respective argument numbers in
3336 1.1 mrg ACCESS.PTRARG and ACCESS.SIZARG. */
3337 1.1 mrg const int ptridx = access.second.ptrarg;
3338 1.1 mrg const int sizidx = access.second.sizarg;
3339 1.1 mrg
3340 1.1 mrg gcc_assert (ptridx != -1);
3341 1.1 mrg gcc_assert (access.first == ptridx || access.first == sizidx);
3342 1.1 mrg
3343 1.1 mrg /* The pointer is set to null for the entry corresponding to
3344 1.1 mrg the size argument. Skip it. It's handled when the entry
3345 1.1 mrg corresponding to the pointer argument comes up. */
3346 1.1 mrg if (!access.second.ptr)
3347 1.1 mrg continue;
3348 1.1 mrg
3349 1.1 mrg tree ptrtype = fntype_argno_type (fntype, ptridx);
3350 1.1 mrg if (!ptrtype)
3351 1.1 mrg /* A function with a prototype was redeclared without one and
3352 1.1 mrg the prototype has been lost. See pr102759. Avoid dealing
3353 1.1 mrg with this pathological case. */
3354 1.1 mrg return;
3355 1.1 mrg
3356 1.1 mrg tree argtype = TREE_TYPE (ptrtype);
3357 1.1 mrg
3358 1.1 mrg /* The size of the access by the call in elements. */
3359 1.1 mrg tree access_nelts;
3360 1.1 mrg if (sizidx == -1)
3361 1.1 mrg {
3362 1.1 mrg /* If only the pointer attribute operand was specified and
3363 1.1 mrg not size, set SIZE to the greater of MINSIZE or size of
3364 1.1 mrg one element of the pointed to type to detect smaller
3365 1.1 mrg objects (null pointers are diagnosed in this case only
3366 1.1 mrg if the pointer is also declared with attribute nonnull. */
3367 1.1 mrg if (access.second.minsize
3368 1.1 mrg && access.second.minsize != HOST_WIDE_INT_M1U)
3369 1.1 mrg access_nelts = build_int_cstu (sizetype, access.second.minsize);
3370 1.1 mrg else if (VOID_TYPE_P (argtype) && access.second.mode == access_none)
3371 1.1 mrg /* Treat access mode none on a void* argument as expecting
3372 1.1 mrg as little as zero bytes. */
3373 1.1 mrg access_nelts = size_zero_node;
3374 1.1 mrg else
3375 1.1 mrg access_nelts = size_one_node;
3376 1.1 mrg }
3377 1.1 mrg else
3378 1.1 mrg access_nelts = rwm->get (sizidx)->size;
3379 1.1 mrg
3380 1.1 mrg /* Format the value or range to avoid an explosion of messages. */
3381 1.1 mrg char sizstr[80];
3382 1.1 mrg tree sizrng[2] = { size_zero_node, build_all_ones_cst (sizetype) };
3383 1.1 mrg if (get_size_range (m_ptr_qry.rvals, access_nelts, stmt, sizrng, 1))
3384 1.1 mrg {
3385 1.1 mrg char *s0 = print_generic_expr_to_str (sizrng[0]);
3386 1.1 mrg if (tree_int_cst_equal (sizrng[0], sizrng[1]))
3387 1.1 mrg {
3388 1.1 mrg gcc_checking_assert (strlen (s0) < sizeof sizstr);
3389 1.1 mrg strcpy (sizstr, s0);
3390 1.1 mrg }
3391 1.1 mrg else
3392 1.1 mrg {
3393 1.1 mrg char *s1 = print_generic_expr_to_str (sizrng[1]);
3394 1.1 mrg gcc_checking_assert (strlen (s0) + strlen (s1)
3395 1.1 mrg < sizeof sizstr - 4);
3396 1.1 mrg sprintf (sizstr, "[%.37s, %.37s]", s0, s1);
3397 1.1 mrg free (s1);
3398 1.1 mrg }
3399 1.1 mrg free (s0);
3400 1.1 mrg }
3401 1.1 mrg else
3402 1.1 mrg *sizstr = '\0';
3403 1.1 mrg
3404 1.1 mrg /* Set if a warning has been issued for the current argument. */
3405 1.1 mrg opt_code arg_warned = no_warning;
3406 1.1 mrg location_t loc = get_location (stmt);
3407 1.1 mrg tree ptr = access.second.ptr;
3408 1.1 mrg if (*sizstr
3409 1.1 mrg && tree_int_cst_sgn (sizrng[0]) < 0
3410 1.1 mrg && tree_int_cst_sgn (sizrng[1]) < 0)
3411 1.1 mrg {
3412 1.1 mrg /* Warn about negative sizes. */
3413 1.1 mrg if (access.second.internal_p)
3414 1.1 mrg {
3415 1.1 mrg const std::string argtypestr
3416 1.1 mrg = access.second.array_as_string (ptrtype);
3417 1.1 mrg
3418 1.1 mrg if (warning_at (loc, OPT_Wstringop_overflow_,
3419 1.1 mrg "bound argument %i value %s is "
3420 1.1 mrg "negative for a variable length array "
3421 1.1 mrg "argument %i of type %s",
3422 1.1 mrg sizidx + 1, sizstr,
3423 1.1 mrg ptridx + 1, argtypestr.c_str ()))
3424 1.1 mrg arg_warned = OPT_Wstringop_overflow_;
3425 1.1 mrg }
3426 1.1 mrg else if (warning_at (loc, OPT_Wstringop_overflow_,
3427 1.1 mrg "argument %i value %s is negative",
3428 1.1 mrg sizidx + 1, sizstr))
3429 1.1 mrg arg_warned = OPT_Wstringop_overflow_;
3430 1.1 mrg
3431 1.1 mrg if (arg_warned != no_warning)
3432 1.1 mrg {
3433 1.1 mrg append_attrname (access, attrstr, sizeof attrstr);
3434 1.1 mrg /* Remember a warning has been issued and avoid warning
3435 1.1 mrg again below for the same attribute. */
3436 1.1 mrg opt_warned = arg_warned;
3437 1.1 mrg continue;
3438 1.1 mrg }
3439 1.1 mrg }
3440 1.1 mrg
3441 1.1 mrg /* The size of the access by the call in bytes. */
3442 1.1 mrg tree access_size = NULL_TREE;
3443 1.1 mrg if (tree_int_cst_sgn (sizrng[0]) >= 0)
3444 1.1 mrg {
3445 1.1 mrg if (COMPLETE_TYPE_P (argtype))
3446 1.1 mrg {
3447 1.1 mrg /* Multiply ACCESS_SIZE by the size of the type the pointer
3448 1.1 mrg argument points to. If it's incomplete the size is used
3449 1.1 mrg as is. */
3450 1.1 mrg if (tree argsize = TYPE_SIZE_UNIT (argtype))
3451 1.1 mrg if (TREE_CODE (argsize) == INTEGER_CST)
3452 1.1 mrg {
3453 1.1 mrg const int prec = TYPE_PRECISION (sizetype);
3454 1.1 mrg wide_int minsize = wi::to_wide (sizrng[0], prec);
3455 1.1 mrg minsize *= wi::to_wide (argsize, prec);
3456 1.1 mrg access_size = wide_int_to_tree (sizetype, minsize);
3457 1.1 mrg }
3458 1.1 mrg }
3459 1.1 mrg else
3460 1.1 mrg access_size = access_nelts;
3461 1.1 mrg }
3462 1.1 mrg
3463 1.1 mrg if (integer_zerop (ptr))
3464 1.1 mrg {
3465 1.1 mrg if (sizidx >= 0 && tree_int_cst_sgn (sizrng[0]) > 0)
3466 1.1 mrg {
3467 1.1 mrg /* Warn about null pointers with positive sizes. This is
3468 1.1 mrg different from also declaring the pointer argument with
3469 1.1 mrg attribute nonnull when the function accepts null pointers
3470 1.1 mrg only when the corresponding size is zero. */
3471 1.1 mrg if (access.second.internal_p)
3472 1.1 mrg {
3473 1.1 mrg const std::string argtypestr
3474 1.1 mrg = access.second.array_as_string (ptrtype);
3475 1.1 mrg
3476 1.1 mrg if (warning_at (loc, OPT_Wnonnull,
3477 1.1 mrg "argument %i of variable length "
3478 1.1 mrg "array %s is null but "
3479 1.1 mrg "the corresponding bound argument "
3480 1.1 mrg "%i value is %s",
3481 1.1 mrg ptridx + 1, argtypestr.c_str (),
3482 1.1 mrg sizidx + 1, sizstr))
3483 1.1 mrg arg_warned = OPT_Wnonnull;
3484 1.1 mrg }
3485 1.1 mrg else if (warning_at (loc, OPT_Wnonnull,
3486 1.1 mrg "argument %i is null but "
3487 1.1 mrg "the corresponding size argument "
3488 1.1 mrg "%i value is %s",
3489 1.1 mrg ptridx + 1, sizidx + 1, sizstr))
3490 1.1 mrg arg_warned = OPT_Wnonnull;
3491 1.1 mrg }
3492 1.1 mrg else if (access_size && access.second.static_p)
3493 1.1 mrg {
3494 1.1 mrg /* Warn about null pointers for [static N] array arguments
3495 1.1 mrg but do not warn for ordinary (i.e., nonstatic) arrays. */
3496 1.1 mrg if (warning_at (loc, OPT_Wnonnull,
3497 1.1 mrg "argument %i to %<%T[static %E]%> "
3498 1.1 mrg "is null where non-null expected",
3499 1.1 mrg ptridx + 1, argtype, access_nelts))
3500 1.1 mrg arg_warned = OPT_Wnonnull;
3501 1.1 mrg }
3502 1.1 mrg
3503 1.1 mrg if (arg_warned != no_warning)
3504 1.1 mrg {
3505 1.1 mrg append_attrname (access, attrstr, sizeof attrstr);
3506 1.1 mrg /* Remember a warning has been issued and avoid warning
3507 1.1 mrg again below for the same attribute. */
3508 1.1 mrg opt_warned = OPT_Wnonnull;
3509 1.1 mrg continue;
3510 1.1 mrg }
3511 1.1 mrg }
3512 1.1 mrg
3513 1.1 mrg access_data data (m_ptr_qry.rvals, stmt, access.second.mode,
3514 1.1 mrg NULL_TREE, false, NULL_TREE, false);
3515 1.1 mrg access_ref* const pobj = (access.second.mode == access_write_only
3516 1.1 mrg ? &data.dst : &data.src);
3517 1.1 mrg tree objsize = compute_objsize (ptr, stmt, 1, pobj, &m_ptr_qry);
3518 1.1 mrg
3519 1.1 mrg /* The size of the destination or source object. */
3520 1.1 mrg tree dstsize = NULL_TREE, srcsize = NULL_TREE;
3521 1.1 mrg if (access.second.mode == access_read_only
3522 1.1 mrg || access.second.mode == access_none)
3523 1.1 mrg {
3524 1.1 mrg /* For a read-only argument there is no destination. For
3525 1.1 mrg no access, set the source as well and differentiate via
3526 1.1 mrg the access flag below. */
3527 1.1 mrg srcsize = objsize;
3528 1.1 mrg if (access.second.mode == access_read_only
3529 1.1 mrg || access.second.mode == access_none)
3530 1.1 mrg {
3531 1.1 mrg /* For a read-only attribute there is no destination so
3532 1.1 mrg clear OBJSIZE. This emits "reading N bytes" kind of
3533 1.1 mrg diagnostics instead of the "writing N bytes" kind,
3534 1.1 mrg unless MODE is none. */
3535 1.1 mrg objsize = NULL_TREE;
3536 1.1 mrg }
3537 1.1 mrg }
3538 1.1 mrg else
3539 1.1 mrg dstsize = objsize;
3540 1.1 mrg
3541 1.1 mrg /* Clear the no-warning bit in case it was set by check_access
3542 1.1 mrg in a prior iteration so that accesses via different arguments
3543 1.1 mrg are diagnosed. */
3544 1.1 mrg suppress_warning (stmt, OPT_Wstringop_overflow_, false);
3545 1.1 mrg access_mode mode = data.mode;
3546 1.1 mrg if (mode == access_deferred)
3547 1.1 mrg mode = TYPE_READONLY (argtype) ? access_read_only : access_read_write;
3548 1.1 mrg check_access (stmt, access_size, /*maxread=*/ NULL_TREE, srcsize,
3549 1.1 mrg dstsize, mode, &data, m_ptr_qry.rvals);
3550 1.1 mrg
3551 1.1 mrg if (warning_suppressed_p (stmt, OPT_Wstringop_overflow_))
3552 1.1 mrg opt_warned = OPT_Wstringop_overflow_;
3553 1.1 mrg if (opt_warned != no_warning)
3554 1.1 mrg {
3555 1.1 mrg if (access.second.internal_p)
3556 1.1 mrg {
3557 1.1 mrg unsigned HOST_WIDE_INT nelts =
3558 1.1 mrg access_nelts ? access.second.minsize : HOST_WIDE_INT_M1U;
3559 1.1 mrg tree arrtype = build_printable_array_type (argtype, nelts);
3560 1.1 mrg inform (loc, "referencing argument %u of type %qT",
3561 1.1 mrg ptridx + 1, arrtype);
3562 1.1 mrg }
3563 1.1 mrg else
3564 1.1 mrg /* If check_access issued a warning above, append the relevant
3565 1.1 mrg attribute to the string. */
3566 1.1 mrg append_attrname (access, attrstr, sizeof attrstr);
3567 1.1 mrg }
3568 1.1 mrg }
3569 1.1 mrg
3570 1.1 mrg if (*attrstr)
3571 1.1 mrg {
3572 1.1 mrg if (fndecl)
3573 1.1 mrg inform (get_location (fndecl),
3574 1.1 mrg "in a call to function %qD declared with attribute %qs",
3575 1.1 mrg fndecl, attrstr);
3576 1.1 mrg else
3577 1.1 mrg inform (get_location (stmt),
3578 1.1 mrg "in a call with type %qT and attribute %qs",
3579 1.1 mrg fntype, attrstr);
3580 1.1 mrg }
3581 1.1 mrg else if (opt_warned != no_warning)
3582 1.1 mrg {
3583 1.1 mrg if (fndecl)
3584 1.1 mrg inform (get_location (fndecl),
3585 1.1 mrg "in a call to function %qD", fndecl);
3586 1.1 mrg else
3587 1.1 mrg inform (get_location (stmt),
3588 1.1 mrg "in a call with type %qT", fntype);
3589 1.1 mrg }
3590 1.1 mrg
3591 1.1 mrg /* Set the bit in case it was cleared and not set above. */
3592 1.1 mrg if (opt_warned != no_warning)
3593 1.1 mrg suppress_warning (stmt, opt_warned);
3594 1.1 mrg }
3595 1.1 mrg
3596 1.1 mrg /* Check call STMT to an ordinary (non-built-in) function for invalid
3597 1.1 mrg accesses. Return true if a call has been handled. */
3598 1.1 mrg
3599 1.1 mrg bool
3600 1.1 mrg pass_waccess::check_call_access (gcall *stmt)
3601 1.1 mrg {
3602 1.1 mrg tree fntype = gimple_call_fntype (stmt);
3603 1.1 mrg if (!fntype)
3604 1.1 mrg return false;
3605 1.1 mrg
3606 1.1 mrg tree fntypeattrs = TYPE_ATTRIBUTES (fntype);
3607 1.1 mrg if (!fntypeattrs)
3608 1.1 mrg return false;
3609 1.1 mrg
3610 1.1 mrg /* Map of attribute access specifications for function arguments. */
3611 1.1 mrg rdwr_map rdwr_idx;
3612 1.1 mrg init_attr_rdwr_indices (&rdwr_idx, fntypeattrs);
3613 1.1 mrg
3614 1.1 mrg unsigned nargs = call_nargs (stmt);
3615 1.1 mrg for (unsigned i = 0; i != nargs; ++i)
3616 1.1 mrg {
3617 1.1 mrg tree arg = call_arg (stmt, i);
3618 1.1 mrg
3619 1.1 mrg /* Save the actual argument that corresponds to the access attribute
3620 1.1 mrg operand for later processing. */
3621 1.1 mrg if (attr_access *access = rdwr_idx.get (i))
3622 1.1 mrg {
3623 1.1 mrg if (POINTER_TYPE_P (TREE_TYPE (arg)))
3624 1.1 mrg {
3625 1.1 mrg access->ptr = arg;
3626 1.1 mrg /* A nonnull ACCESS->SIZE contains VLA bounds. */
3627 1.1 mrg }
3628 1.1 mrg else
3629 1.1 mrg {
3630 1.1 mrg access->size = arg;
3631 1.1 mrg gcc_assert (access->ptr == NULL_TREE);
3632 1.1 mrg }
3633 1.1 mrg }
3634 1.1 mrg }
3635 1.1 mrg
3636 1.1 mrg /* Check attribute access arguments. */
3637 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
3638 1.1 mrg maybe_check_access_sizes (&rdwr_idx, fndecl, fntype, stmt);
3639 1.1 mrg
3640 1.1 mrg check_alloc_size_call (stmt);
3641 1.1 mrg return true;
3642 1.1 mrg }
3643 1.1 mrg
3644 1.1 mrg /* Check arguments in a call STMT for attribute nonstring. */
3645 1.1 mrg
3646 1.1 mrg static void
3647 1.1 mrg check_nonstring_args (gcall *stmt)
3648 1.1 mrg {
3649 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
3650 1.1 mrg
3651 1.1 mrg /* Detect passing non-string arguments to functions expecting
3652 1.1 mrg nul-terminated strings. */
3653 1.1 mrg maybe_warn_nonstring_arg (fndecl, stmt);
3654 1.1 mrg }
3655 1.1 mrg
3656 1.1 mrg /* Issue a warning if a deallocation function such as free, realloc,
3657 1.1 mrg or C++ operator delete is called with an argument not returned by
3658 1.1 mrg a matching allocation function such as malloc or the corresponding
3659 1.1 mrg form of C++ operator new. */
3660 1.1 mrg
3661 1.1 mrg void
3662 1.1 mrg pass_waccess::maybe_check_dealloc_call (gcall *call)
3663 1.1 mrg {
3664 1.1 mrg tree fndecl = gimple_call_fndecl (call);
3665 1.1 mrg if (!fndecl)
3666 1.1 mrg return;
3667 1.1 mrg
3668 1.1 mrg unsigned argno = fndecl_dealloc_argno (fndecl);
3669 1.1 mrg if ((unsigned) call_nargs (call) <= argno)
3670 1.1 mrg return;
3671 1.1 mrg
3672 1.1 mrg tree ptr = gimple_call_arg (call, argno);
3673 1.1 mrg if (integer_zerop (ptr))
3674 1.1 mrg return;
3675 1.1 mrg
3676 1.1 mrg access_ref aref;
3677 1.1 mrg if (!compute_objsize (ptr, call, 0, &aref, &m_ptr_qry))
3678 1.1 mrg return;
3679 1.1 mrg
3680 1.1 mrg tree ref = aref.ref;
3681 1.1 mrg if (integer_zerop (ref))
3682 1.1 mrg return;
3683 1.1 mrg
3684 1.1 mrg tree dealloc_decl = fndecl;
3685 1.1 mrg location_t loc = gimple_location (call);
3686 1.1 mrg
3687 1.1 mrg if (DECL_P (ref) || EXPR_P (ref))
3688 1.1 mrg {
3689 1.1 mrg /* Diagnose freeing a declared object. */
3690 1.1 mrg if (aref.ref_declared ()
3691 1.1 mrg && warning_at (loc, OPT_Wfree_nonheap_object,
3692 1.1 mrg "%qD called on unallocated object %qD",
3693 1.1 mrg dealloc_decl, ref))
3694 1.1 mrg {
3695 1.1 mrg inform (get_location (ref), "declared here");
3696 1.1 mrg return;
3697 1.1 mrg }
3698 1.1 mrg
3699 1.1 mrg /* Diagnose freeing a pointer that includes a positive offset.
3700 1.1 mrg Such a pointer cannot refer to the beginning of an allocated
3701 1.1 mrg object. A negative offset may refer to it. */
3702 1.1 mrg if (aref.sizrng[0] != aref.sizrng[1]
3703 1.1 mrg && warn_dealloc_offset (loc, call, aref))
3704 1.1 mrg return;
3705 1.1 mrg }
3706 1.1 mrg else if (CONSTANT_CLASS_P (ref))
3707 1.1 mrg {
3708 1.1 mrg if (warning_at (loc, OPT_Wfree_nonheap_object,
3709 1.1 mrg "%qD called on a pointer to an unallocated "
3710 1.1 mrg "object %qE", dealloc_decl, ref))
3711 1.1 mrg {
3712 1.1 mrg if (TREE_CODE (ptr) == SSA_NAME)
3713 1.1 mrg {
3714 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (ptr);
3715 1.1 mrg if (is_gimple_assign (def_stmt))
3716 1.1 mrg {
3717 1.1 mrg location_t loc = gimple_location (def_stmt);
3718 1.1 mrg inform (loc, "assigned here");
3719 1.1 mrg }
3720 1.1 mrg }
3721 1.1 mrg return;
3722 1.1 mrg }
3723 1.1 mrg }
3724 1.1 mrg else if (TREE_CODE (ref) == SSA_NAME)
3725 1.1 mrg {
3726 1.1 mrg /* Also warn if the pointer argument refers to the result
3727 1.1 mrg of an allocation call like alloca or VLA. */
3728 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (ref);
3729 1.1 mrg if (!def_stmt)
3730 1.1 mrg return;
3731 1.1 mrg
3732 1.1 mrg if (is_gimple_call (def_stmt))
3733 1.1 mrg {
3734 1.1 mrg bool warned = false;
3735 1.1 mrg if (gimple_call_alloc_p (def_stmt))
3736 1.1 mrg {
3737 1.1 mrg if (matching_alloc_calls_p (def_stmt, dealloc_decl))
3738 1.1 mrg {
3739 1.1 mrg if (warn_dealloc_offset (loc, call, aref))
3740 1.1 mrg return;
3741 1.1 mrg }
3742 1.1 mrg else
3743 1.1 mrg {
3744 1.1 mrg tree alloc_decl = gimple_call_fndecl (def_stmt);
3745 1.1 mrg const opt_code opt =
3746 1.1 mrg (DECL_IS_OPERATOR_NEW_P (alloc_decl)
3747 1.1 mrg || DECL_IS_OPERATOR_DELETE_P (dealloc_decl)
3748 1.1 mrg ? OPT_Wmismatched_new_delete
3749 1.1 mrg : OPT_Wmismatched_dealloc);
3750 1.1 mrg warned = warning_at (loc, opt,
3751 1.1 mrg "%qD called on pointer returned "
3752 1.1 mrg "from a mismatched allocation "
3753 1.1 mrg "function", dealloc_decl);
3754 1.1 mrg }
3755 1.1 mrg }
3756 1.1 mrg else if (gimple_call_builtin_p (def_stmt, BUILT_IN_ALLOCA)
3757 1.1 mrg || gimple_call_builtin_p (def_stmt,
3758 1.1 mrg BUILT_IN_ALLOCA_WITH_ALIGN))
3759 1.1 mrg warned = warning_at (loc, OPT_Wfree_nonheap_object,
3760 1.1 mrg "%qD called on pointer to "
3761 1.1 mrg "an unallocated object",
3762 1.1 mrg dealloc_decl);
3763 1.1 mrg else if (warn_dealloc_offset (loc, call, aref))
3764 1.1 mrg return;
3765 1.1 mrg
3766 1.1 mrg if (warned)
3767 1.1 mrg {
3768 1.1 mrg tree fndecl = gimple_call_fndecl (def_stmt);
3769 1.1 mrg inform (gimple_location (def_stmt),
3770 1.1 mrg "returned from %qD", fndecl);
3771 1.1 mrg return;
3772 1.1 mrg }
3773 1.1 mrg }
3774 1.1 mrg else if (gimple_nop_p (def_stmt))
3775 1.1 mrg {
3776 1.1 mrg ref = SSA_NAME_VAR (ref);
3777 1.1 mrg /* Diagnose freeing a pointer that includes a positive offset. */
3778 1.1 mrg if (TREE_CODE (ref) == PARM_DECL
3779 1.1 mrg && !aref.deref
3780 1.1 mrg && aref.sizrng[0] != aref.sizrng[1]
3781 1.1 mrg && aref.offrng[0] > 0 && aref.offrng[1] > 0
3782 1.1 mrg && warn_dealloc_offset (loc, call, aref))
3783 1.1 mrg return;
3784 1.1 mrg }
3785 1.1 mrg }
3786 1.1 mrg }
3787 1.1 mrg
3788 1.1 mrg /* Return true if either USE_STMT's basic block (that of a pointer's use)
3789 1.1 mrg is dominated by INVAL_STMT's (that of a pointer's invalidating statement,
3790 1.1 mrg which is either a clobber or a deallocation call), or if they're in
3791 1.1 mrg the same block, USE_STMT follows INVAL_STMT. */
3792 1.1 mrg
3793 1.1 mrg bool
3794 1.1 mrg pass_waccess::use_after_inval_p (gimple *inval_stmt, gimple *use_stmt,
3795 1.1 mrg bool last_block /* = false */)
3796 1.1 mrg {
3797 1.1 mrg tree clobvar =
3798 1.1 mrg gimple_clobber_p (inval_stmt) ? gimple_assign_lhs (inval_stmt) : NULL_TREE;
3799 1.1 mrg
3800 1.1 mrg basic_block inval_bb = gimple_bb (inval_stmt);
3801 1.1 mrg basic_block use_bb = gimple_bb (use_stmt);
3802 1.1 mrg
3803 1.1 mrg if (!inval_bb || !use_bb)
3804 1.1 mrg return false;
3805 1.1 mrg
3806 1.1 mrg if (inval_bb != use_bb)
3807 1.1 mrg {
3808 1.1 mrg if (dominated_by_p (CDI_DOMINATORS, use_bb, inval_bb))
3809 1.1 mrg return true;
3810 1.1 mrg
3811 1.1 mrg if (!clobvar || !last_block)
3812 1.1 mrg return false;
3813 1.1 mrg
3814 1.1 mrg /* Proceed only when looking for uses of dangling pointers. */
3815 1.1 mrg auto gsi = gsi_for_stmt (use_stmt);
3816 1.1 mrg
3817 1.1 mrg /* A use statement in the last basic block in a function or one that
3818 1.1 mrg falls through to it is after any other prior clobber of the used
3819 1.1 mrg variable unless it's followed by a clobber of the same variable. */
3820 1.1 mrg basic_block bb = use_bb;
3821 1.1 mrg while (bb != inval_bb
3822 1.1 mrg && single_succ_p (bb)
3823 1.1 mrg && !(single_succ_edge (bb)->flags
3824 1.1 mrg & (EDGE_EH | EDGE_ABNORMAL | EDGE_DFS_BACK)))
3825 1.1 mrg {
3826 1.1 mrg for (; !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
3827 1.1 mrg {
3828 1.1 mrg gimple *stmt = gsi_stmt (gsi);
3829 1.1 mrg if (gimple_clobber_p (stmt))
3830 1.1 mrg {
3831 1.1 mrg if (clobvar == gimple_assign_lhs (stmt))
3832 1.1 mrg /* The use is followed by a clobber. */
3833 1.1 mrg return false;
3834 1.1 mrg }
3835 1.1 mrg }
3836 1.1 mrg
3837 1.1 mrg bb = single_succ (bb);
3838 1.1 mrg gsi = gsi_start_bb (bb);
3839 1.1 mrg }
3840 1.1 mrg
3841 1.1 mrg /* The use is one of a dangling pointer if a clobber of the variable
3842 1.1 mrg [the pointer points to] has not been found before the function exit
3843 1.1 mrg point. */
3844 1.1 mrg return bb == EXIT_BLOCK_PTR_FOR_FN (cfun);
3845 1.1 mrg }
3846 1.1 mrg
3847 1.1 mrg if (bitmap_set_bit (m_bb_uids_set, inval_bb->index))
3848 1.1 mrg /* The first time this basic block is visited assign increasing ids
3849 1.1 mrg to consecutive statements in it. Use the ids to determine which
3850 1.1 mrg precedes which. This avoids the linear traversal on subsequent
3851 1.1 mrg visits to the same block. */
3852 1.1 mrg for (auto si = gsi_start_bb (inval_bb); !gsi_end_p (si);
3853 1.1 mrg gsi_next_nondebug (&si))
3854 1.1 mrg {
3855 1.1 mrg gimple *stmt = gsi_stmt (si);
3856 1.1 mrg unsigned uid = inc_gimple_stmt_max_uid (m_func);
3857 1.1 mrg gimple_set_uid (stmt, uid);
3858 1.1 mrg }
3859 1.1 mrg
3860 1.1 mrg return gimple_uid (inval_stmt) < gimple_uid (use_stmt);
3861 1.1 mrg }
3862 1.1 mrg
3863 1.1 mrg /* Issue a warning for the USE_STMT of pointer or reference REF rendered
3864 1.1 mrg invalid by INVAL_STMT. REF may be null when it's been optimized away.
3865 1.1 mrg When nonnull, INVAL_STMT is the deallocation function that rendered
3866 1.1 mrg the pointer or reference dangling. Otherwise, VAR is the auto variable
3867 1.1 mrg (including an unnamed temporary such as a compound literal) whose
3868 1.1 mrg lifetime's rended it dangling. MAYBE is true to issue the "maybe"
3869 1.1 mrg kind of warning. EQUALITY is true when the pointer is used in
3870 1.1 mrg an equality expression. */
3871 1.1 mrg
3872 1.1 mrg void
3873 1.1 mrg pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt,
3874 1.1 mrg gimple *inval_stmt, tree var,
3875 1.1 mrg bool maybe, bool equality /* = false */)
3876 1.1 mrg {
3877 1.1 mrg /* Avoid printing the unhelpful "<unknown>" in the diagnostics. */
3878 1.1 mrg if (ref && TREE_CODE (ref) == SSA_NAME)
3879 1.1 mrg {
3880 1.1 mrg tree var = SSA_NAME_VAR (ref);
3881 1.1 mrg if (!var)
3882 1.1 mrg ref = NULL_TREE;
3883 1.1 mrg /* Don't warn for cases like when a cdtor returns 'this' on ARM. */
3884 1.1 mrg else if (warning_suppressed_p (var, OPT_Wuse_after_free))
3885 1.1 mrg return;
3886 1.1 mrg else if (DECL_ARTIFICIAL (var))
3887 1.1 mrg ref = NULL_TREE;
3888 1.1 mrg }
3889 1.1 mrg
3890 1.1 mrg location_t use_loc = gimple_location (use_stmt);
3891 1.1 mrg if (use_loc == UNKNOWN_LOCATION)
3892 1.1 mrg {
3893 1.1 mrg use_loc = m_func->function_end_locus;
3894 1.1 mrg if (!ref)
3895 1.1 mrg /* Avoid issuing a warning with no context other than
3896 1.1 mrg the function. That would make it difficult to debug
3897 1.1 mrg in any but very simple cases. */
3898 1.1 mrg return;
3899 1.1 mrg }
3900 1.1 mrg
3901 1.1 mrg if (is_gimple_call (inval_stmt))
3902 1.1 mrg {
3903 1.1 mrg if ((equality && warn_use_after_free < 3)
3904 1.1 mrg || (maybe && warn_use_after_free < 2)
3905 1.1 mrg || warning_suppressed_p (use_stmt, OPT_Wuse_after_free))
3906 1.1 mrg return;
3907 1.1 mrg
3908 1.1 mrg const tree inval_decl = gimple_call_fndecl (inval_stmt);
3909 1.1 mrg
3910 1.1 mrg if ((ref && warning_at (use_loc, OPT_Wuse_after_free,
3911 1.1 mrg (maybe
3912 1.1 mrg ? G_("pointer %qE may be used after %qD")
3913 1.1 mrg : G_("pointer %qE used after %qD")),
3914 1.1 mrg ref, inval_decl))
3915 1.1 mrg || (!ref && warning_at (use_loc, OPT_Wuse_after_free,
3916 1.1 mrg (maybe
3917 1.1 mrg ? G_("pointer may be used after %qD")
3918 1.1 mrg : G_("pointer used after %qD")),
3919 1.1 mrg inval_decl)))
3920 1.1 mrg {
3921 1.1 mrg location_t loc = gimple_location (inval_stmt);
3922 1.1 mrg inform (loc, "call to %qD here", inval_decl);
3923 1.1 mrg suppress_warning (use_stmt, OPT_Wuse_after_free);
3924 1.1 mrg }
3925 1.1 mrg return;
3926 1.1 mrg }
3927 1.1 mrg
3928 1.1 mrg if (equality
3929 1.1 mrg || (maybe && warn_dangling_pointer < 2)
3930 1.1 mrg || warning_suppressed_p (use_stmt, OPT_Wdangling_pointer_))
3931 1.1 mrg return;
3932 1.1 mrg
3933 1.1 mrg if (DECL_NAME (var))
3934 1.1 mrg {
3935 1.1 mrg if ((ref
3936 1.1 mrg && warning_at (use_loc, OPT_Wdangling_pointer_,
3937 1.1 mrg (maybe
3938 1.1 mrg ? G_("dangling pointer %qE to %qD may be used")
3939 1.1 mrg : G_("using dangling pointer %qE to %qD")),
3940 1.1 mrg ref, var))
3941 1.1 mrg || (!ref
3942 1.1 mrg && warning_at (use_loc, OPT_Wdangling_pointer_,
3943 1.1 mrg (maybe
3944 1.1 mrg ? G_("dangling pointer to %qD may be used")
3945 1.1 mrg : G_("using a dangling pointer to %qD")),
3946 1.1 mrg var)))
3947 1.1 mrg inform (DECL_SOURCE_LOCATION (var),
3948 1.1 mrg "%qD declared here", var);
3949 1.1 mrg suppress_warning (use_stmt, OPT_Wdangling_pointer_);
3950 1.1 mrg return;
3951 1.1 mrg }
3952 1.1 mrg
3953 1.1 mrg if ((ref
3954 1.1 mrg && warning_at (use_loc, OPT_Wdangling_pointer_,
3955 1.1 mrg (maybe
3956 1.1 mrg ? G_("dangling pointer %qE to an unnamed temporary "
3957 1.1 mrg "may be used")
3958 1.1 mrg : G_("using dangling pointer %qE to an unnamed "
3959 1.1 mrg "temporary")),
3960 1.1 mrg ref))
3961 1.1 mrg || (!ref
3962 1.1 mrg && warning_at (use_loc, OPT_Wdangling_pointer_,
3963 1.1 mrg (maybe
3964 1.1 mrg ? G_("dangling pointer to an unnamed temporary "
3965 1.1 mrg "may be used")
3966 1.1 mrg : G_("using a dangling pointer to an unnamed "
3967 1.1 mrg "temporary")))))
3968 1.1 mrg {
3969 1.1 mrg inform (DECL_SOURCE_LOCATION (var),
3970 1.1 mrg "unnamed temporary defined here");
3971 1.1 mrg suppress_warning (use_stmt, OPT_Wdangling_pointer_);
3972 1.1 mrg }
3973 1.1 mrg }
3974 1.1 mrg
3975 1.1 mrg /* If STMT is a call to either the standard realloc or to a user-defined
3976 1.1 mrg reallocation function returns its LHS and set *PTR to the reallocated
3977 1.1 mrg pointer. Otherwise return null. */
3978 1.1 mrg
3979 1.1 mrg static tree
3980 1.1 mrg get_realloc_lhs (gimple *stmt, tree *ptr)
3981 1.1 mrg {
3982 1.1 mrg if (gimple_call_builtin_p (stmt, BUILT_IN_REALLOC))
3983 1.1 mrg {
3984 1.1 mrg *ptr = gimple_call_arg (stmt, 0);
3985 1.1 mrg return gimple_call_lhs (stmt);
3986 1.1 mrg }
3987 1.1 mrg
3988 1.1 mrg gcall *call = dyn_cast<gcall *>(stmt);
3989 1.1 mrg if (!call)
3990 1.1 mrg return NULL_TREE;
3991 1.1 mrg
3992 1.1 mrg tree fnattr = NULL_TREE;
3993 1.1 mrg tree fndecl = gimple_call_fndecl (call);
3994 1.1 mrg if (fndecl)
3995 1.1 mrg fnattr = DECL_ATTRIBUTES (fndecl);
3996 1.1 mrg else
3997 1.1 mrg {
3998 1.1 mrg tree fntype = gimple_call_fntype (stmt);
3999 1.1 mrg if (!fntype)
4000 1.1 mrg return NULL_TREE;
4001 1.1 mrg fnattr = TYPE_ATTRIBUTES (fntype);
4002 1.1 mrg }
4003 1.1 mrg
4004 1.1 mrg if (!fnattr)
4005 1.1 mrg return NULL_TREE;
4006 1.1 mrg
4007 1.1 mrg for (tree ats = fnattr; (ats = lookup_attribute ("*dealloc", ats));
4008 1.1 mrg ats = TREE_CHAIN (ats))
4009 1.1 mrg {
4010 1.1 mrg tree args = TREE_VALUE (ats);
4011 1.1 mrg if (!args)
4012 1.1 mrg continue;
4013 1.1 mrg
4014 1.1 mrg tree alloc = TREE_VALUE (args);
4015 1.1 mrg if (!alloc)
4016 1.1 mrg continue;
4017 1.1 mrg
4018 1.1 mrg if (alloc == DECL_NAME (fndecl))
4019 1.1 mrg {
4020 1.1 mrg unsigned argno = 0;
4021 1.1 mrg if (tree index = TREE_CHAIN (args))
4022 1.1 mrg argno = TREE_INT_CST_LOW (TREE_VALUE (index)) - 1;
4023 1.1 mrg *ptr = gimple_call_arg (stmt, argno);
4024 1.1 mrg return gimple_call_lhs (stmt);
4025 1.1 mrg }
4026 1.1 mrg }
4027 1.1 mrg
4028 1.1 mrg return NULL_TREE;
4029 1.1 mrg }
4030 1.1 mrg
4031 1.1 mrg /* Warn if STMT is a call to a deallocation function that's not a match
4032 1.1 mrg for the REALLOC_STMT call. Return true if warned. */
4033 1.1 mrg
4034 1.1 mrg static bool
4035 1.1 mrg maybe_warn_mismatched_realloc (tree ptr, gimple *realloc_stmt, gimple *stmt)
4036 1.1 mrg {
4037 1.1 mrg if (!is_gimple_call (stmt))
4038 1.1 mrg return false;
4039 1.1 mrg
4040 1.1 mrg tree fndecl = gimple_call_fndecl (stmt);
4041 1.1 mrg if (!fndecl)
4042 1.1 mrg return false;
4043 1.1 mrg
4044 1.1 mrg unsigned argno = fndecl_dealloc_argno (fndecl);
4045 1.1 mrg if (call_nargs (stmt) <= argno)
4046 1.1 mrg return false;
4047 1.1 mrg
4048 1.1 mrg if (matching_alloc_calls_p (realloc_stmt, fndecl))
4049 1.1 mrg return false;
4050 1.1 mrg
4051 1.1 mrg /* Avoid printing the unhelpful "<unknown>" in the diagnostics. */
4052 1.1 mrg if (ptr && TREE_CODE (ptr) == SSA_NAME
4053 1.1 mrg && (!SSA_NAME_VAR (ptr) || DECL_ARTIFICIAL (SSA_NAME_VAR (ptr))))
4054 1.1 mrg ptr = NULL_TREE;
4055 1.1 mrg
4056 1.1 mrg location_t loc = gimple_location (stmt);
4057 1.1 mrg tree realloc_decl = gimple_call_fndecl (realloc_stmt);
4058 1.1 mrg tree dealloc_decl = gimple_call_fndecl (stmt);
4059 1.1 mrg if (ptr && !warning_at (loc, OPT_Wmismatched_dealloc,
4060 1.1 mrg "%qD called on pointer %qE passed to mismatched "
4061 1.1 mrg "allocation function %qD",
4062 1.1 mrg dealloc_decl, ptr, realloc_decl))
4063 1.1 mrg return false;
4064 1.1 mrg if (!ptr && !warning_at (loc, OPT_Wmismatched_dealloc,
4065 1.1 mrg "%qD called on a pointer passed to mismatched "
4066 1.1 mrg "reallocation function %qD",
4067 1.1 mrg dealloc_decl, realloc_decl))
4068 1.1 mrg return false;
4069 1.1 mrg
4070 1.1 mrg inform (gimple_location (realloc_stmt),
4071 1.1 mrg "call to %qD", realloc_decl);
4072 1.1 mrg return true;
4073 1.1 mrg }
4074 1.1 mrg
4075 1.1 mrg /* Return true if P and Q point to the same object, and false if they
4076 1.1 mrg either don't or their relationship cannot be determined. */
4077 1.1 mrg
4078 1.1 mrg static bool
4079 1.1 mrg pointers_related_p (gimple *stmt, tree p, tree q, pointer_query &qry,
4080 1.1 mrg auto_bitmap &visited)
4081 1.1 mrg {
4082 1.1 mrg if (!ptr_derefs_may_alias_p (p, q))
4083 1.1 mrg return false;
4084 1.1 mrg
4085 1.1 mrg /* TODO: Work harder to rule out relatedness. */
4086 1.1 mrg access_ref pref, qref;
4087 1.1 mrg if (!qry.get_ref (p, stmt, &pref, 0)
4088 1.1 mrg || !qry.get_ref (q, stmt, &qref, 0))
4089 1.1 mrg /* GET_REF() only rarely fails. When it does, it's likely because
4090 1.1 mrg it involves a self-referential PHI. Return a conservative result. */
4091 1.1 mrg return false;
4092 1.1 mrg
4093 1.1 mrg if (pref.ref == qref.ref)
4094 1.1 mrg return true;
4095 1.1 mrg
4096 1.1 mrg /* If either pointer is a PHI, iterate over all its operands and
4097 1.1 mrg return true if they're all related to the other pointer. */
4098 1.1 mrg tree ptr = q;
4099 1.1 mrg unsigned version;
4100 1.1 mrg gphi *phi = pref.phi ();
4101 1.1 mrg if (phi)
4102 1.1 mrg version = SSA_NAME_VERSION (pref.ref);
4103 1.1 mrg else
4104 1.1 mrg {
4105 1.1 mrg phi = qref.phi ();
4106 1.1 mrg if (!phi)
4107 1.1 mrg return false;
4108 1.1 mrg
4109 1.1 mrg ptr = p;
4110 1.1 mrg version = SSA_NAME_VERSION (qref.ref);
4111 1.1 mrg }
4112 1.1 mrg
4113 1.1 mrg if (!bitmap_set_bit (visited, version))
4114 1.1 mrg return true;
4115 1.1 mrg
4116 1.1 mrg unsigned nargs = gimple_phi_num_args (phi);
4117 1.1 mrg for (unsigned i = 0; i != nargs; ++i)
4118 1.1 mrg {
4119 1.1 mrg tree arg = gimple_phi_arg_def (phi, i);
4120 1.1 mrg if (!pointers_related_p (stmt, arg, ptr, qry, visited))
4121 1.1 mrg return false;
4122 1.1 mrg }
4123 1.1 mrg
4124 1.1 mrg return true;
4125 1.1 mrg }
4126 1.1 mrg
4127 1.1 mrg /* Convenience wrapper for the above. */
4128 1.1 mrg
4129 1.1 mrg static bool
4130 1.1 mrg pointers_related_p (gimple *stmt, tree p, tree q, pointer_query &qry)
4131 1.1 mrg {
4132 1.1 mrg auto_bitmap visited;
4133 1.1 mrg return pointers_related_p (stmt, p, q, qry, visited);
4134 1.1 mrg }
4135 1.1 mrg
4136 1.1 mrg /* For a STMT either a call to a deallocation function or a clobber, warn
4137 1.1 mrg for uses of the pointer PTR it was called with (including its copies
4138 1.1 mrg or others derived from it by pointer arithmetic). If STMT is a clobber,
4139 1.1 mrg VAR is the decl of the clobbered variable. When MAYBE is true use
4140 1.1 mrg a "maybe" form of diagnostic. */
4141 1.1 mrg
4142 1.1 mrg void
4143 1.1 mrg pass_waccess::check_pointer_uses (gimple *stmt, tree ptr,
4144 1.1 mrg tree var /* = NULL_TREE */,
4145 1.1 mrg bool maybe /* = false */)
4146 1.1 mrg {
4147 1.1 mrg gcc_assert (TREE_CODE (ptr) == SSA_NAME);
4148 1.1 mrg
4149 1.1 mrg const bool check_dangling = !is_gimple_call (stmt);
4150 1.1 mrg basic_block stmt_bb = gimple_bb (stmt);
4151 1.1 mrg
4152 1.1 mrg /* If STMT is a reallocation function set to the reallocated pointer
4153 1.1 mrg and the LHS of the call, respectively. */
4154 1.1 mrg tree realloc_ptr = NULL_TREE;
4155 1.1 mrg tree realloc_lhs = get_realloc_lhs (stmt, &realloc_ptr);
4156 1.1 mrg
4157 1.1 mrg auto_bitmap visited;
4158 1.1 mrg
4159 1.1 mrg auto_vec<tree> pointers;
4160 1.1 mrg pointers.safe_push (ptr);
4161 1.1 mrg
4162 1.1 mrg /* Starting with PTR, iterate over POINTERS added by the loop, and
4163 1.1 mrg either warn for their uses in basic blocks dominated by the STMT
4164 1.1 mrg or in statements that follow it in the same basic block, or add
4165 1.1 mrg them to POINTERS if they point into the same object as PTR (i.e.,
4166 1.1 mrg are obtained by pointer arithmetic on PTR). */
4167 1.1 mrg for (unsigned i = 0; i != pointers.length (); ++i)
4168 1.1 mrg {
4169 1.1 mrg tree ptr = pointers[i];
4170 1.1 mrg if (!bitmap_set_bit (visited, SSA_NAME_VERSION (ptr)))
4171 1.1 mrg /* Avoid revisiting the same pointer. */
4172 1.1 mrg continue;
4173 1.1 mrg
4174 1.1 mrg use_operand_p use_p;
4175 1.1 mrg imm_use_iterator iter;
4176 1.1 mrg FOR_EACH_IMM_USE_FAST (use_p, iter, ptr)
4177 1.1 mrg {
4178 1.1 mrg gimple *use_stmt = USE_STMT (use_p);
4179 1.1 mrg if (use_stmt == stmt || is_gimple_debug (use_stmt))
4180 1.1 mrg continue;
4181 1.1 mrg
4182 1.1 mrg if (realloc_lhs)
4183 1.1 mrg {
4184 1.1 mrg /* Check to see if USE_STMT is a mismatched deallocation
4185 1.1 mrg call for the pointer passed to realloc. That's a bug
4186 1.1 mrg regardless of the pointer's value and so warn. */
4187 1.1 mrg if (maybe_warn_mismatched_realloc (*use_p->use, stmt, use_stmt))
4188 1.1 mrg continue;
4189 1.1 mrg
4190 1.1 mrg /* Pointers passed to realloc that are used in basic blocks
4191 1.1 mrg where the realloc call is known to have failed are valid.
4192 1.1 mrg Ignore pointers that nothing is known about. Those could
4193 1.1 mrg have escaped along with their nullness. */
4194 1.1 mrg value_range vr;
4195 1.1 mrg if (m_ptr_qry.rvals->range_of_expr (vr, realloc_lhs, use_stmt))
4196 1.1 mrg {
4197 1.1 mrg if (vr.zero_p ())
4198 1.1 mrg continue;
4199 1.1 mrg
4200 1.1 mrg if (!pointers_related_p (stmt, ptr, realloc_ptr, m_ptr_qry))
4201 1.1 mrg continue;
4202 1.1 mrg }
4203 1.1 mrg }
4204 1.1 mrg
4205 1.1 mrg if (check_dangling
4206 1.1 mrg && gimple_code (use_stmt) == GIMPLE_RETURN)
4207 1.1 mrg /* Avoid interfering with -Wreturn-local-addr (which runs only
4208 1.1 mrg with optimization enabled so it won't diagnose cases that
4209 1.1 mrg would be caught here when optimization is disabled). */
4210 1.1 mrg continue;
4211 1.1 mrg
4212 1.1 mrg bool equality = false;
4213 1.1 mrg if (is_gimple_assign (use_stmt))
4214 1.1 mrg {
4215 1.1 mrg tree_code code = gimple_assign_rhs_code (use_stmt);
4216 1.1 mrg equality = code == EQ_EXPR || code == NE_EXPR;
4217 1.1 mrg }
4218 1.1 mrg else if (gcond *cond = dyn_cast<gcond *>(use_stmt))
4219 1.1 mrg {
4220 1.1 mrg tree_code code = gimple_cond_code (cond);
4221 1.1 mrg equality = code == EQ_EXPR || code == NE_EXPR;
4222 1.1 mrg }
4223 1.1 mrg
4224 1.1 mrg /* Warn if USE_STMT is dominated by the deallocation STMT.
4225 1.1 mrg Otherwise, add the pointer to POINTERS so that the uses
4226 1.1 mrg of any other pointers derived from it can be checked. */
4227 1.1 mrg if (use_after_inval_p (stmt, use_stmt, check_dangling))
4228 1.1 mrg {
4229 1.1 mrg if (gimple_code (use_stmt) == GIMPLE_PHI)
4230 1.1 mrg {
4231 1.1 mrg /* Only add a PHI result to POINTERS if all its
4232 1.1 mrg operands are related to PTR, otherwise continue. */
4233 1.1 mrg tree lhs = gimple_phi_result (use_stmt);
4234 1.1 mrg if (!pointers_related_p (stmt, lhs, ptr, m_ptr_qry))
4235 1.1 mrg continue;
4236 1.1 mrg
4237 1.1 mrg if (TREE_CODE (lhs) == SSA_NAME)
4238 1.1 mrg {
4239 1.1 mrg pointers.safe_push (lhs);
4240 1.1 mrg continue;
4241 1.1 mrg }
4242 1.1 mrg }
4243 1.1 mrg
4244 1.1 mrg basic_block use_bb = gimple_bb (use_stmt);
4245 1.1 mrg bool this_maybe
4246 1.1 mrg = (maybe
4247 1.1 mrg || !dominated_by_p (CDI_POST_DOMINATORS, stmt_bb, use_bb));
4248 1.1 mrg warn_invalid_pointer (*use_p->use, use_stmt, stmt, var,
4249 1.1 mrg this_maybe, equality);
4250 1.1 mrg continue;
4251 1.1 mrg }
4252 1.1 mrg
4253 1.1 mrg if (is_gimple_assign (use_stmt))
4254 1.1 mrg {
4255 1.1 mrg tree lhs = gimple_assign_lhs (use_stmt);
4256 1.1 mrg if (TREE_CODE (lhs) == SSA_NAME)
4257 1.1 mrg {
4258 1.1 mrg tree_code rhs_code = gimple_assign_rhs_code (use_stmt);
4259 1.1 mrg if (rhs_code == POINTER_PLUS_EXPR || rhs_code == SSA_NAME)
4260 1.1 mrg pointers.safe_push (lhs);
4261 1.1 mrg }
4262 1.1 mrg continue;
4263 1.1 mrg }
4264 1.1 mrg
4265 1.1 mrg if (gcall *call = dyn_cast <gcall *>(use_stmt))
4266 1.1 mrg {
4267 1.1 mrg if (gimple_call_return_arg (call) == ptr)
4268 1.1 mrg if (tree lhs = gimple_call_lhs (call))
4269 1.1 mrg if (TREE_CODE (lhs) == SSA_NAME)
4270 1.1 mrg pointers.safe_push (lhs);
4271 1.1 mrg continue;
4272 1.1 mrg }
4273 1.1 mrg }
4274 1.1 mrg }
4275 1.1 mrg }
4276 1.1 mrg
4277 1.1 mrg /* Check call STMT for invalid accesses. */
4278 1.1 mrg
4279 1.1 mrg void
4280 1.1 mrg pass_waccess::check_call (gcall *stmt)
4281 1.1 mrg {
4282 1.1 mrg if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
4283 1.1 mrg check_builtin (stmt);
4284 1.1 mrg
4285 1.1 mrg /* .ASAN_MARK doesn't access any vars, only modifies shadow memory. */
4286 1.1 mrg if (gimple_call_internal_p (stmt)
4287 1.1 mrg && gimple_call_internal_fn (stmt) == IFN_ASAN_MARK)
4288 1.1 mrg return;
4289 1.1 mrg
4290 1.1 mrg if (!m_early_checks_p)
4291 1.1 mrg if (tree callee = gimple_call_fndecl (stmt))
4292 1.1 mrg {
4293 1.1 mrg /* Check for uses of the pointer passed to either a standard
4294 1.1 mrg or a user-defined deallocation function. */
4295 1.1 mrg unsigned argno = fndecl_dealloc_argno (callee);
4296 1.1 mrg if (argno < (unsigned) call_nargs (stmt))
4297 1.1 mrg {
4298 1.1 mrg tree arg = call_arg (stmt, argno);
4299 1.1 mrg if (TREE_CODE (arg) == SSA_NAME)
4300 1.1 mrg check_pointer_uses (stmt, arg);
4301 1.1 mrg }
4302 1.1 mrg }
4303 1.1 mrg
4304 1.1 mrg check_call_access (stmt);
4305 1.1 mrg check_call_dangling (stmt);
4306 1.1 mrg
4307 1.1 mrg if (m_early_checks_p)
4308 1.1 mrg return;
4309 1.1 mrg
4310 1.1 mrg maybe_check_dealloc_call (stmt);
4311 1.1 mrg check_nonstring_args (stmt);
4312 1.1 mrg }
4313 1.1 mrg
4314 1.1 mrg /* Check non-call STMT for invalid accesses. */
4315 1.1 mrg
4316 1.1 mrg void
4317 1.1 mrg pass_waccess::check_stmt (gimple *stmt)
4318 1.1 mrg {
4319 1.1 mrg if (m_check_dangling_p
4320 1.1 mrg && gimple_clobber_p (stmt, CLOBBER_EOL))
4321 1.1 mrg {
4322 1.1 mrg /* Ignore clobber statements in blocks with exceptional edges. */
4323 1.1 mrg basic_block bb = gimple_bb (stmt);
4324 1.1 mrg edge e = EDGE_PRED (bb, 0);
4325 1.1 mrg if (e->flags & EDGE_EH)
4326 1.1 mrg return;
4327 1.1 mrg
4328 1.1 mrg tree var = gimple_assign_lhs (stmt);
4329 1.1 mrg m_clobbers.put (var, stmt);
4330 1.1 mrg return;
4331 1.1 mrg }
4332 1.1 mrg
4333 1.1 mrg if (is_gimple_assign (stmt))
4334 1.1 mrg {
4335 1.1 mrg /* Clobbered unnamed temporaries such as compound literals can be
4336 1.1 mrg revived. Check for an assignment to one and remove it from
4337 1.1 mrg M_CLOBBERS. */
4338 1.1 mrg tree lhs = gimple_assign_lhs (stmt);
4339 1.1 mrg while (handled_component_p (lhs))
4340 1.1 mrg lhs = TREE_OPERAND (lhs, 0);
4341 1.1 mrg
4342 1.1 mrg if (auto_var_p (lhs))
4343 1.1 mrg m_clobbers.remove (lhs);
4344 1.1 mrg return;
4345 1.1 mrg }
4346 1.1 mrg
4347 1.1 mrg if (greturn *ret = dyn_cast <greturn *> (stmt))
4348 1.1 mrg {
4349 1.1 mrg if (optimize && flag_isolate_erroneous_paths_dereference)
4350 1.1 mrg /* Avoid interfering with -Wreturn-local-addr (which runs only
4351 1.1 mrg with optimization enabled). */
4352 1.1 mrg return;
4353 1.1 mrg
4354 1.1 mrg tree arg = gimple_return_retval (ret);
4355 1.1 mrg if (!arg || TREE_CODE (arg) != ADDR_EXPR)
4356 1.1 mrg return;
4357 1.1 mrg
4358 1.1 mrg arg = TREE_OPERAND (arg, 0);
4359 1.1 mrg while (handled_component_p (arg))
4360 1.1 mrg arg = TREE_OPERAND (arg, 0);
4361 1.1 mrg
4362 1.1 mrg if (!auto_var_p (arg))
4363 1.1 mrg return;
4364 1.1 mrg
4365 1.1 mrg gimple **pclobber = m_clobbers.get (arg);
4366 1.1 mrg if (!pclobber)
4367 1.1 mrg return;
4368 1.1 mrg
4369 1.1 mrg if (!use_after_inval_p (*pclobber, stmt))
4370 1.1 mrg return;
4371 1.1 mrg
4372 1.1 mrg warn_invalid_pointer (NULL_TREE, stmt, *pclobber, arg, false);
4373 1.1 mrg }
4374 1.1 mrg }
4375 1.1 mrg
4376 1.1 mrg /* Check basic block BB for invalid accesses. */
4377 1.1 mrg
4378 1.1 mrg void
4379 1.1 mrg pass_waccess::check_block (basic_block bb)
4380 1.1 mrg {
4381 1.1 mrg /* Iterate over statements, looking for function calls. */
4382 1.1 mrg for (auto si = gsi_start_bb (bb); !gsi_end_p (si);
4383 1.1 mrg gsi_next_nondebug (&si))
4384 1.1 mrg {
4385 1.1 mrg gimple *stmt = gsi_stmt (si);
4386 1.1 mrg if (gcall *call = dyn_cast <gcall *> (stmt))
4387 1.1 mrg check_call (call);
4388 1.1 mrg else
4389 1.1 mrg check_stmt (stmt);
4390 1.1 mrg }
4391 1.1 mrg }
4392 1.1 mrg
4393 1.1 mrg /* Return the argument that the call STMT to a built-in function returns
4394 1.1 mrg (including with an offset) or null if it doesn't. */
4395 1.1 mrg
4396 1.1 mrg tree
4397 1.1 mrg pass_waccess::gimple_call_return_arg (gcall *call)
4398 1.1 mrg {
4399 1.1 mrg /* Check for attribute fn spec to see if the function returns one
4400 1.1 mrg of its arguments. */
4401 1.1 mrg attr_fnspec fnspec = gimple_call_fnspec (call);
4402 1.1 mrg unsigned int argno;
4403 1.1 mrg if (!fnspec.returns_arg (&argno))
4404 1.1 mrg {
4405 1.1 mrg if (gimple_call_num_args (call) < 1)
4406 1.1 mrg return NULL_TREE;
4407 1.1 mrg
4408 1.1 mrg if (!gimple_call_builtin_p (call, BUILT_IN_NORMAL))
4409 1.1 mrg return NULL_TREE;
4410 1.1 mrg
4411 1.1 mrg tree fndecl = gimple_call_fndecl (call);
4412 1.1 mrg switch (DECL_FUNCTION_CODE (fndecl))
4413 1.1 mrg {
4414 1.1 mrg case BUILT_IN_MEMPCPY:
4415 1.1 mrg case BUILT_IN_MEMPCPY_CHK:
4416 1.1 mrg case BUILT_IN_MEMCHR:
4417 1.1 mrg case BUILT_IN_STRCHR:
4418 1.1 mrg case BUILT_IN_STRRCHR:
4419 1.1 mrg case BUILT_IN_STRSTR:
4420 1.1 mrg case BUILT_IN_STPCPY:
4421 1.1 mrg case BUILT_IN_STPCPY_CHK:
4422 1.1 mrg case BUILT_IN_STPNCPY:
4423 1.1 mrg case BUILT_IN_STPNCPY_CHK:
4424 1.1 mrg argno = 0;
4425 1.1 mrg break;
4426 1.1 mrg
4427 1.1 mrg default:
4428 1.1 mrg return NULL_TREE;
4429 1.1 mrg }
4430 1.1 mrg }
4431 1.1 mrg
4432 1.1 mrg if (gimple_call_num_args (call) <= argno)
4433 1.1 mrg return NULL_TREE;
4434 1.1 mrg
4435 1.1 mrg return gimple_call_arg (call, argno);
4436 1.1 mrg }
4437 1.1 mrg
4438 1.1 mrg /* Check for and diagnose all uses of the dangling pointer VAR to the auto
4439 1.1 mrg object DECL whose lifetime has ended. OBJREF is true when VAR denotes
4440 1.1 mrg an access to a DECL that may have been clobbered. */
4441 1.1 mrg
4442 1.1 mrg void
4443 1.1 mrg pass_waccess::check_dangling_uses (tree var, tree decl, bool maybe /* = false */,
4444 1.1 mrg bool objref /* = false */)
4445 1.1 mrg {
4446 1.1 mrg if (!decl || !auto_var_p (decl))
4447 1.1 mrg return;
4448 1.1 mrg
4449 1.1 mrg gimple **pclob = m_clobbers.get (decl);
4450 1.1 mrg if (!pclob)
4451 1.1 mrg return;
4452 1.1 mrg
4453 1.1 mrg if (!objref)
4454 1.1 mrg {
4455 1.1 mrg check_pointer_uses (*pclob, var, decl, maybe);
4456 1.1 mrg return;
4457 1.1 mrg }
4458 1.1 mrg
4459 1.1 mrg gimple *use_stmt = SSA_NAME_DEF_STMT (var);
4460 1.1 mrg if (!use_after_inval_p (*pclob, use_stmt, true))
4461 1.1 mrg return;
4462 1.1 mrg
4463 1.1 mrg basic_block use_bb = gimple_bb (use_stmt);
4464 1.1 mrg basic_block clob_bb = gimple_bb (*pclob);
4465 1.1 mrg maybe = maybe || !dominated_by_p (CDI_POST_DOMINATORS, clob_bb, use_bb);
4466 1.1 mrg warn_invalid_pointer (var, use_stmt, *pclob, decl, maybe, false);
4467 1.1 mrg }
4468 1.1 mrg
4469 1.1 mrg /* Diagnose stores in BB and (recursively) its predecessors of the addresses
4470 1.1 mrg of local variables into nonlocal pointers that are left dangling after
4471 1.1 mrg the function returns. BBS is a bitmap of basic blocks visited. */
4472 1.1 mrg
4473 1.1 mrg void
4474 1.1 mrg pass_waccess::check_dangling_stores (basic_block bb,
4475 1.1 mrg hash_set<tree> &stores,
4476 1.1 mrg auto_bitmap &bbs)
4477 1.1 mrg {
4478 1.1 mrg if (!bitmap_set_bit (bbs, bb->index))
4479 1.1 mrg /* Avoid cycles. */
4480 1.1 mrg return;
4481 1.1 mrg
4482 1.1 mrg /* Iterate backwards over the statements looking for a store of
4483 1.1 mrg the address of a local variable into a nonlocal pointer. */
4484 1.1 mrg for (auto gsi = gsi_last_nondebug_bb (bb); ; gsi_prev_nondebug (&gsi))
4485 1.1 mrg {
4486 1.1 mrg gimple *stmt = gsi_stmt (gsi);
4487 1.1 mrg if (!stmt)
4488 1.1 mrg break;
4489 1.1 mrg
4490 1.1 mrg if (warning_suppressed_p (stmt, OPT_Wdangling_pointer_))
4491 1.1 mrg continue;
4492 1.1 mrg
4493 1.1 mrg if (is_gimple_call (stmt)
4494 1.1 mrg && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
4495 1.1 mrg /* Avoid looking before nonconst, nonpure calls since those might
4496 1.1 mrg use the escaped locals. */
4497 1.1 mrg return;
4498 1.1 mrg
4499 1.1 mrg if (!is_gimple_assign (stmt) || gimple_clobber_p (stmt))
4500 1.1 mrg continue;
4501 1.1 mrg
4502 1.1 mrg access_ref lhs_ref;
4503 1.1 mrg tree lhs = gimple_assign_lhs (stmt);
4504 1.1 mrg if (!m_ptr_qry.get_ref (lhs, stmt, &lhs_ref, 0))
4505 1.1 mrg continue;
4506 1.1 mrg
4507 1.1 mrg if (auto_var_p (lhs_ref.ref))
4508 1.1 mrg continue;
4509 1.1 mrg
4510 1.1 mrg if (DECL_P (lhs_ref.ref))
4511 1.1 mrg {
4512 1.1 mrg if (!POINTER_TYPE_P (TREE_TYPE (lhs_ref.ref))
4513 1.1 mrg || lhs_ref.deref > 0)
4514 1.1 mrg continue;
4515 1.1 mrg }
4516 1.1 mrg else if (TREE_CODE (lhs_ref.ref) == SSA_NAME)
4517 1.1 mrg {
4518 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (lhs_ref.ref);
4519 1.1 mrg if (!gimple_nop_p (def_stmt))
4520 1.1 mrg /* Avoid looking at or before stores into unknown objects. */
4521 1.1 mrg return;
4522 1.1 mrg
4523 1.1 mrg tree var = SSA_NAME_VAR (lhs_ref.ref);
4524 1.1 mrg if (TREE_CODE (var) == PARM_DECL && DECL_BY_REFERENCE (var))
4525 1.1 mrg /* Avoid by-value arguments transformed into by-reference. */
4526 1.1 mrg continue;
4527 1.1 mrg
4528 1.1 mrg }
4529 1.1 mrg else if (TREE_CODE (lhs_ref.ref) == MEM_REF)
4530 1.1 mrg {
4531 1.1 mrg tree arg = TREE_OPERAND (lhs_ref.ref, 0);
4532 1.1 mrg if (TREE_CODE (arg) == SSA_NAME)
4533 1.1 mrg {
4534 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
4535 1.1 mrg if (!gimple_nop_p (def_stmt))
4536 1.1 mrg return;
4537 1.1 mrg }
4538 1.1 mrg }
4539 1.1 mrg else
4540 1.1 mrg continue;
4541 1.1 mrg
4542 1.1 mrg if (stores.add (lhs_ref.ref))
4543 1.1 mrg continue;
4544 1.1 mrg
4545 1.1 mrg /* FIXME: Handle stores of alloca() and VLA. */
4546 1.1 mrg access_ref rhs_ref;
4547 1.1 mrg tree rhs = gimple_assign_rhs1 (stmt);
4548 1.1 mrg if (!m_ptr_qry.get_ref (rhs, stmt, &rhs_ref, 0)
4549 1.1 mrg || rhs_ref.deref != -1)
4550 1.1 mrg continue;
4551 1.1 mrg
4552 1.1 mrg if (!auto_var_p (rhs_ref.ref))
4553 1.1 mrg continue;
4554 1.1 mrg
4555 1.1 mrg location_t loc = gimple_location (stmt);
4556 1.1 mrg if (warning_at (loc, OPT_Wdangling_pointer_,
4557 1.1 mrg "storing the address of local variable %qD in %qE",
4558 1.1 mrg rhs_ref.ref, lhs))
4559 1.1 mrg {
4560 1.1 mrg suppress_warning (stmt, OPT_Wdangling_pointer_);
4561 1.1 mrg
4562 1.1 mrg location_t loc = DECL_SOURCE_LOCATION (rhs_ref.ref);
4563 1.1 mrg inform (loc, "%qD declared here", rhs_ref.ref);
4564 1.1 mrg
4565 1.1 mrg if (DECL_P (lhs_ref.ref))
4566 1.1 mrg loc = DECL_SOURCE_LOCATION (lhs_ref.ref);
4567 1.1 mrg else if (EXPR_HAS_LOCATION (lhs_ref.ref))
4568 1.1 mrg loc = EXPR_LOCATION (lhs_ref.ref);
4569 1.1 mrg
4570 1.1 mrg if (loc != UNKNOWN_LOCATION)
4571 1.1 mrg inform (loc, "%qE declared here", lhs_ref.ref);
4572 1.1 mrg }
4573 1.1 mrg }
4574 1.1 mrg
4575 1.1 mrg edge e;
4576 1.1 mrg edge_iterator ei;
4577 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
4578 1.1 mrg {
4579 1.1 mrg basic_block pred = e->src;
4580 1.1 mrg check_dangling_stores (pred, stores, bbs);
4581 1.1 mrg }
4582 1.1 mrg }
4583 1.1 mrg
4584 1.1 mrg /* Diagnose stores of the addresses of local variables into nonlocal
4585 1.1 mrg pointers that are left dangling after the function returns. */
4586 1.1 mrg
4587 1.1 mrg void
4588 1.1 mrg pass_waccess::check_dangling_stores ()
4589 1.1 mrg {
4590 1.1 mrg auto_bitmap bbs;
4591 1.1 mrg hash_set<tree> stores;
4592 1.1 mrg check_dangling_stores (EXIT_BLOCK_PTR_FOR_FN (m_func), stores, bbs);
4593 1.1 mrg }
4594 1.1 mrg
4595 1.1 mrg /* Check for and diagnose uses of dangling pointers to auto objects
4596 1.1 mrg whose lifetime has ended. */
4597 1.1 mrg
4598 1.1 mrg void
4599 1.1 mrg pass_waccess::check_dangling_uses ()
4600 1.1 mrg {
4601 1.1 mrg tree var;
4602 1.1 mrg unsigned i;
4603 1.1 mrg FOR_EACH_SSA_NAME (i, var, m_func)
4604 1.1 mrg {
4605 1.1 mrg /* For each SSA_NAME pointer VAR find the object it points to.
4606 1.1 mrg If the object is a clobbered local variable, check to see
4607 1.1 mrg if any of VAR's uses (or those of other pointers derived
4608 1.1 mrg from VAR) happens after the clobber. If so, warn. */
4609 1.1 mrg
4610 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (var);
4611 1.1 mrg if (is_gimple_assign (def_stmt))
4612 1.1 mrg {
4613 1.1 mrg tree rhs = gimple_assign_rhs1 (def_stmt);
4614 1.1 mrg if (TREE_CODE (rhs) == ADDR_EXPR)
4615 1.1 mrg {
4616 1.1 mrg if (!POINTER_TYPE_P (TREE_TYPE (var)))
4617 1.1 mrg continue;
4618 1.1 mrg check_dangling_uses (var, TREE_OPERAND (rhs, 0));
4619 1.1 mrg }
4620 1.1 mrg else
4621 1.1 mrg {
4622 1.1 mrg /* For other expressions, check the base DECL to see
4623 1.1 mrg if it's been clobbered, most likely as a result of
4624 1.1 mrg inlining a reference to it. */
4625 1.1 mrg tree decl = get_base_address (rhs);
4626 1.1 mrg if (DECL_P (decl))
4627 1.1 mrg check_dangling_uses (var, decl, false, true);
4628 1.1 mrg }
4629 1.1 mrg }
4630 1.1 mrg else if (POINTER_TYPE_P (TREE_TYPE (var)))
4631 1.1 mrg {
4632 1.1 mrg if (gcall *call = dyn_cast<gcall *>(def_stmt))
4633 1.1 mrg {
4634 1.1 mrg if (tree arg = gimple_call_return_arg (call))
4635 1.1 mrg {
4636 1.1 mrg access_ref aref;
4637 1.1 mrg if (m_ptr_qry.get_ref (arg, call, &aref, 0)
4638 1.1 mrg && aref.deref < 0)
4639 1.1 mrg check_dangling_uses (var, aref.ref);
4640 1.1 mrg }
4641 1.1 mrg }
4642 1.1 mrg else if (gphi *phi = dyn_cast <gphi *>(def_stmt))
4643 1.1 mrg {
4644 1.1 mrg unsigned nargs = gimple_phi_num_args (phi);
4645 1.1 mrg for (unsigned i = 0; i != nargs; ++i)
4646 1.1 mrg {
4647 1.1 mrg access_ref aref;
4648 1.1 mrg tree arg = gimple_phi_arg_def (phi, i);
4649 1.1 mrg if (m_ptr_qry.get_ref (arg, phi, &aref, 0)
4650 1.1 mrg && aref.deref < 0)
4651 1.1 mrg check_dangling_uses (var, aref.ref, true);
4652 1.1 mrg }
4653 1.1 mrg }
4654 1.1 mrg }
4655 1.1 mrg }
4656 1.1 mrg }
4657 1.1 mrg
4658 1.1 mrg /* Check CALL arguments for dangling pointers (those that have been
4659 1.1 mrg clobbered) and warn if found. */
4660 1.1 mrg
4661 1.1 mrg void
4662 1.1 mrg pass_waccess::check_call_dangling (gcall *call)
4663 1.1 mrg {
4664 1.1 mrg unsigned nargs = gimple_call_num_args (call);
4665 1.1 mrg for (unsigned i = 0; i != nargs; ++i)
4666 1.1 mrg {
4667 1.1 mrg tree arg = gimple_call_arg (call, i);
4668 1.1 mrg if (TREE_CODE (arg) != ADDR_EXPR)
4669 1.1 mrg continue;
4670 1.1 mrg
4671 1.1 mrg arg = TREE_OPERAND (arg, 0);
4672 1.1 mrg if (!DECL_P (arg))
4673 1.1 mrg continue;
4674 1.1 mrg
4675 1.1 mrg gimple **pclobber = m_clobbers.get (arg);
4676 1.1 mrg if (!pclobber)
4677 1.1 mrg continue;
4678 1.1 mrg
4679 1.1 mrg if (!use_after_inval_p (*pclobber, call))
4680 1.1 mrg continue;
4681 1.1 mrg
4682 1.1 mrg warn_invalid_pointer (NULL_TREE, call, *pclobber, arg, false);
4683 1.1 mrg }
4684 1.1 mrg }
4685 1.1 mrg
4686 1.1 mrg /* Check function FUN for invalid accesses. */
4687 1.1 mrg
4688 1.1 mrg unsigned
4689 1.1 mrg pass_waccess::execute (function *fun)
4690 1.1 mrg {
4691 1.1 mrg calculate_dominance_info (CDI_DOMINATORS);
4692 1.1 mrg calculate_dominance_info (CDI_POST_DOMINATORS);
4693 1.1 mrg
4694 1.1 mrg /* Set or clear EDGE_DFS_BACK bits on back edges. */
4695 1.1 mrg mark_dfs_back_edges (fun);
4696 1.1 mrg
4697 1.1 mrg /* Create a new ranger instance and associate it with FUN. */
4698 1.1 mrg m_ptr_qry.rvals = enable_ranger (fun);
4699 1.1 mrg m_func = fun;
4700 1.1 mrg
4701 1.1 mrg /* Check for dangling pointers in the earliest run of the pass.
4702 1.1 mrg The latest point -Wdangling-pointer should run is just before
4703 1.1 mrg loop unrolling which introduces uses after clobbers. Most cases
4704 1.1 mrg can be detected without optimization; cases where the address of
4705 1.1 mrg the local variable is passed to and then returned from a user-
4706 1.1 mrg defined function before its lifetime ends and the returned pointer
4707 1.1 mrg becomes dangling depend on inlining. */
4708 1.1 mrg m_check_dangling_p = m_early_checks_p;
4709 1.1 mrg
4710 1.1 mrg auto_bitmap bb_uids_set (&bitmap_default_obstack);
4711 1.1 mrg m_bb_uids_set = bb_uids_set;
4712 1.1 mrg
4713 1.1 mrg set_gimple_stmt_max_uid (m_func, 0);
4714 1.1 mrg
4715 1.1 mrg basic_block bb;
4716 1.1 mrg FOR_EACH_BB_FN (bb, fun)
4717 1.1 mrg check_block (bb);
4718 1.1 mrg
4719 1.1 mrg if (m_check_dangling_p)
4720 1.1 mrg {
4721 1.1 mrg check_dangling_uses ();
4722 1.1 mrg check_dangling_stores ();
4723 1.1 mrg }
4724 1.1 mrg
4725 1.1 mrg if (dump_file)
4726 1.1 mrg m_ptr_qry.dump (dump_file, (dump_flags & TDF_DETAILS) != 0);
4727 1.1 mrg
4728 1.1 mrg m_ptr_qry.flush_cache ();
4729 1.1 mrg
4730 1.1 mrg /* Release the ranger instance and replace it with a global ranger.
4731 1.1 mrg Also reset the pointer since calling disable_ranger() deletes it. */
4732 1.1 mrg disable_ranger (fun);
4733 1.1 mrg m_ptr_qry.rvals = NULL;
4734 1.1 mrg
4735 1.1 mrg m_clobbers.empty ();
4736 1.1 mrg m_bb_uids_set = NULL;
4737 1.1 mrg
4738 1.1 mrg free_dominance_info (CDI_POST_DOMINATORS);
4739 1.1 mrg free_dominance_info (CDI_DOMINATORS);
4740 1.1 mrg return 0;
4741 1.1 mrg }
4742 1.1 mrg
4743 1.1 mrg } // namespace
4744 1.1 mrg
4745 1.1 mrg /* Return a new instance of the pass. */
4746 1.1 mrg
4747 1.1 mrg gimple_opt_pass *
4748 1.1 mrg make_pass_warn_access (gcc::context *ctxt)
4749 1.1 mrg {
4750 1.1 mrg return new pass_waccess (ctxt);
4751 1.1 mrg }
4752