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

--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> ---
Initial attempt failed on

[hjl@gnu-cfl-2 pr95151]$ cat saved.c 
#include <stdint.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>

unsigned char *buf1, *buf2;
int ret;
size_t page_size;

static void
do_one_test (char *dst, char *src, const char *orig_src, size_t len)
{
  memcpy (src, orig_src, len);
  memmove (dst, src, len);

  if (memcmp (dst, orig_src, len) != 0)
    {
      ret = 1;
      return;
    }
}

void
__attribute__ ((noclone, noinline))
do_test (char *s1, char *s2, int n, size_t len)
{
  int i;
  for (i = 0; i < n; i++)
    do_one_test (s2, s2, s1, len);
}

int
main (void)
{
  page_size = 2 * getpagesize ();
  buf1 = mmap (0, (1 + 1) * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
  if (buf1 == MAP_FAILED)
    return -1;
  if (mprotect (buf1 + 1 * page_size, page_size, PROT_NONE))
    return -1;
  buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
  if (buf2 == MAP_FAILED)
    return -1;
  if (mprotect (buf2 + page_size, page_size, PROT_NONE))
    return -1;

  memset (buf1, 0xa5, 1 * page_size);
  memset (buf2, 0x5a, page_size);

  char *s1 = (char *) buf1;
  char *s2 = (char *) buf2;

  size_t len;
  size_t i, j;
  len = 1 << 2;
  for (i = 0, j = 1; i < len; i++, j += 23)
    s1[i] = j;

  do_test (s1, s2, 10, 1 << 2);

  len = 1 << 4;
  for (i = 0, j = 1; i < len; i++, j += 23)
    s1[i] = j;

  do_test (s1, s2, 10, 1 << 4);

  return ret;
}
[hjl@gnu-cfl-2 pr95151]$ make saved
/export/build/gnu/tools-build/gcc-gitlab-release-debug/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/tools-build/gcc-gitlab-release-debug/build-x86_64-linux/gcc/
-O2 -minline-all-stringops    saved.c   -o saved
[hjl@gnu-cfl-2 pr95151]$ ./saved 
Segmentation fault (core dumped)
[hjl@gnu-cfl-2 pr95151]$

Reply via email to