(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wstringop-overflow-52.c
       1  
       2  /* PR middle-end/97023 - missing warning on buffer overflow in chained mempcpy
       3     Verify that writes by built-in functions to objects through pointers
       4     returned by ordinary (non-built-int) function are assumed to point to
       5     the beginning of objects.
       6     { dg-do compile }
       7     { dg-options "-O2" } */
       8  
       9  #include "range.h"
      10  
      11  void* memcpy (void*, const void*, size_t);
      12  void* memset (void*, int, size_t);
      13  
      14  void sink (void*, ...);
      15  
      16  extern char* arrptr[];
      17  extern char* ptr;
      18  extern char* retptr (void);
      19  struct S { char *p; };
      20  extern struct S retstruct (void);
      21  
      22  void nowarn_ptr (void)
      23  {
      24    {
      25      void *p = arrptr;
      26      memset (p - 1, 0, 12345);           // { dg-warning "\\\[-Wstringop-overflow" }
      27      memset (p,0, 12345);
      28      memset (p,0, DIFF_MAX - 1);
      29    }
      30  
      31    {
      32      char *p = arrptr[0];
      33      memset (p - 1, 0, 12345);
      34      memset (p - 12345, 0, 12345);
      35      memset (p - 1234, 0, DIFF_MAX - 1);
      36      memset (p - DIFF_MAX + 1, 0, 12345);
      37    }
      38  
      39    {
      40      char *p = ptr;
      41      memset (p - 1, 0, 12345);
      42      memset (p - 12345, 0, 12345);
      43      memset (p - 1234, 0, DIFF_MAX - 1);
      44      memset (p - DIFF_MAX + 1, 0, 12345);
      45    }
      46  
      47    {
      48      char *p = retptr ();
      49      memset (p - 1, 0, 12345);
      50      memset (p - 12345, 0, 12345);
      51      memset (p - 1234, 0, DIFF_MAX - 1);
      52      memset (p - DIFF_MAX + 1, 0, 12345);
      53    }
      54  
      55    {
      56      char *p = retstruct ().p;
      57      memset (p - 1, 0, 12345);
      58      memset (p - 12345, 0, 12345);
      59      memset (p - 1234, 0, DIFF_MAX - 1);
      60      memset (p - DIFF_MAX + 1, 0, 12345);
      61    }
      62  }