1 /* Verify that -Walloc-size-greater-than doesn't cause false positives 2 for anti-ranges. Note that not all of the statements below result 3 in the argument being represented as an anti-range. 4 5 { dg-do compile } 6 { dg-options "-O2 -Walloc-size-larger-than=12 -ftrack-macro-expansion=0" } */ 7 8 #define SCHAR_MAX __SCHAR_MAX__ 9 #define SCHAR_MIN (-SCHAR_MAX - 1) 10 #define UCHAR_MAX (SCHAR_MAX * 2 + 1) 11 12 #define SHRT_MAX __SHRT_MAX__ 13 #define SHRT_MIN (-SHRT_MAX - 1) 14 #define USHRT_MAX (SHRT_MAX * 2U + 1) 15 16 #define INT_MAX __INT_MAX__ 17 #define INT_MIN (-INT_MAX - 1) 18 #define UINT_MAX (INT_MAX * 2U + 1) 19 20 #define LONG_MAX __LONG_MAX__ 21 #define LONG_MIN (-LONG_MAX - 1) 22 #define ULONG_MAX (LONG_MAX * 2LU + 1) 23 24 #define PTRDIFF_MAX __PTRDIFF_MAX__ 25 #define PTRDIFF_MIN (-PTRDIFF_MAX - 1) 26 #define SIZE_MAX __SIZE_MAX__ 27 28 #define ALLOC_MAX 12 29 30 typedef __PTRDIFF_TYPE__ ptrdiff_t; 31 typedef __SIZE_TYPE__ size_t; 32 33 #define CONCAT(a, b) a ## b 34 #define CAT(a, b) CONCAT (a, b) 35 36 /* Macro to generate a unique function to test the anti-range 37 ~[MIN, MAX] for type T. */ 38 #define TEST(T, min, max) \ 39 void* CAT (test_anti_range_, __LINE__)(T n) \ 40 { \ 41 extern void* CAT (alloc_anti_range_, __LINE__)(T) \ 42 __attribute__ ((alloc_size (1))); \ 43 if (min <= n && n <= max) \ 44 n = min - 1; \ 45 return CAT (alloc_anti_range_, __LINE__)(n); \ 46 } typedef void dummy /* Require a semicolon. */ 47 48 /* The following tests fail because of missing range information. The xfail 49 exclusions are PR79356. */ 50 TEST (signed char, SCHAR_MIN + 2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" "missing range info for signed char" { xfail { ! { aarch64*-*-* arm*-*-* avr-*-* alpha*-*-* ia64-*-* mips*-*-* or1k*-*-* pdp11*-*-* powerpc*-*-* sparc*-*-* s390*-*-* visium-*-* msp430-*-* } } } } */ 51 TEST (short, SHRT_MIN + 2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" "missing range info for short" { xfail { ! { aarch64*-*-* arm*-*-* alpha*-*-* avr-*-* ia64-*-* mips*-*-* or1k*-*-* pdp11*-*-* powerpc*-*-* sparc*-*-* s390x-*-* visium-*-* msp430-*-* } } } } */ 52 TEST (int, INT_MIN + 2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 53 TEST (int, -3, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 54 TEST (int, -2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 55 TEST (int, -1, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 56 TEST (int, 0, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 57 TEST (int, 1, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 58 TEST (int, 1, INT_MAX - 1); /* { dg-warning "argument 1 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size 12" } */ 59 60 /* The following two aren't necessarily anti-ranges. */ 61 TEST (int, 1, INT_MAX); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */ 62 TEST (int, 0, INT_MAX); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -1\\\] is negative" } */ 63 64 TEST (long, LONG_MIN + 2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 65 TEST (ptrdiff_t, PTRDIFF_MIN + 2, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 66 67 TEST (unsigned, 0, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 68 TEST (unsigned long, 0, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 69 TEST (size_t, 0, ALLOC_MAX); /* { dg-warning "argument 1 range \\\[13, \[0-9\]+\\\] exceeds maximum object size 12" } */ 70