annotate gcc/testsuite/gcc.dg/Wstringop-overflow.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR middle-end/77608 - missing protection on trivially detectable runtime
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 buffer overflow
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-options "-O2 -Wstringop-overflow -ftrack-macro-expansion=0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 #define SIZE_MAX __SIZE_MAX__
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 #define DIFF_MAX __PTRDIFF_MAX__
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 #define DIFF_MIN (-DIFF_MAX - 1)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 typedef __SIZE_TYPE__ size_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 extern void* memcpy (void*, const void*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 extern char* strcpy (char*, const char*);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 extern char* strncpy (char*, const char*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 void sink (void*);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 static size_t unsigned_value (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 extern volatile size_t unsigned_value_source;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 return unsigned_value_source;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 static size_t unsigned_range (size_t min, size_t max)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 size_t val = unsigned_value ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 return val < min || max < val ? min : val;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #define UR(min, max) unsigned_range (min, max)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 char a7[7];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 struct MemArray { char a9[9]; char a1[1]; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 void test_memcpy_array (const void *s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 #define T(d, s, n) (memcpy ((d), (s), (n)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 T (a7 + UR (0, 1), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 T (a7 + UR (0, 7), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 T (a7 + UR (0, 8), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 T (a7 + UR (0, DIFF_MAX), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 T (a7 + UR (0, SIZE_MAX), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 T (a7 + UR (1, 2), s, 7); /* { dg-warning "writing 7 bytes into a region of size 6" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 T (a7 + UR (2, 3), s, 7); /* { dg-warning "writing 7 bytes into a region of size 5" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 T (a7 + UR (6, 9), s, 7); /* { dg-warning "writing 7 bytes into a region of size 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 T (a7 + UR (7, 9), s, 7); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 T (a7 + UR (8, 9), s, 7); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 T (a7 + UR (9, 10), s, 7); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 T (a7 + UR (DIFF_MAX, DIFF_MAX + (size_t)1), s, 7); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 T (a7 + UR (DIFF_MAX, SIZE_MAX), s, 7); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 /* This is valid. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 char *d = a7 + 7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 T (d + UR (-8, -7), s, 7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 /* Verify the absence of warnings for memcpy writing beyond object
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 boundaries. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 void test_memcpy_memarray (struct MemArray *p, const void *s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 #undef T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 #define T(d, s, n) (memcpy ((d), (s), (n)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 /* The following are valid. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 T (p->a9 + UR (0, 1), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 T (p->a9 + UR (0, 7), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 T (p->a9 + UR (0, 8), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 T (p->a9 + UR (0, DIFF_MAX), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 T (p->a9 + UR (0, SIZE_MAX), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 /* The following are invalid. Unfortunately, there is apparently enough
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 code out there that abuses memcpy to write past the end of one member
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 and into the members that follow so the following are not diagnosed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 by design. It sure would be nice not to have to cater to hacks like
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 these... */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 T (p->a9 + UR (1, 2), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 T (p->a9 + UR (1, 2), s, 123);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 void test_strcpy_array (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 #undef T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 #define T(d, s) (strcpy ((d), (s)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 T (a7 + UR (0, 1), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 T (a7 + UR (0, 7), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 T (a7 + UR (0, 8), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 T (a7 + UR (0, DIFF_MAX), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 T (a7 + UR (0, SIZE_MAX), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 T (a7 + UR (1, 2), "012345"); /* { dg-warning "writing 7 bytes into a region of size 6" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 T (a7 + UR (2, 3), "012345"); /* { dg-warning "writing 7 bytes into a region of size 5" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 T (a7 + UR (6, 9), "012345"); /* { dg-warning "writing 7 bytes into a region of size 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 T (a7 + UR (7, 9), "012345"); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 T (a7 + UR (8, 9), "012345"); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 T (a7 + UR (9, 10), "012345"); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 T (a7 + UR (DIFF_MAX, DIFF_MAX + (size_t)1), "012345"); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 T (a7 + UR (DIFF_MAX, SIZE_MAX), "012345"); /* { dg-warning "writing 7 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 char *d = a7 + 7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 T (d + UR (-8, -7), "012345");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 void test_strncpy_memarray (struct MemArray *p, const void *s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 #undef T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 #define T(d, s, n) (strncpy ((d), (s), (n)), sink (d))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 T (p->a9 + UR (0, 1), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 T (p->a9 + UR (0, 7), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 T (p->a9 + UR (0, 8), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 T (p->a9 + UR (0, DIFF_MAX), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 T (p->a9 + UR (0, SIZE_MAX), s, 9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 T (p->a9 + UR (1, 2), s, 9); /* { dg-warning "writing 9 bytes into a region of size 8" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 T (p->a9 + UR (2, 3), s, 9); /* { dg-warning "writing 9 bytes into a region of size 7" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 T (p->a9 + UR (6, 9), s, 9); /* { dg-warning "writing 9 bytes into a region of size 3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 T (p->a9 + UR (9, 10), s, 9); /* { dg-warning "writing 9 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 T (p->a9 + UR (10, 11), s, 9); /* { dg-warning "writing 9 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 T (p->a9 + UR (DIFF_MAX, DIFF_MAX + (size_t)1), s, 1); /* { dg-warning "writing 1 byte into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 T (p->a9 + UR (DIFF_MAX, SIZE_MAX), s, 3); /* { dg-warning "writing 3 bytes into a region of size 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 }