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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic,
                   |                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-12-11
                 CC|                            |msebor at gcc dot gnu.org
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=78450
     Ever confirmed|0                           |1

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed.

The warning is caused by a missed optimization opportunity in the strlen pass. 
GCC doesn't recognize that the result of a strlen() call with an array argument
must be less than the size of the array and, as a result, doesn't eliminate the
else block in my_strcpy().  The warning then sees the memcpy(dst, src, 99) call
and complains.

Here's a small test case for the missing strlen optimization.  This is the
subject of pr78450.

$ cat d.c && gcc -O2 -S -Wall -Wextra -Wpedantic
-fdump-tree-optimized=/dev/stdout d.c
void init (void*);

void f (void)
{
  char a[20];

  init (a);

  if (__builtin_strlen (a) < 20)   // must be true
    return;

  __builtin_abort ();   // can be eliminated
}

;; Function f (f, funcdef_no=0, decl_uid=1894, cgraph_uid=0, symbol_order=0)

f ()
{
  char a[20];
  long unsigned int _1;

  <bb 2> [local count: 1073741825]:
  init (&a);
  _1 = __builtin_strlen (&a);
  if (_1 <= 19)
    goto <bb 3>; [99.96%]
  else
    goto <bb 4>; [0.00%]

  <bb 3> [local count: 1073312327]:
  a ={v} {CLOBBER};
  return;

  <bb 4> [count: 0]:
  __builtin_abort ();   // not eliminated but could be

}

Reply via email to