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

            Bug ID: 86937
           Summary: strnlen() of a conditional expression with constant
                    operands not folded
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC folds the strlen() call below with a conditional expression involving
constant operands but it fails to do the same for the equivalent strnlen()
call.

Besides missing this optimization opportunity it also prevents it from
diagnosing strnlen() calls with unterminated character arrays where the bound
is greater than the size of the array.

$ cat f.c && gcc -O2 -S -Wall -Wextra -Wnull-dereference
-fdump-tree-optimized=/dev/stdout f.c
const char a[4] = "123";

int f (int i)
{
  return __builtin_strlen (i ? a : "");
}

int g (int i)
{
  return __builtin_strnlen (i ? a : "", 4);
}

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

Removing basic block 3
f (int i)
{
  int prephitmp_7;

  <bb 2> [local count: 1073741825]:
  if (i_3(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 3>; [50.00%]

  <bb 3> [local count: 536870913]:

  <bb 4> [local count: 1073741825]:
  # prephitmp_7 = PHI <3(2), i_3(D)(3)>
  return prephitmp_7;

}



;; Function g (g, funcdef_no=1, decl_uid=1909, cgraph_uid=2, symbol_order=2)

Removing basic block 3
g (int i)
{
  long unsigned int _1;
  const char * iftmp.1_2;
  int _5;

  <bb 2> [local count: 1073741825]:
  if (i_3(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 3>; [50.00%]

  <bb 3> [local count: 536870913]:

  <bb 4> [local count: 1073741825]:
  # iftmp.1_2 = PHI <&a(2), ""(3)>
  _1 = __builtin_strnlen (iftmp.1_2, 4);
  _5 = (int) _1;
  return _5;

}

Reply via email to