(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
attr-alloc_size-7.c
       1  /* PR c/78284 - warn on malloc with very large arguments
       2     Test exercising the ability of the built-in allocation functions to
       3     detect and diagnose calls that attemnpt to allocate objects in excess
       4     of the maximum specified by -Walloc-size-larger-than=maximum.  */
       5  /* { dg-do compile } */
       6  /* { dg-require-effective-target alloca } */
       7  /* { dg-options "-O1 -Wall -Walloc-size-larger-than=12345 -Wno-use-after-free" } */
       8  
       9  #define SIZE_MAX   __SIZE_MAX__
      10  #define MAXOBJSZ   12345
      11  
      12  typedef __SIZE_TYPE__ size_t;
      13  
      14  void sink (void*);
      15  
      16  #pragma GCC push_options
      17  /* Verify that constant evaluation takes place even at -O0.  */
      18  #pragma GCC optimize ("0")
      19  
      20  void test_cst (void *p)
      21  {
      22    enum { max = MAXOBJSZ };
      23  
      24    sink (__builtin_aligned_alloc (1, max));
      25    sink (__builtin_aligned_alloc (1, max + 1));   /* { dg-warning "argument 2 value .12346\[lu\]*. exceeds maximum object size 12345" } */
      26  
      27    sink (__builtin_alloca (max));
      28    sink (__builtin_alloca (max + 2));   /* { dg-warning "argument 1 value .12347\[lu\]*. exceeds maximum object size 12345" } */
      29  
      30    sink (__builtin_calloc (1, max));
      31    sink (__builtin_calloc (max, 1));
      32  
      33    sink (__builtin_calloc (max / 2, 3));   /* { dg-warning "product .6172\[lu\]* \\* 3\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
      34    sink (__builtin_calloc (4, max / 3));   /* { dg-warning "product .4\[lu\]* \\* 4115\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
      35  
      36    sink (__builtin_malloc (max));
      37    sink (__builtin_malloc (max + 3));   /* { dg-warning "argument 1 value .12348\[lu\]*. exceeds maximum object size 12345" } */
      38  
      39    sink (__builtin_realloc (p, max));
      40    sink (__builtin_realloc (p, max + 4));  /* { dg-warning "argument 2 value .12349\[lu\]*. exceeds maximum object size 12345" } */
      41  }
      42  
      43  
      44  /* Variable evaluation needs -O1.  */
      45  #pragma GCC pop_options
      46  
      47  __attribute__ ((noipa)) void test_var (void *p)
      48  {
      49    size_t max = MAXOBJSZ;
      50  
      51    sink (__builtin_aligned_alloc (1, max));
      52    sink (__builtin_aligned_alloc (1, max + 1));   /* { dg-warning "argument 2 value .12346\[lu\]*. exceeds maximum object size 12345" } */
      53  
      54    sink (__builtin_alloca (max));
      55    sink (__builtin_alloca (max + 2));   /* { dg-warning "argument 1 value .12347\[lu\]*. exceeds maximum object size 12345" } */
      56  
      57    sink (__builtin_calloc (1, max));
      58    sink (__builtin_calloc (max, 1));
      59  
      60    sink (__builtin_calloc (max / 2, 3));   /* { dg-warning "product .6172\[lu\]* \\* 3\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
      61    sink (__builtin_calloc (4, max / 3));   /* { dg-warning "product .4\[lu\]* \\* 4115\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
      62  
      63    sink (__builtin_malloc (max));
      64    sink (__builtin_malloc (max + 3));   /* { dg-warning "argument 1 value .12348\[lu\]*. exceeds maximum object size 12345" } */
      65  
      66    sink (__builtin_realloc (p, max));
      67    sink (__builtin_realloc (p, max + 4));  /* { dg-warning "argument 2 value .12349\[lu\]*. exceeds maximum object size 12345" } */
      68  }
      69  
      70  
      71  /* Value range evaluation (apparently) needs -O2 here.  */
      72  #pragma GCC optimize ("2")
      73  
      74  static size_t maxobjsize (void)
      75  {
      76    return MAXOBJSZ;
      77  }
      78  
      79  __attribute__ ((noipa)) void test_range (void *p, size_t range)
      80  {
      81    /* Make sure the variable is at least as large as the maximum object
      82       size but also make sure that it's guaranteed not to be too big to
      83       increment (and wrap around).  */
      84    size_t max = maxobjsize ();
      85  
      86    if (range < max || 2 * max <= range)
      87      range = maxobjsize ();
      88  
      89    sink (__builtin_aligned_alloc (1, range));
      90    sink (__builtin_aligned_alloc (1, range + 1));   /* { dg-warning "argument 2 range \\\[12346\[lu\]*, \[0-9\]+\[lu\]*\\\] exceeds maximum object size 12345" } */
      91  
      92    sink (__builtin_alloca (range));
      93    sink (__builtin_alloca (range + 2));   /* { dg-warning "argument 1 range \\\[12347\[lu\]*, \[0-9\]+\[lu\]*\\\] exceeds maximum object size 12345" } */
      94  
      95    sink (__builtin_calloc (range, 1));
      96    sink (__builtin_calloc (1, range));
      97  
      98    sink (__builtin_calloc (range / 2, 3));   /* { dg-warning "product .6172\[lu\]* \\* 3\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
      99    sink (__builtin_calloc (4, range / 3));   /* { dg-warning "product .4\[lu\]* \\* 4115\[lu\]*. of arguments 1 and 2 exceeds maximum object size 12345" } */
     100  
     101    sink (__builtin_malloc (range));
     102    sink (__builtin_malloc (range + 3));   /* { dg-warning "argument 1 range \\\[12348\[lu\]*, 24692\[lu\]*\\\] exceeds maximum object size 12345" } */
     103  
     104    sink (__builtin_realloc (p, range));
     105    sink (__builtin_realloc (p, range + 4));  /* { dg-warning "argument 2 range \\\[12349\[lu\]*, 24693\[lu\]*\\\] exceeds maximum object size 12345" } */
     106  }