1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/* Test to verify that the temporary doesn't trigger a bogus -Warray-bounds
warning. Distilled from libat_exchange_large_inplace in libatomic/gexch.c.
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
typedef typeof (sizeof 0) size_t;
extern void *memcpy (void*, const void*, size_t);
void libat_exchange_large_inplace (size_t n, void *mptr, void *vptr)
{
char temp[1024];
size_t i = 0;
for (i = 0; n >= 1024; i += 1024, n -= 1024)
{
memcpy (temp, mptr + i, 1024);
/* The memcpy call below results in the following:
unsigned long ivtmp.7;
ivtmp.7_4 = (unsigned long) mptr_9(D);
...
<bb 4>
# ivtmp.7_22 = PHI <ivtmp.7_4(3), ivtmp.7_5(4)>
...
_1 = (void *) ivtmp.7_22;
...
memcpy (_1, _2, 1024);
Treating _1 as a pointer results in the bogus:
warning: 'memcpy' offset 0 is out of the bounds [0, 8] of object 'ivtmp.7' with type 'long unsigned int' [-Warray-bounds]
memcpy (mptr + i, vptr + i, 1024);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
memcpy (mptr + i, vptr + i, 1024);
memcpy (vptr + i, temp, 1024);
}
}
|