1 /* Test -Wsizeof-pointer-memaccess warnings. */
2 /* { dg-do compile } */
3 /* { dg-options "-Wall -Wno-array-bounds -Wno-sizeof-array-argument" } */
4 /* { dg-options "-Wall -Wno-array-bounds -Wno-sizeof-array-argument -Wno-c++-compat" { target c } } */
5 /* { dg-require-effective-target alloca } */
7 typedef __SIZE_TYPE__
size_t;
11 extern int snprintf (char *, size_t, const char *, ...);
12 extern int vsnprintf (char *, size_t, const char *, __builtin_va_list
);
13 extern void *memchr (const void *, int, size_t);
18 struct A
{ short a
, b
; int c
, d
; long e
, f
; };
26 typedef int X
[3][3][3];
33 struct A a
, *pa1
= &a
;
39 arr
[i
++] = memchr (&a
, 0, sizeof (&a
)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
40 arr
[i
++] = memchr (pa1
, 0, sizeof (pa1
)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
41 arr
[i
++] = memchr (pa2
, 0, sizeof pa2
); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
42 arr
[i
++] = memchr (pa3
, 0, sizeof (pa3
)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
43 arr
[i
++] = memchr (pa4
, 0, sizeof pa4
); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
44 arr
[i
++] = memchr (pa1
, 0, sizeof (struct A
*)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
45 arr
[i
++] = memchr (pa2
, 0, sizeof (PTA
)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
46 arr
[i
++] = memchr (pa3
, 0, sizeof (PA
)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
47 arr
[i
++] = memchr (pa4
, 0, sizeof (__typeof (pa4
))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
49 /* These are correct, no warning. */
50 arr
[i
++] = memchr (&a
, 0, sizeof a
);
51 arr
[i
++] = memchr (&a
, 0, sizeof (a
));
52 arr
[i
++] = memchr (&a
, 0, sizeof (struct A
));
53 arr
[i
++] = memchr (&a
, 0, sizeof (const struct A
));
54 arr
[i
++] = memchr (&a
, 0, sizeof (volatile struct A
));
55 arr
[i
++] = memchr (&a
, 0, sizeof (volatile const struct A
));
56 arr
[i
++] = memchr (&a
, 0, sizeof (TA
));
57 arr
[i
++] = memchr (&a
, 0, sizeof (__typeof (*&a
)));
58 arr
[i
++] = memchr (pa1
, 0, sizeof (*pa1
));
59 arr
[i
++] = memchr (pa2
, 0, sizeof (*pa3
));
60 arr
[i
++] = memchr (pa3
, 0, sizeof (__typeof (*pa3
)));
61 /* These are probably broken, but obfuscated, no warning. */
62 arr
[i
++] = memchr ((void *) &a
, 0, sizeof (&a
));
63 arr
[i
++] = memchr ((char *) &a
, 0, sizeof (&a
));
64 arr
[i
++] = memchr (&a
, 0, sizeof (&a
) + 0);
65 arr
[i
++] = memchr (&a
, 0, 0 + sizeof (&a
));
73 struct B b
, *pb1
= &b
;
79 arr
[i
++] = memchr (&b
, 0, sizeof (&b
)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
80 arr
[i
++] = memchr (pb1
, 0, sizeof (pb1
)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
81 arr
[i
++] = memchr (pb2
, 0, sizeof pb2
); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
82 arr
[i
++] = memchr (pb3
, 0, sizeof (pb3
)); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
83 arr
[i
++] = memchr (pb4
, 0, sizeof pb4
); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
84 arr
[i
++] = memchr (pb1
, 0, sizeof (struct B
*)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
85 arr
[i
++] = memchr (pb2
, 0, sizeof (PTB
)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
86 arr
[i
++] = memchr (pb3
, 0, sizeof (PB
)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
87 arr
[i
++] = memchr (pb4
, 0, sizeof (__typeof (pb4
))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" } */
89 /* These are correct, no warning. */
90 arr
[i
++] = memchr (&b
, 0, sizeof b
);
91 arr
[i
++] = memchr (&b
, 0, sizeof (b
));
92 arr
[i
++] = memchr (&b
, 0, sizeof (struct B
));
93 arr
[i
++] = memchr (&b
, 0, sizeof (const struct B
));
94 arr
[i
++] = memchr (&b
, 0, sizeof (volatile struct B
));
95 arr
[i
++] = memchr (&b
, 0, sizeof (volatile const struct B
));
96 arr
[i
++] = memchr (&b
, 0, sizeof (TB
));
97 arr
[i
++] = memchr (&b
, 0, sizeof (__typeof (*&b
)));
98 arr
[i
++] = memchr (pb1
, 0, sizeof (*pb1
));
99 arr
[i
++] = memchr (pb2
, 0, sizeof (*pb3
));
100 arr
[i
++] = memchr (pb3
, 0, sizeof (__typeof (*pb3
)));
101 /* These are probably broken, but obfuscated, no warning. */
102 arr
[i
++] = memchr ((void *) &b
, 0, sizeof (&b
));
103 arr
[i
++] = memchr ((char *) &b
, 0, sizeof (&b
));
104 arr
[i
++] = memchr (&b
, 0, sizeof (&b
) + 0);
105 arr
[i
++] = memchr (&b
, 0, 0 + sizeof (&b
));
111 f3 (void *x
, char *y
, int z
, X w
)
113 unsigned char *y1
= (unsigned char *) __builtin_alloca (z
+ 16);
115 signed char buf2
[z
+ 32];
118 signed char *y2
= buf2
;
122 arr
[i
++] = memchr (y
, 0, sizeof (y
)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
123 arr
[i
++] = memchr (y1
, 0, sizeof (y1
)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
124 arr
[i
++] = memchr (y2
, 0, sizeof (y2
)); /* { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" } */
125 arr
[i
++] = memchr (&c
, 0, sizeof (&c
)); /* { dg-warning "call is the same expression as the source; did you mean to remove the addressof" } */
126 arr
[i
++] = memchr (w
, 0, sizeof w
); /* { dg-warning "call is the same expression as the source; did you mean to dereference it" } */
128 /* These are correct, no warning. */
129 arr
[i
++] = memchr (y
, 0, sizeof (*y
));
130 arr
[i
++] = memchr (y1
, 0, sizeof (*y2
));
131 arr
[i
++] = memchr (buf1
, 0, sizeof buf1
);
132 arr
[i
++] = memchr (buf3
, 0, sizeof (buf3
));
133 arr
[i
++] = memchr (&buf3
[0], 0, sizeof (buf3
));
134 arr
[i
++] = memchr (&buf4
[0], 0, sizeof (buf4
));
135 arr
[i
++] = memchr (w
, 0, sizeof (X
));
136 /* These are probably broken, but obfuscated, no warning. */
137 arr
[i
++] = memchr ((void *) y
, 0, sizeof (y
));
138 arr
[i
++] = memchr ((char *) y1
, 0, sizeof (y2
));
139 arr
[i
++] = memchr (y
, 0, sizeof (y
) + 0);
140 arr
[i
++] = memchr (y1
, 0, 0 + sizeof (y2
));
141 arr
[i
++] = memchr ((void *) &c
, 0, sizeof (&c
));
142 arr
[i
++] = memchr ((signed char *) &c
, 0, sizeof (&c
));
143 arr
[i
++] = memchr (&c
, 0, sizeof (&c
) + 0);
144 arr
[i
++] = memchr (&c
, 0, 0 + sizeof (&c
));
150 f4 (char x
[64], char *y
, __builtin_va_list ap
)
152 char buf
[128], *p
= buf
;
153 snprintf (x
, sizeof (x
), "%s", y
); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
154 vsnprintf (x
, sizeof (x
), "%s", ap
); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
155 snprintf (p
, sizeof (p
), "%s", y
); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
156 vsnprintf (p
, sizeof (p
), "%s", ap
); /* { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" } */
158 /* These are correct, no warning. */
159 snprintf (buf
, sizeof (buf
), "%s", y
);
160 vsnprintf (buf
, sizeof (buf
), "%s", ap
);
161 snprintf (p
, sizeof (buf
), "%s", y
);
162 vsnprintf (p
, sizeof (buf
), "%s", ap
);