On Tue, Nov 20, 2018 at 12:39:44AM +0100, Jakub Jelinek wrote:
> On Mon, Nov 19, 2018 at 04:10:09PM -0700, Jeff Law wrote:
> > > PR c/88065 - ICE in -Wsizeof-pointer-memaccess on an invalid strncpy
> > > 
> > > gcc/c-family/ChangeLog:
> > > 
> > >   PR c/88065

Please also add
        PR c/87297

> > >   * c-warn.c (sizeof_pointer_memaccess_warning): Bail if source
> > >   or destination is an error.
> > > 
> > > gcc/testsuite/ChangeLog:
> > > 
> > >   PR c/88065
> > >   * gcc.dg/Wsizeof-pointer-memaccess2.c: New test.
> > This is probably OK.  But before final ACK, is there a point earlier
> > where we could/should have bailed out?
> 
> IMHO it is a good point, but it should use error_operand_p predicate instead
> of == error_mark_node checks to also catch the case where the argument is
> not error_mark_node, but has error_mark_node type.  And, the testcase
> shouldn't be in gcc.dg, but in c-c++-common and cover also C++ testing.

Testcase proving that error_operand_p is really necessary:

/* PR c/87297 */
/* { dg-do compile } */
/* { dg-options "-Wsizeof-pointer-memaccess" } */
struct S { char a[4]; };

void
foo (struct S *p, const char *s)
{
  struct T x;   /* { dg-error "storage size|incomplete type" } */
  __builtin_strncpy (x, s, sizeof p->a);
}

Works in C, still ICEs in C++ even with the patch you've posted.
819               tree dstsz = TYPE_SIZE_UNIT (TREE_TYPE (d));
debug_tree (d)
 <var_decl 0x7ffff7ff6c60 x type <error_mark 0x7fffefc7fdf8>
    used decl_5 VOID huvaa.c:9:12
    align:8 warn_if_not_align:0 context <function_decl 0x7fffefdda200 foo>
    chain <type_decl 0x7fffefda1850 T>>

And, I think it is important to have these tests in c-c++-common, as the
above test shows, it behaves differently between C and C++ (C will present
error_mark_node itself rather than VAR_DECL with error_mark_node type) and
the code in question is just a helper for the FEs.

        Jakub

Reply via email to