]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/testsuite/gcc.dg/attr-alloc_size-7.c
Update copyright years.
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / attr-alloc_size-7.c
CommitLineData
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
12typedef __SIZE_TYPE__ size_t;
13
14void 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
20void 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
74static 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}