[Bug sanitizer/83388] reference statement index not found error with -fsanitize=null

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Tue Dec 12 10:16:00 GMT 2017


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

--- Comment #5 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 12 Dec 2017, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83388
> 
> --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to rguenther@suse.de from comment #3)
> > > That said, what we are doing with the sanitizers is similar to what we are
> > > doing with debug stmts, if compilation is with -flto -g and linking without -g,
> > > then
> > > debug stmts are dropped.  Likewise, IFN_*SAN* is dropped from the IL if linking
> > > without corresponding -fsanitize= options.
> > 
> > Ah.  So the error is about cgraph input not finding the corresponding
> > GIMPLE call stmt that are referenced form a cgraph edge we input
> > (e->call_stmt).  This might be the case then when we drop those calls?
> 
> We only drop internal fns, lto-streamer-in.c has:
>               if (is_gimple_call (stmt)
>                   && gimple_call_internal_p (stmt))
>                 {
>                   switch (gimple_call_internal_fn (stmt))
>                     {
>                     case IFN_UBSAN_NULL:
>                       if ((flag_sanitize
>                           & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0)
>                         remove = true;
> etc.
> Now, ifns shouldn't have any cgraph edges, should they?

They shouldn't - but the error hints at stmts[uid] being NULL...

Hmm.

(gdb) p ref->referring
$3 = (symtab_node *) 0x7ffff6e2f2e0
(gdb) p $3->debug ()
i.constprop.0/8 (i.constprop) @0x7ffff6e2f2e0
  Type: function definition analyzed
  Visibility:
  References: c/0 (addr)f/1 (read)
  Referring: 
  Read from file: /tmp/cc93A4UG.ltrans0.o
  Function i.constprop/8 is inline copy in j/3
  Clone of i/2
  Availability: local
  First run: 0
  Function flags: count: 1073741825 (estimated locally) local
  Called by: j/3 (inlined) (1073741825 (estimated locally),1.00 per call) 
  Calls: e/4 (1073741824 (estimated locally),1.00 per call) g/5 (354334802 
(estimated locally),0.33 per call) 
$4 = void
(gdb) p ref->referred->debug ()
c/0 (c) @0x7ffff6e30000
  Type: variable definition analyzed
  Visibility: externally_visible prevailing_def_ironly_exp public common
  References: 
  Referring: i.constprop.0/8 (addr)
  Read from file: /tmp/cc93A4UG.ltrans0.o
  Availability: available
  Varpool flags:
$5 = void

(gdb) p ref->lto_stmt_uid - 1
$6 = 2
(gdb) p stmts
$7 = (gimple **) 0x2a5afb0
(gdb) p stmts[0]
$8 = <gimple_call 0x7ffff6e30200>
(gdb) p stmts[1]
$9 = <gimple_cond 0x7ffff6e350f0>
(gdb) p stmts[2]
$10 = <gimple 0x0>
(gdb) p stmts[3]
$11 = <gimple_assign 0x7ffff6e35140>

(gdb) p debug_gimple_stmt (stmt)
# .MEM = VDEF <.MEM>
UBSAN_NULL (&c, 3B, 0);
$1 = void
(gdb) p gimple_uid (stmt)
$2 = 2

so we have a IPA ref reference to a variable in the IFN stmt which
we remove.  I suspect we're better off replacing non-debug stmts with
GIMPLE_NOPs ...


More information about the Gcc-bugs mailing list