1 /* Predicate aware uninitialized variable warning.
2 Copyright (C) 2001-2021 Free Software Foundation, Inc.
3 Contributed by Xinliang David Li <davidxl@google.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #define INCLUDE_STRING
24 #include "coretypes.h"
28 #include "tree-pass.h"
30 #include "gimple-pretty-print.h"
31 #include "diagnostic-core.h"
32 #include "fold-const.h"
33 #include "gimple-iterator.h"
40 #include "gimple-range.h"
42 #include "gimple-predicate-analysis.h"
44 /* This implements the pass that does predicate aware warning on uses of
45 possibly uninitialized variables. The pass first collects the set of
46 possibly uninitialized SSA names. For each such name, it walks through
47 all its immediate uses. For each immediate use, it rebuilds the condition
48 expression (the predicate) that guards the use. The predicate is then
49 examined to see if the variable is always defined under that same condition.
50 This is done either by pruning the unrealizable paths that lead to the
51 default definitions or by checking if the predicate set that guards the
52 defining paths is a superset of the use predicate. */
54 /* Pointer set of potentially undefined ssa names, i.e.,
55 ssa names that are defined by phi with operands that
56 are not defined or potentially undefined. */
57 static hash_set
<tree
> *possibly_undefined_names
= 0;
59 /* Returns the first bit position (starting from LSB)
60 in mask that is non zero. Returns -1 if the mask is empty. */
62 get_mask_first_set_bit (unsigned mask
)
68 while ((mask
& (1 << pos
)) == 0)
73 #define MASK_FIRST_SET_BIT(mask) get_mask_first_set_bit (mask)
75 /* Return true if T, an SSA_NAME, has an undefined value. */
77 has_undefined_value_p (tree t
)
79 return (ssa_undefined_value_p (t
)
80 || (possibly_undefined_names
81 && possibly_undefined_names
->contains (t
)));
84 /* Return true if EXPR should suppress either uninitialized warning. */
87 get_no_uninit_warning (tree expr
)
89 return warning_suppressed_p (expr
, OPT_Wuninitialized
);
92 /* Suppress both uninitialized warnings for EXPR. */
95 set_no_uninit_warning (tree expr
)
97 suppress_warning (expr
, OPT_Wuninitialized
);
100 /* Like has_undefined_value_p, but don't return true if the no-warning
101 bit is set on SSA_NAME_VAR for either uninit warning. */
104 uninit_undefined_value_p (tree t
)
106 if (!has_undefined_value_p (t
))
108 if (!SSA_NAME_VAR (t
))
110 return !get_no_uninit_warning (SSA_NAME_VAR (t
));
113 /* Emit warnings for uninitialized variables. This is done in two passes.
115 The first pass notices real uses of SSA names with undefined values.
116 Such uses are unconditionally uninitialized, and we can be certain that
117 such a use is a mistake. This pass is run before most optimizations,
118 so that we catch as many as we can.
120 The second pass follows PHI nodes to find uses that are potentially
121 uninitialized. In this case we can't necessarily prove that the use
122 is really uninitialized. This pass is run after most optimizations,
123 so that we thread as many jumps and possible, and delete as much dead
124 code as possible, in order to reduce false positives. We also look
125 again for plain uninitialized variables, since optimization may have
126 changed conditionally uninitialized to unconditionally uninitialized. */
128 /* Emit warning OPT for variable VAR at the point in the program where
129 the SSA_NAME T is being used uninitialized. The warning text is in
130 MSGID and STMT is the statement that does the uninitialized read.
131 PHI_ARG_LOC is the location of the PHI argument if T and VAR are one,
132 or UNKNOWN_LOCATION otherwise. */
135 warn_uninit (opt_code opt
, tree t
, tree var
, const char *gmsgid
,
136 gimple
*context
, location_t phi_arg_loc
= UNKNOWN_LOCATION
)
138 /* Bail if the value isn't provably uninitialized. */
139 if (!has_undefined_value_p (t
))
142 /* Ignore COMPLEX_EXPR as initializing only a part of a complex
143 turns in a COMPLEX_EXPR with the not initialized part being
144 set to its previous (undefined) value. */
145 if (is_gimple_assign (context
)
146 && gimple_assign_rhs_code (context
) == COMPLEX_EXPR
)
149 /* Ignore REALPART_EXPR or IMAGPART_EXPR if its operand is a call to
150 .DEFERRED_INIT. This is for handling the following case correctly:
152 1 typedef _Complex float C;
165 with -ftrivial-auto-var-init, compiler will insert the following
166 artificial initialization at line 4:
167 f = .DEFERRED_INIT (f, 2);
168 _1 = REALPART_EXPR <f>;
170 without the following special handling, _1 = REALPART_EXPR <f> will
171 be treated as the uninitialized use point, which is incorrect. (the
172 real uninitialized use point is at line 11). */
173 if (is_gimple_assign (context
)
174 && (gimple_assign_rhs_code (context
) == REALPART_EXPR
175 || gimple_assign_rhs_code (context
) == IMAGPART_EXPR
))
177 tree v
= gimple_assign_rhs1 (context
);
178 if (TREE_CODE (TREE_OPERAND (v
, 0)) == SSA_NAME
179 && gimple_call_internal_p (SSA_NAME_DEF_STMT (TREE_OPERAND (v
, 0)),
184 /* Anonymous SSA_NAMEs shouldn't be uninitialized, but ssa_undefined_value_p
185 can return true if the def stmt of an anonymous SSA_NAME is COMPLEX_EXPR
186 created for conversion from scalar to complex. Use the underlying var of
187 the COMPLEX_EXPRs real part in that case. See PR71581. */
188 if (!var
&& !SSA_NAME_VAR (t
))
190 gimple
*def_stmt
= SSA_NAME_DEF_STMT (t
);
191 if (is_gimple_assign (def_stmt
)
192 && gimple_assign_rhs_code (def_stmt
) == COMPLEX_EXPR
)
194 tree v
= gimple_assign_rhs1 (def_stmt
);
195 if (TREE_CODE (v
) == SSA_NAME
196 && has_undefined_value_p (v
)
197 && zerop (gimple_assign_rhs2 (def_stmt
)))
198 var
= SSA_NAME_VAR (v
);
202 if (var
== NULL_TREE
)
205 /* Avoid warning if we've already done so or if the warning has been
207 if (((warning_suppressed_p (context
, OPT_Wuninitialized
)
208 || (gimple_assign_single_p (context
)
209 && get_no_uninit_warning (gimple_assign_rhs1 (context
)))))
210 || get_no_uninit_warning (var
))
213 /* Use either the location of the read statement or that of the PHI
214 argument, or that of the uninitialized variable, in that order,
215 whichever is valid. */
217 if (gimple_has_location (context
))
218 location
= gimple_location (context
);
219 else if (phi_arg_loc
!= UNKNOWN_LOCATION
)
220 location
= phi_arg_loc
;
222 location
= DECL_SOURCE_LOCATION (var
);
223 location
= linemap_resolve_location (line_table
, location
,
224 LRK_SPELLING_LOCATION
, NULL
);
226 auto_diagnostic_group d
;
227 if (!warning_at (location
, opt
, gmsgid
, var
))
230 /* Avoid subsequent warnings for reads of the same variable again. */
231 suppress_warning (var
, opt
);
233 /* Issue a note pointing to the read variable unless the warning
234 is at the same location. */
235 location_t var_loc
= DECL_SOURCE_LOCATION (var
);
236 if (location
== var_loc
)
239 inform (var_loc
, "%qD was declared here", var
);
242 struct check_defs_data
244 /* If we found any may-defs besides must-def clobbers. */
248 /* Return true if STMT is a call to built-in function all of whose
249 by-reference arguments are const-qualified (i.e., the function can
250 be assumed not to modify them). */
253 builtin_call_nomodifying_p (gimple
*stmt
)
255 if (!gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
258 tree fndecl
= gimple_call_fndecl (stmt
);
262 tree fntype
= TREE_TYPE (fndecl
);
266 /* Check the called function's signature for non-constc pointers.
267 If one is found, return false. */
270 function_args_iterator it
;
271 FOREACH_FUNCTION_ARGS (fntype
, argtype
, it
)
273 if (VOID_TYPE_P (argtype
))
278 if (!POINTER_TYPE_P (argtype
))
281 if (TYPE_READONLY (TREE_TYPE (argtype
)))
287 /* If the number of actual arguments to the call is less than or
288 equal to the number of parameters, return false. */
289 unsigned nargs
= gimple_call_num_args (stmt
);
293 /* Check arguments passed through the ellipsis in calls to variadic
294 functions for pointers. If one is found that's a non-constant
295 pointer, return false. */
296 for (; argno
< nargs
; ++argno
)
298 tree arg
= gimple_call_arg (stmt
, argno
);
299 argtype
= TREE_TYPE (arg
);
300 if (!POINTER_TYPE_P (argtype
))
303 if (TYPE_READONLY (TREE_TYPE (argtype
)))
312 /* If ARG is a FNDECL parameter declared with attribute access none or
313 write_only issue a warning for its read access via PTR. */
316 maybe_warn_read_write_only (tree fndecl
, gimple
*stmt
, tree arg
, tree ptr
)
321 if (get_no_uninit_warning (arg
))
324 tree fntype
= TREE_TYPE (fndecl
);
328 /* Initialize a map of attribute access specifications for arguments
329 to the function function call. */
331 init_attr_rdwr_indices (&rdwr_idx
, TYPE_ATTRIBUTES (fntype
));
334 tree parms
= DECL_ARGUMENTS (fndecl
);
335 for (tree parm
= parms
; parm
; parm
= TREE_CHAIN (parm
), ++argno
)
340 const attr_access
* access
= rdwr_idx
.get (argno
);
344 if (access
->mode
!= access_none
345 && access
->mode
!= access_write_only
)
349 = linemap_resolve_location (line_table
, gimple_location (stmt
),
350 LRK_SPELLING_LOCATION
, NULL
);
352 if (!warning_at (stmtloc
, OPT_Wmaybe_uninitialized
,
353 "%qE may be used uninitialized", ptr
))
356 suppress_warning (arg
, OPT_Wmaybe_uninitialized
);
358 const char* const access_str
=
359 TREE_STRING_POINTER (access
->to_external_string ());
361 location_t parmloc
= DECL_SOURCE_LOCATION (parm
);
362 inform (parmloc
, "accessing argument %u of a function declared with "
364 argno
+ 1, access_str
);
370 /* Callback for walk_aliased_vdefs. */
373 check_defs (ao_ref
*ref
, tree vdef
, void *data_
)
375 check_defs_data
*data
= (check_defs_data
*)data_
;
376 gimple
*def_stmt
= SSA_NAME_DEF_STMT (vdef
);
378 /* Ignore the vdef if the definition statement is a call
379 to .DEFERRED_INIT function. */
380 if (gimple_call_internal_p (def_stmt
, IFN_DEFERRED_INIT
))
383 /* The ASAN_MARK intrinsic doesn't modify the variable. */
384 if (is_gimple_call (def_stmt
))
386 /* The ASAN_MARK intrinsic doesn't modify the variable. */
387 if (gimple_call_internal_p (def_stmt
)
388 && gimple_call_internal_fn (def_stmt
) == IFN_ASAN_MARK
)
391 if (tree fndecl
= gimple_call_fndecl (def_stmt
))
393 /* Some sanitizer calls pass integer arguments to built-ins
394 that expect pointets. Avoid using gimple_call_builtin_p()
395 which fails for such calls. */
396 if (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_NORMAL
)
398 built_in_function fncode
= DECL_FUNCTION_CODE (fndecl
);
399 if (fncode
> BEGIN_SANITIZER_BUILTINS
400 && fncode
< END_SANITIZER_BUILTINS
)
406 /* End of VLA scope is not a kill. */
407 if (gimple_call_builtin_p (def_stmt
, BUILT_IN_STACK_RESTORE
))
410 /* If this is a clobber then if it is not a kill walk past it. */
411 if (gimple_clobber_p (def_stmt
))
413 if (stmt_kills_ref_p (def_stmt
, ref
))
418 if (builtin_call_nomodifying_p (def_stmt
))
421 /* Found a may-def on this path. */
422 data
->found_may_defs
= true;
426 /* Counters and limits controlling the the depth of analysis and
427 strictness of the warning. */
430 /* Number of VDEFs encountered. */
431 unsigned int vdef_cnt
;
432 /* Number of statements examined by walk_aliased_vdefs. */
433 unsigned int oracle_cnt
;
434 /* Limit on the number of statements visited by walk_aliased_vdefs. */
436 /* Set when basic block with statement is executed unconditionally. */
437 bool always_executed
;
438 /* Set to issue -Wmaybe-uninitialized. */
442 /* Determine if REF references an uninitialized operand and diagnose
443 it if so. STMS is the referencing statement. LHS is the result
444 of the access and may be null. RHS is the variable referenced by
445 the access; it may not be null. */
448 maybe_warn_operand (ao_ref
&ref
, gimple
*stmt
, tree lhs
, tree rhs
,
451 bool has_bit_insert
= false;
452 use_operand_p luse_p
;
453 imm_use_iterator liter
;
455 if (get_no_uninit_warning (rhs
))
458 /* Do not warn if the base was marked so or this is a
459 hard register var. */
460 tree base
= ao_ref_base (&ref
);
462 && DECL_HARD_REGISTER (base
))
463 || get_no_uninit_warning (base
))
466 /* Do not warn if the access is zero size or if it's fully outside
468 poly_int64 decl_size
;
469 if (known_size_p (ref
.size
)
470 && known_eq (ref
.max_size
, ref
.size
)
471 && (known_eq (ref
.size
, 0)
472 || known_le (ref
.offset
+ ref
.size
, 0)))
476 && known_ge (ref
.offset
, 0)
478 && poly_int_tree_p (DECL_SIZE (base
), &decl_size
)
479 && known_le (decl_size
, ref
.offset
))
482 /* Do not warn if the result of the access is then used for
483 a BIT_INSERT_EXPR. */
484 if (lhs
&& TREE_CODE (lhs
) == SSA_NAME
)
485 FOR_EACH_IMM_USE_FAST (luse_p
, liter
, lhs
)
487 gimple
*use_stmt
= USE_STMT (luse_p
);
488 /* BIT_INSERT_EXPR first operand should not be considered
489 a use for the purpose of uninit warnings. */
490 if (gassign
*ass
= dyn_cast
<gassign
*> (use_stmt
))
492 if (gimple_assign_rhs_code (ass
) == BIT_INSERT_EXPR
493 && luse_p
->use
== gimple_assign_rhs1_ptr (ass
))
495 has_bit_insert
= true;
504 /* Limit the walking to a constant number of stmts after
505 we overcommit quadratic behavior for small functions
506 and O(n) behavior. */
507 if (wlims
.oracle_cnt
> 128 * 128
508 && wlims
.oracle_cnt
> wlims
.vdef_cnt
* 2)
511 check_defs_data data
;
512 bool fentry_reached
= false;
513 data
.found_may_defs
= false;
514 tree use
= gimple_vuse (stmt
);
517 int res
= walk_aliased_vdefs (&ref
, use
,
518 check_defs
, &data
, NULL
,
519 &fentry_reached
, wlims
.limit
);
522 wlims
.oracle_cnt
+= wlims
.limit
;
526 wlims
.oracle_cnt
+= res
;
527 if (data
.found_may_defs
)
530 bool found_alloc
= false;
534 if (TREE_CODE (base
) == MEM_REF
)
535 base
= TREE_OPERAND (base
, 0);
537 /* Follow the chain of SSA_NAME assignments looking for an alloca
538 call (or VLA) or malloc/realloc, or for decls. If any is found
539 (and in the latter case, the operand is a local variable) issue
541 while (TREE_CODE (base
) == SSA_NAME
)
543 gimple
*def_stmt
= SSA_NAME_DEF_STMT (base
);
545 if (is_gimple_call (def_stmt
)
546 && gimple_call_builtin_p (def_stmt
))
548 /* Detect uses of uninitialized alloca/VLAs. */
549 tree fndecl
= gimple_call_fndecl (def_stmt
);
550 const built_in_function fncode
= DECL_FUNCTION_CODE (fndecl
);
551 if (fncode
== BUILT_IN_ALLOCA
552 || fncode
== BUILT_IN_ALLOCA_WITH_ALIGN
553 || fncode
== BUILT_IN_MALLOC
)
558 if (!is_gimple_assign (def_stmt
))
561 tree_code code
= gimple_assign_rhs_code (def_stmt
);
562 if (code
!= ADDR_EXPR
&& code
!= POINTER_PLUS_EXPR
)
565 base
= gimple_assign_rhs1 (def_stmt
);
566 if (TREE_CODE (base
) == ADDR_EXPR
)
567 base
= TREE_OPERAND (base
, 0);
570 || TREE_CODE (base
) == COMPONENT_REF
)
573 if (TREE_CODE (base
) == MEM_REF
)
574 base
= TREE_OPERAND (base
, 0);
576 if (tree ba
= get_base_address (base
))
580 /* Replace the RHS expression with BASE so that it
581 refers to it in the diagnostic (instead of to
585 && TREE_CODE (rhs
) != COMPONENT_REF
)
589 /* Do not warn if it can be initialized outside this function.
590 If we did not reach function entry then we found killing
591 clobbers on all paths to entry. */
592 if (!found_alloc
&& fentry_reached
)
594 if (TREE_CODE (base
) == SSA_NAME
)
596 tree var
= SSA_NAME_VAR (base
);
597 if (var
&& TREE_CODE (var
) == PARM_DECL
)
599 maybe_warn_read_write_only (cfun
->decl
, stmt
, var
, rhs
);
605 || is_global_var (base
))
606 /* ??? We'd like to use ref_may_alias_global_p but that
607 excludes global readonly memory and thus we get bogus
608 warnings from p = cond ? "a" : "b" for example. */
612 /* Strip the address-of expression from arrays passed to functions. */
613 if (TREE_CODE (rhs
) == ADDR_EXPR
)
614 rhs
= TREE_OPERAND (rhs
, 0);
616 /* Check again since RHS may have changed above. */
617 if (get_no_uninit_warning (rhs
))
620 /* Avoid warning about empty types such as structs with no members.
621 The first_field() test is important for C++ where the predicate
622 alone isn't always sufficient. */
623 tree rhstype
= TREE_TYPE (rhs
);
624 if (POINTER_TYPE_P (rhstype
))
625 rhstype
= TREE_TYPE (rhstype
);
626 if (is_empty_type (rhstype
))
630 /* We didn't find any may-defs so on all paths either
631 reached function entry or a killing clobber. */
633 = linemap_resolve_location (line_table
, gimple_location (stmt
),
634 LRK_SPELLING_LOCATION
, NULL
);
635 if (wlims
.always_executed
)
637 if (warning_at (location
, OPT_Wuninitialized
,
638 "%qE is used uninitialized", rhs
))
640 /* ??? This is only effective for decls as in
641 gcc.dg/uninit-B-O0.c. Avoid doing this for maybe-uninit
642 uses or accesses by functions as it may hide important
645 set_no_uninit_warning (rhs
);
649 else if (wlims
.wmaybe_uninit
)
650 warned
= warning_at (location
, OPT_Wmaybe_uninitialized
,
651 "%qE may be used uninitialized", rhs
);
653 return warned
? base
: NULL_TREE
;
657 /* Diagnose passing addresses of uninitialized objects to either const
658 pointer arguments to functions, or to functions declared with attribute
659 access implying read access to those objects. */
662 maybe_warn_pass_by_reference (gcall
*stmt
, wlimits
&wlims
)
664 if (!wlims
.wmaybe_uninit
)
667 unsigned nargs
= gimple_call_num_args (stmt
);
671 tree fndecl
= gimple_call_fndecl (stmt
);
672 tree fntype
= gimple_call_fntype (stmt
);
676 /* Const function do not read their arguments. */
677 if (gimple_call_flags (stmt
) & ECF_CONST
)
680 const built_in_function fncode
681 = (fndecl
&& gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
)
682 ? DECL_FUNCTION_CODE (fndecl
) : (built_in_function
)BUILT_IN_LAST
);
684 if (fncode
== BUILT_IN_MEMCPY
|| fncode
== BUILT_IN_MEMMOVE
)
685 /* Avoid diagnosing calls to raw memory functions (this is overly
686 permissive; consider tightening it up). */
689 /* Save the current warning setting and replace it either a "maybe"
690 when passing addresses of uninitialized variables to const-qualified
691 pointers or arguments declared with attribute read_write, or with
692 a "certain" when passing them to arguments declared with attribute
694 const bool save_always_executed
= wlims
.always_executed
;
696 /* Initialize a map of attribute access specifications for arguments
697 to the function function call. */
699 init_attr_rdwr_indices (&rdwr_idx
, TYPE_ATTRIBUTES (fntype
));
703 function_args_iterator it
;
705 FOREACH_FUNCTION_ARGS (fntype
, argtype
, it
)
709 if (!POINTER_TYPE_P (argtype
))
712 tree access_size
= NULL_TREE
;
713 const attr_access
* access
= rdwr_idx
.get (argno
- 1);
716 if (access
->mode
== access_none
717 || access
->mode
== access_write_only
)
720 if (access
->mode
== access_deferred
721 && !TYPE_READONLY (TREE_TYPE (argtype
)))
724 if (save_always_executed
&& access
->mode
== access_read_only
)
725 /* Attribute read_only arguments imply read access. */
726 wlims
.always_executed
= true;
728 /* Attribute read_write arguments are documented as requiring
729 initialized objects but it's expected that aggregates may
730 be only partially initialized regardless. */
731 wlims
.always_executed
= false;
733 if (access
->sizarg
< nargs
)
734 access_size
= gimple_call_arg (stmt
, access
->sizarg
);
736 else if (!TYPE_READONLY (TREE_TYPE (argtype
)))
738 else if (save_always_executed
&& fncode
!= BUILT_IN_LAST
)
739 /* Const-qualified arguments to built-ins imply read access. */
740 wlims
.always_executed
= true;
742 /* Const-qualified arguments to ordinary functions imply a likely
743 (but not definitive) read access. */
744 wlims
.always_executed
= false;
746 /* Ignore args we are not going to read from. */
747 if (gimple_call_arg_flags (stmt
, argno
- 1)
748 & (EAF_UNUSED
| EAF_NO_DIRECT_READ
))
751 tree arg
= gimple_call_arg (stmt
, argno
- 1);
752 if (!POINTER_TYPE_P (TREE_TYPE (arg
)))
753 /* Avoid actual arguments with invalid types. */
757 ao_ref_init_from_ptr_and_size (&ref
, arg
, access_size
);
758 tree argbase
= maybe_warn_operand (ref
, stmt
, NULL_TREE
, arg
, wlims
);
762 if (access
&& access
->mode
!= access_deferred
)
764 const char* const access_str
=
765 TREE_STRING_POINTER (access
->to_external_string ());
769 location_t loc
= DECL_SOURCE_LOCATION (fndecl
);
770 inform (loc
, "in a call to %qD declared with "
771 "attribute %<%s%> here", fndecl
, access_str
);
775 /* Handle calls through function pointers. */
776 location_t loc
= gimple_location (stmt
);
777 inform (loc
, "in a call to %qT declared with "
778 "attribute %<%s%>", fntype
, access_str
);
783 /* For a declaration with no relevant attribute access create
784 a dummy object and use the formatting function to avoid
785 having to complicate things here. */
786 attr_access ptr_access
= { };
788 access
= &ptr_access
;
789 const std::string argtypestr
= access
->array_as_string (argtype
);
792 location_t
loc (DECL_SOURCE_LOCATION (fndecl
));
793 inform (loc
, "by argument %u of type %s to %qD "
795 argno
, argtypestr
.c_str (), fndecl
);
799 /* Handle calls through function pointers. */
800 location_t
loc (gimple_location (stmt
));
801 inform (loc
, "by argument %u of type %s to %qT",
802 argno
, argtypestr
.c_str (), fntype
);
806 if (DECL_P (argbase
))
808 location_t loc
= DECL_SOURCE_LOCATION (argbase
);
809 inform (loc
, "%qD declared here", argbase
);
813 wlims
.always_executed
= save_always_executed
;
816 /* Warn about an uninitialized PHI argument on the fallthru path to
817 an always executed block BB. */
820 warn_uninit_phi_uses (basic_block bb
)
823 edge e
, found
= NULL
, found_back
= NULL
;
824 /* Look for a fallthru and possibly a single backedge. */
825 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
827 /* Ignore backedges. */
828 if (dominated_by_p (CDI_DOMINATORS
, e
->src
, bb
))
848 basic_block succ
= single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun
));
849 for (gphi_iterator si
= gsi_start_phis (bb
); !gsi_end_p (si
);
852 gphi
*phi
= si
.phi ();
853 tree def
= PHI_ARG_DEF_FROM_EDGE (phi
, found
);
854 if (TREE_CODE (def
) != SSA_NAME
855 || !SSA_NAME_IS_DEFAULT_DEF (def
)
856 || virtual_operand_p (def
))
858 /* If there's a default def on the fallthru edge PHI
859 value and there's a use that post-dominates entry
860 then that use is uninitialized and we can warn. */
861 imm_use_iterator iter
;
863 gimple
*use_stmt
= NULL
;
864 FOR_EACH_IMM_USE_FAST (use_p
, iter
, gimple_phi_result (phi
))
866 use_stmt
= USE_STMT (use_p
);
867 if (gimple_location (use_stmt
) != UNKNOWN_LOCATION
868 && dominated_by_p (CDI_POST_DOMINATORS
, succ
,
869 gimple_bb (use_stmt
))
870 /* If we found a non-fallthru edge make sure the
871 use is inside the loop, otherwise the backedge
872 can serve as initialization. */
874 || dominated_by_p (CDI_DOMINATORS
, found_back
->src
,
875 gimple_bb (use_stmt
))))
880 warn_uninit (OPT_Wuninitialized
, def
, SSA_NAME_VAR (def
),
881 "%qD is used uninitialized", use_stmt
);
885 /* Issue warnings about reads of uninitialized variables. WMAYBE_UNINIT
886 is true to issue -Wmaybe-uninitialized, otherwise -Wuninitialized. */
889 warn_uninitialized_vars (bool wmaybe_uninit
)
891 /* Counters and limits controlling the the depth of the warning. */
893 wlims
.wmaybe_uninit
= wmaybe_uninit
;
895 gimple_stmt_iterator gsi
;
897 FOR_EACH_BB_FN (bb
, cfun
)
899 basic_block succ
= single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun
));
900 wlims
.always_executed
= dominated_by_p (CDI_POST_DOMINATORS
, succ
, bb
);
902 if (wlims
.always_executed
)
903 warn_uninit_phi_uses (bb
);
905 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
907 gimple
*stmt
= gsi_stmt (gsi
);
909 /* The call is an artificial use, will not provide meaningful
910 error message. If the result of the call is used somewhere
911 else, we warn there instead. */
912 if (gimple_call_internal_p (stmt
, IFN_DEFERRED_INIT
))
915 if (is_gimple_debug (stmt
))
918 /* We only do data flow with SSA_NAMEs, so that's all we
922 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, op_iter
, SSA_OP_USE
)
924 /* BIT_INSERT_EXPR first operand should not be considered
925 a use for the purpose of uninit warnings. */
926 if (gassign
*ass
= dyn_cast
<gassign
*> (stmt
))
928 if (gimple_assign_rhs_code (ass
) == BIT_INSERT_EXPR
929 && use_p
->use
== gimple_assign_rhs1_ptr (ass
))
932 tree use
= USE_FROM_PTR (use_p
);
933 if (wlims
.always_executed
)
934 warn_uninit (OPT_Wuninitialized
, use
, SSA_NAME_VAR (use
),
935 "%qD is used uninitialized", stmt
);
936 else if (wmaybe_uninit
)
937 warn_uninit (OPT_Wmaybe_uninitialized
, use
, SSA_NAME_VAR (use
),
938 "%qD may be used uninitialized", stmt
);
941 /* For limiting the alias walk below we count all
942 vdefs in the function. */
943 if (gimple_vdef (stmt
))
946 if (gcall
*call
= dyn_cast
<gcall
*> (stmt
))
947 maybe_warn_pass_by_reference (call
, wlims
);
948 else if (gimple_assign_load_p (stmt
)
949 && gimple_has_location (stmt
))
951 tree rhs
= gimple_assign_rhs1 (stmt
);
952 tree lhs
= gimple_assign_lhs (stmt
);
955 ao_ref_init (&ref
, rhs
);
956 tree var
= maybe_warn_operand (ref
, stmt
, lhs
, rhs
, wlims
);
962 location_t loc
= DECL_SOURCE_LOCATION (var
);
963 inform (loc
, "%qD declared here", var
);
970 /* Checks if the operand OPND of PHI is defined by
971 another phi with one operand defined by this PHI,
972 but the rest operands are all defined. If yes,
973 returns true to skip this operand as being
974 redundant. Can be enhanced to be more general. */
977 can_skip_redundant_opnd (tree opnd
, gimple
*phi
)
979 tree phi_def
= gimple_phi_result (phi
);
980 gimple
*op_def
= SSA_NAME_DEF_STMT (opnd
);
981 if (gimple_code (op_def
) != GIMPLE_PHI
)
984 unsigned n
= gimple_phi_num_args (op_def
);
985 for (unsigned i
= 0; i
< n
; ++i
)
987 tree op
= gimple_phi_arg_def (op_def
, i
);
988 if (TREE_CODE (op
) != SSA_NAME
)
990 if (op
!= phi_def
&& uninit_undefined_value_p (op
))
997 /* Return a bitset holding the positions of arguments in PHI with empty
998 (or possibly empty) definitions. */
1001 compute_uninit_opnds_pos (gphi
*phi
)
1003 unsigned uninit_opnds
= 0;
1005 unsigned n
= gimple_phi_num_args (phi
);
1006 /* Bail out for phi with too many args. */
1007 if (n
> predicate::func_t::max_phi_args
)
1010 for (unsigned i
= 0; i
< n
; ++i
)
1012 tree op
= gimple_phi_arg_def (phi
, i
);
1013 if (TREE_CODE (op
) == SSA_NAME
1014 && uninit_undefined_value_p (op
)
1015 && !can_skip_redundant_opnd (op
, phi
))
1017 if (cfun
->has_nonlocal_label
|| cfun
->calls_setjmp
)
1019 /* Ignore SSA_NAMEs that appear on abnormal edges
1021 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op
))
1024 MASK_SET_BIT (uninit_opnds
, i
);
1027 return uninit_opnds
;
1030 /* Function object type used to determine whether an expression
1031 is of interest to the predicate analyzer. */
1033 struct uninit_undef_val_t
: public predicate::func_t
1035 virtual bool operator()(tree
) override
;
1036 virtual unsigned phi_arg_set (gphi
*) override
;
1039 /* Return true if the argument is an expression of interest. */
1042 uninit_undef_val_t::operator()(tree val
)
1044 if (TREE_CODE (val
) == SSA_NAME
)
1045 return uninit_undefined_value_p (val
);
1050 /* Return a bitset of PHI arguments of interest. */
1053 uninit_undef_val_t::phi_arg_set (gphi
*phi
)
1055 return compute_uninit_opnds_pos (phi
);
1058 /* Searches through all uses of a potentially
1059 uninitialized variable defined by PHI and returns a use
1060 statement if the use is not properly guarded. It returns
1061 NULL if all uses are guarded. UNINIT_OPNDS is a bitvector
1062 holding the position(s) of uninit PHI operands. WORKLIST
1063 is the vector of candidate phis that may be updated by this
1064 function. ADDED_TO_WORKLIST is the pointer set tracking
1065 if the new phi is already in the worklist. */
1068 find_uninit_use (gphi
*phi
, unsigned uninit_opnds
,
1069 vec
<gphi
*> *worklist
, hash_set
<gphi
*> *added_to_worklist
)
1071 /* The Boolean predicate guarding the PHI definition. Initialized
1072 lazily from PHI in the first call to is_use_guarded() and cached
1073 for subsequent iterations. */
1074 uninit_undef_val_t eval
;
1075 predicate
def_preds (eval
);
1077 use_operand_p use_p
;
1078 imm_use_iterator iter
;
1079 tree phi_result
= gimple_phi_result (phi
);
1080 FOR_EACH_IMM_USE_FAST (use_p
, iter
, phi_result
)
1082 gimple
*use_stmt
= USE_STMT (use_p
);
1083 if (is_gimple_debug (use_stmt
))
1087 if (gphi
*use_phi
= dyn_cast
<gphi
*> (use_stmt
))
1088 use_bb
= gimple_phi_arg_edge (use_phi
,
1089 PHI_ARG_INDEX_FROM_USE (use_p
))->src
;
1091 use_bb
= gimple_bb (use_stmt
);
1093 if (def_preds
.is_use_guarded (use_stmt
, use_bb
, phi
, uninit_opnds
))
1096 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1098 fprintf (dump_file
, "Found unguarded use in bb %u: ",
1100 print_gimple_stmt (dump_file
, use_stmt
, 0);
1102 /* Found one real use, return. */
1103 if (gimple_code (use_stmt
) != GIMPLE_PHI
)
1106 /* Found a phi use that is not guarded,
1107 add the phi to the worklist. */
1108 if (!added_to_worklist
->add (as_a
<gphi
*> (use_stmt
)))
1110 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1112 fprintf (dump_file
, "[WORKLIST]: Update worklist with phi: ");
1113 print_gimple_stmt (dump_file
, use_stmt
, 0);
1116 worklist
->safe_push (as_a
<gphi
*> (use_stmt
));
1117 possibly_undefined_names
->add (phi_result
);
1124 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1125 and gives warning if there exists a runtime path from the entry to a
1126 use of the PHI def that does not contain a definition. In other words,
1127 the warning is on the real use. The more dead paths that can be pruned
1128 by the compiler, the fewer false positives the warning is. WORKLIST
1129 is a vector of candidate phis to be examined. ADDED_TO_WORKLIST is
1130 a pointer set tracking if the new phi is added to the worklist or not. */
1133 warn_uninitialized_phi (gphi
*phi
, vec
<gphi
*> *worklist
,
1134 hash_set
<gphi
*> *added_to_worklist
)
1136 /* Don't look at virtual operands. */
1137 if (virtual_operand_p (gimple_phi_result (phi
)))
1140 unsigned uninit_opnds
= compute_uninit_opnds_pos (phi
);
1141 if (MASK_EMPTY (uninit_opnds
))
1144 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1146 fprintf (dump_file
, "Examining phi: ");
1147 print_gimple_stmt (dump_file
, phi
, 0);
1150 gimple
*uninit_use_stmt
= find_uninit_use (phi
, uninit_opnds
,
1151 worklist
, added_to_worklist
);
1153 /* All uses are properly guarded but a new PHI may have been added
1155 if (!uninit_use_stmt
)
1158 unsigned phiarg_index
= MASK_FIRST_SET_BIT (uninit_opnds
);
1159 tree uninit_op
= gimple_phi_arg_def (phi
, phiarg_index
);
1160 if (SSA_NAME_VAR (uninit_op
) == NULL_TREE
)
1163 location_t loc
= UNKNOWN_LOCATION
;
1164 if (gimple_phi_arg_has_location (phi
, phiarg_index
))
1165 loc
= gimple_phi_arg_location (phi
, phiarg_index
);
1168 tree arg_def
= gimple_phi_arg_def (phi
, phiarg_index
);
1169 if (TREE_CODE (arg_def
) == SSA_NAME
)
1171 gimple
*def_stmt
= SSA_NAME_DEF_STMT (arg_def
);
1172 if (gphi
*arg_phi
= dyn_cast
<gphi
*> (def_stmt
))
1174 unsigned uop
= compute_uninit_opnds_pos (arg_phi
);
1175 unsigned idx
= MASK_FIRST_SET_BIT (uop
);
1176 if (idx
< gimple_phi_num_args (arg_phi
)
1177 && gimple_phi_arg_has_location (arg_phi
, idx
))
1178 loc
= gimple_phi_arg_location (arg_phi
, idx
);
1183 warn_uninit (OPT_Wmaybe_uninitialized
, uninit_op
,
1184 SSA_NAME_VAR (uninit_op
),
1185 "%qD may be used uninitialized in this function",
1186 uninit_use_stmt
, loc
);
1190 gate_warn_uninitialized (void)
1192 return warn_uninitialized
|| warn_maybe_uninitialized
;
1197 const pass_data pass_data_late_warn_uninitialized
=
1199 GIMPLE_PASS
, /* type */
1200 "uninit", /* name */
1201 OPTGROUP_NONE
, /* optinfo_flags */
1202 TV_NONE
, /* tv_id */
1203 PROP_ssa
, /* properties_required */
1204 0, /* properties_provided */
1205 0, /* properties_destroyed */
1206 0, /* todo_flags_start */
1207 0, /* todo_flags_finish */
1210 class pass_late_warn_uninitialized
: public gimple_opt_pass
1213 pass_late_warn_uninitialized (gcc::context
*ctxt
)
1214 : gimple_opt_pass (pass_data_late_warn_uninitialized
, ctxt
)
1217 /* opt_pass methods: */
1218 opt_pass
*clone () { return new pass_late_warn_uninitialized (m_ctxt
); }
1219 virtual bool gate (function
*) { return gate_warn_uninitialized (); }
1220 virtual unsigned int execute (function
*);
1222 }; // class pass_late_warn_uninitialized
1225 execute_late_warn_uninitialized (function
*fun
)
1229 vec
<gphi
*> worklist
= vNULL
;
1231 calculate_dominance_info (CDI_DOMINATORS
);
1232 calculate_dominance_info (CDI_POST_DOMINATORS
);
1233 /* Re-do the plain uninitialized variable check, as optimization may have
1234 straightened control flow. Do this first so that we don't accidentally
1235 get a "may be" warning when we'd have seen an "is" warning later. */
1236 warn_uninitialized_vars (/*warn_maybe_uninitialized=*/1);
1238 timevar_push (TV_TREE_UNINIT
);
1240 possibly_undefined_names
= new hash_set
<tree
>;
1241 hash_set
<gphi
*> added_to_worklist
;
1243 /* Initialize worklist */
1244 FOR_EACH_BB_FN (bb
, fun
)
1245 for (gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1247 gphi
*phi
= gsi
.phi ();
1249 /* Don't look at virtual operands. */
1250 if (virtual_operand_p (gimple_phi_result (phi
)))
1253 unsigned n
= gimple_phi_num_args (phi
);
1254 for (unsigned i
= 0; i
< n
; ++i
)
1256 tree op
= gimple_phi_arg_def (phi
, i
);
1257 if (TREE_CODE (op
) == SSA_NAME
&& uninit_undefined_value_p (op
))
1259 worklist
.safe_push (phi
);
1260 added_to_worklist
.add (phi
);
1261 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1263 fprintf (dump_file
, "[WORKLIST]: add to initial list "
1264 "for operand %u of: ", i
);
1265 print_gimple_stmt (dump_file
, phi
, 0);
1272 while (worklist
.length () != 0)
1275 cur_phi
= worklist
.pop ();
1276 warn_uninitialized_phi (cur_phi
, &worklist
, &added_to_worklist
);
1279 worklist
.release ();
1280 delete possibly_undefined_names
;
1281 possibly_undefined_names
= NULL
;
1282 free_dominance_info (CDI_POST_DOMINATORS
);
1283 timevar_pop (TV_TREE_UNINIT
);
1287 pass_late_warn_uninitialized::execute (function
*fun
)
1289 execute_late_warn_uninitialized (fun
);
1296 make_pass_late_warn_uninitialized (gcc::context
*ctxt
)
1298 return new pass_late_warn_uninitialized (ctxt
);
1302 execute_early_warn_uninitialized (void)
1304 /* Currently, this pass runs always but
1305 execute_late_warn_uninitialized only runs with optimization. With
1306 optimization we want to warn about possible uninitialized as late
1307 as possible, thus don't do it here. However, without
1308 optimization we need to warn here about "may be uninitialized". */
1309 calculate_dominance_info (CDI_DOMINATORS
);
1310 calculate_dominance_info (CDI_POST_DOMINATORS
);
1312 warn_uninitialized_vars (/*warn_maybe_uninitialized=*/!optimize
);
1314 /* Post-dominator information cannot be reliably updated. Free it
1317 free_dominance_info (CDI_POST_DOMINATORS
);
1323 const pass_data pass_data_early_warn_uninitialized
=
1325 GIMPLE_PASS
, /* type */
1326 "*early_warn_uninitialized", /* name */
1327 OPTGROUP_NONE
, /* optinfo_flags */
1328 TV_TREE_UNINIT
, /* tv_id */
1329 PROP_ssa
, /* properties_required */
1330 0, /* properties_provided */
1331 0, /* properties_destroyed */
1332 0, /* todo_flags_start */
1333 0, /* todo_flags_finish */
1336 class pass_early_warn_uninitialized
: public gimple_opt_pass
1339 pass_early_warn_uninitialized (gcc::context
*ctxt
)
1340 : gimple_opt_pass (pass_data_early_warn_uninitialized
, ctxt
)
1343 /* opt_pass methods: */
1344 virtual bool gate (function
*) { return gate_warn_uninitialized (); }
1345 virtual unsigned int execute (function
*)
1347 return execute_early_warn_uninitialized ();
1350 }; // class pass_early_warn_uninitialized
1355 make_pass_early_warn_uninitialized (gcc::context
*ctxt
)
1357 return new pass_early_warn_uninitialized (ctxt
);