[Bug middle-end/86528] [9 Regression] strlen of constant string malfunction -- had to back out fix for PR middle-end/77357
bernd.edlinger at hotmail dot de
gcc-bugzilla@gcc.gnu.org
Mon Jul 16 09:19:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86528
Bernd Edlinger <bernd.edlinger at hotmail dot de> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |bernd.edlinger at hotmail dot de
--- Comment #3 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
I can reproduce with the following test case:
$ cat t.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void test(char *data, size_t len)
{
char *dir;
static char const appended[] = "/./";
char *buf = alloca (len + sizeof appended);
memcpy (buf, data, len);
strcpy (buf + len, &appended[data[len - 1] == '/']);
dir = buf;
printf("%s\n", dir);
}
int main(int argc, char **argv)
{
if(argc > 1 && argv[1][0])
test(argv[1], strlen(argv[1]));
return 0;
}
$ gcc -S -O1 -fdump-tree-all-all t.c
t.c.028t.ccp1 looks okay:
# VUSE <.MEM_14>
_4 = *_3;
_5 = _4 == 47;
_6 = (intD.6) _5;
_7 = &appended.3294D.3294[_6];
_8 = buf_12 + len_9(D);
# .MEM_15 = VDEF <.MEM_14>
# USE = anything
# CLB = anything
strcpyD.887 (_8, _7);
t.c.029t.forwprop1 is wrong:
# VUSE <.MEM_14>
_4 = *_3;
_5 = _4 == 47;
_6 = (intD.6) _5;
_7 = &appended.3294D.3294[_6];
_8 = buf_12 + len_9(D);
_18 = (long unsigned intD.10) _6;
_19 = _18 * 18446744073709551612;
_20 = _19 + 4;
# .MEM_15 = VDEF <.MEM_14>
# USE = anything
# CLB = anything
memcpyD.864 (_8, _7, _20);
Breakpoint 7, string_constant (arg=0x7ffff70a0dc8, ptr_offset=0x7fffffffc638)
at ../../gcc-9-20180715/gcc/expr.c:11344
11344 if (tree eltsize = TYPE_SIZE_UNIT (TREE_TYPE (array)))
here eltsize = 4, but it should probably be TYPE_SIZE_UNIT (TREE_TYPE
(TREE_TYPE (array))) ???
More information about the Gcc-bugs
mailing list