]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/testsuite/gcc.dg/Wstringop-overflow-54.c
Update copyright years.
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / Wstringop-overflow-54.c
CommitLineData
83685efd
MS
1/* Verify that writes at excessive offsets into flexible array members
2 of extern or allocated objects of unknow size are diagnosed.
3 { dg-do compile }
4 { dg-options "-O2" } */
5
6#define DIFF_MAX __PTRDIFF_MAX__
7
8typedef __PTRDIFF_TYPE__ ptrdiff_t;
9typedef __SIZE_TYPE__ size_t;
10
11void* memset (void*, int, size_t);
12
13void sink (void*);
14
15void char_flexarray_cst_off_cst_size (void)
16{
17 extern struct { char n, a[]; }
eafe8ee7 18 caxcc; // { dg-message "at offset \[1-9\]\[0-9\]+ into destination object 'caxcc'" "note" }
83685efd
MS
19
20 char *p = caxcc.a;
21 size_t idx = DIFF_MAX - 4;
22
23 memset (p + idx, 0, 3);
24 sink (p);
25
26 ++idx;
27 memset (p + idx, 0, 3); // { dg-warning "writing 3 bytes into a region of size 2" }
28 sink (p);
29
30 ++idx;
31 memset (p + idx, 0, 3); // { dg-warning "writing 3 bytes into a region of size 1" }
32
33 ++idx;
34 memset (p + idx, 0, 3); // { dg-warning "writing 3 bytes into a region of size 0" }
35}
36
37
38void char_flexarray_var_off_cst_size (ptrdiff_t idx)
39{
40 extern struct { char n, a[]; }
eafe8ee7 41 caxvc; // { dg-message "destination object 'caxvc'" "note" }
83685efd
MS
42
43 char *p = caxvc.a;
44
45 if (idx < DIFF_MAX - 4)
46 idx = DIFF_MAX - 4;
47
48 memset (p + idx, 0, 3);
49 sink (p);
50
51 memset (p + idx, 0, 5); // { dg-warning "writing 5 bytes into a region of size 3" }
52}
53
54
55void char_flexarray_var_off_var_size (size_t n, ptrdiff_t idx)
56{
57 extern struct { char n, a[]; }
eafe8ee7 58 caxvv; // { dg-message "destination object 'caxvv'" "note" }
83685efd
MS
59
60 char *p = caxvv.a;
61
62 if (idx < DIFF_MAX - 4)
63 idx = DIFF_MAX - 4;
64
65 if (n < 3 || 7 < n)
66 n = 3;
67
68 memset (p + idx, 0, n);
69 sink (p);
70
71 ++n;
72 memset (p + idx, 0, n); // { dg-warning "writing between 4 and 8 bytes into a region of size 3" }
73}
74
75
76void alloc_array_var_off_cst_size (size_t n, ptrdiff_t idx)
77{
78 struct { char n, a[]; }
eafe8ee7 79 *p = __builtin_malloc (n); // { dg-message "at offset \\d+ into destination object" "note" }
83685efd
MS
80
81 if (idx < DIFF_MAX - 4)
82 idx = DIFF_MAX - 4;
83
84 memset (p->a + idx, 0, 3);
85 sink (p);
86
87 memset (p->a + idx, 0, 5); // { dg-warning "writing 5 bytes into a region of size 3" }
88}
89
90
91void int_array_cst_off_cst_size (void)
92{
93 extern struct { int n, a[]; }
eafe8ee7 94 iaxc; // { dg-message "at offset \[1-9\]\[0-9\]+ into destination object 'iaxc'" "note" }
83685efd
MS
95
96 int *p = iaxc.a;
97 size_t idx = DIFF_MAX / sizeof *p - 1;
98
99 memset (p + idx, 0, 3);
100 sink (p);
101
102 memset (p + idx, 0, 5); // { dg-warning "writing 5 bytes into a region of size 3" }
103}