]>
Commit | Line | Data |
---|---|---|
8bd9f164 MS |
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 } */ | |
90e02692 | 6 | /* { dg-require-effective-target alloca } */ |
b48d4e68 | 7 | /* { dg-options "-O1 -Wall -Walloc-size-larger-than=12345" } */ |
8bd9f164 MS |
8 | |
9 | #define SIZE_MAX __SIZE_MAX__ | |
10 | #define MAXOBJSZ 12345 | |
11 | ||
12 | typedef __SIZE_TYPE__ size_t; | |
13 | ||
14 | void sink (void*); | |
15 | ||
b48d4e68 MS |
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) | |
8bd9f164 | 21 | { |
b48d4e68 MS |
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" } */ | |
8bd9f164 MS |
41 | } |
42 | ||
43 | ||
b48d4e68 MS |
44 | /* Variable evaluation needs -O1. */ |
45 | #pragma GCC pop_options | |
46 | ||
47 | __attribute__ ((noipa)) void test_var (void *p) | |
8bd9f164 | 48 | { |
b48d4e68 | 49 | size_t max = MAXOBJSZ; |
8bd9f164 | 50 | |
5d9a283a MS |
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" } */ | |
8bd9f164 MS |
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 | ||
b48d4e68 MS |
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) | |
8bd9f164 MS |
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 | ||
5d9a283a MS |
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" } */ | |
8bd9f164 MS |
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 | } |