[Bug sanitizer/85777] [7/8/9 Regression] -fsanitize=undefined makes a -Wmaybe-uninitialized warning disappear

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue May 15 07:31:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85777

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
           Priority|P3                          |P2
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-05-15
   Target Milestone|---                         |7.4
            Summary|[7/8 Regression]            |[7/8/9 Regression]
                   |-fsanitize=undefined makes  |-fsanitize=undefined makes
                   |a -Wmaybe-uninitialized     |a -Wmaybe-uninitialized
                   |warning disappear           |warning disappear
     Ever confirmed|0                           |1

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  I see that UBSAN_BOUNDS and UBSAN_OBJECT_SIZE have VDEFs.  I also
see that pass_ubsan preceeds (immediately) the early uninit pass for whatever
reasons (but some instrumentations already happened before - UBSAN_OBJECT_SIZE
is introduced by the pass though).

So

Index: gcc/passes.def
===================================================================
--- gcc/passes.def      (revision 259470)
+++ gcc/passes.def      (working copy)
@@ -58,8 +58,8 @@ along with GCC; see the file COPYING3.
       NEXT_PASS (pass_fixup_cfg);
       NEXT_PASS (pass_build_ssa);
       NEXT_PASS (pass_warn_nonnull_compare);
-      NEXT_PASS (pass_ubsan);
       NEXT_PASS (pass_early_warn_uninitialized);
+      NEXT_PASS (pass_ubsan);
       NEXT_PASS (pass_nothrow);
       NEXT_PASS (pass_rebuild_cgraph_edges);
   POP_INSERT_PASSES ()

in addition to making the internal fns above ECF_NOVOPS.

Index: gcc/internal-fn.def
===================================================================
--- gcc/internal-fn.def (revision 260250)
+++ gcc/internal-fn.def (working copy)
@@ -246,13 +246,13 @@ DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NO
 DEF_INTERNAL_FN (LOOP_DIST_ALIAS, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (ANNOTATE,  ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW, ".R.")
-DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW, NULL)
+DEF_INTERNAL_FN (UBSAN_BOUNDS, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL)
 DEF_INTERNAL_FN (UBSAN_VPTR, ECF_LEAF | ECF_NOTHROW, ".RR..")
 DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (UBSAN_PTR, ECF_LEAF | ECF_NOTHROW, ".R.")
-DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL)
+DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL)
 DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL)
 DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, "..R..")


More generally sanitizer instrumentation is expected to affect diagnostics,
that really cannot be avoided.

The above doesn't seem to help btw., probably because UBSAN keeps f aliased
and in memory.


More information about the Gcc-bugs mailing list