]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/testsuite/gcc.dg/Wstring-compare.c
asan: Fix ICE during instrumentation of returns_twice calls [PR112709]
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / Wstring-compare.c
CommitLineData
a7160771
MS
1/* PR tree-optimization/90879 - fold zero-equality of strcmp between
2 a longer string and a smaller array
3 { dg-do compile }
4 { dg-options "-O2 -Wall -Wextra -ftrack-macro-expansion=0" } */
5
6#include "strlenopt.h"
7
8#define T(a, b) sink (0 == strcmp (a, b), a, b)
9
10void sink (int, ...);
11
12struct S { char a4[4], c; };
13
14extern char a4[4];
15extern char a5[5];
16extern char b4[4];
17
18/* Verify that comparison of string literals with arrays with unknown
19 content but size that prevents them from comparing equal is diagnosed. */
20
21void strcmp_array_lit (void)
22{
23 if (strcmp (a4, "1234")) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
3bb6a9c0 24 // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 }
a7160771
MS
25 sink (0, a4);
26
27 int cmp;
28 cmp = strcmp (a4, "1234"); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
29 if (cmp) // { dg-message "in this expression" }
30 sink (0, a4);
31
32 T (a4, "4321"); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero " }
33 T (a4, "12345"); // { dg-warning "length 5 and an array of size 4 " }
34 T (a4, "123456"); // { dg-warning "length 6 and an array of size 4 " }
35 T ("1234", a4); // { dg-warning "length 4 and an array of size 4 " }
36 T ("12345", a4); // { dg-warning "length 5 and an array of size 4 " }
37 T ("123456", a4); // { dg-warning "length 6 and an array of size 4 " }
38}
39
40
41void strcmp_array_pstr (void)
42{
43 const char *s4 = "1234";
44
45 {
46 if (strcmp (a4, s4)) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
3bb6a9c0 47 // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 }
a7160771
MS
48 sink (1, a4);
49 else
50 sink (0, a4);
51 }
52
53 {
54 int c;
55 c = strcmp (a4, s4); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
56 if (c) // { dg-message "in this expression" }
57 sink (1, a4);
58 else
59 sink (0, a4);
60 }
61
62 const char *t4 = "4321";
63 const char *s5 = "12345";
64 const char *s6 = "123456";
65
66 T (a4, t4); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero " }
67 T (a4, s5); // { dg-warning "length 5 and an array of size 4 " }
68 T (a4, s6); // { dg-warning "length 6 and an array of size 4 " }
69 T (s4, a4); // { dg-warning "length 4 and an array of size 4 " }
70 T (s5, a4); // { dg-warning "length 5 and an array of size 4 " }
71 T (s6, a4); // { dg-warning "length 6 and an array of size 4 " }
72}
73
74
75void strcmp_array_cond_pstr (int i)
76{
77 const char *s4 = i ? "1234" : "4321";
78 T (a4, s4); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero " }
79 T (a5, s4);
80}
81
82void strcmp_array_copy (void)
83{
84 char s[8];
85
86 {
87 strcpy (s, "1234");
88 if (strcmp (a4, s)) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
3bb6a9c0 89 // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 }
a7160771
MS
90 sink (1, a4);
91 else
92 sink (0, a4);
93 }
94
95 {
96 strcpy (s, "1234");
97
98 int c;
99 c = strcmp (a4, s); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" }
100 if (c) // { dg-message "in this expression" }
101 sink (1, a4);
102 else
103 sink (0, a4);
104 }
105
106 strcpy (s, "4321");
107 T (a4, s); // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero " }
108 strcpy (s, "12345");
109 T (a4, s); // { dg-warning "length 5 and an array of size 4 " }
110 strcpy (s, "123456");
111 T (a4, s); // { dg-warning "length 6 and an array of size 4 " }
112 strcpy (s, "4321");
113 T (s, a4); // { dg-warning "length 4 and an array of size 4 " }
114 strcpy (s, "54321");
115 T (s, a4); // { dg-warning "length 5 and an array of size 4 " }
116 strcpy (s, "654321");
117 T (s, a4); // { dg-warning "length 6 and an array of size 4 " }
118}
119
120
121void strcmp_member_array_lit (const struct S *p)
122{
e7868dc6
MS
123 // Not handled due to the fix for PR 92756.
124 T (p->a4, "1234"); // { dg-warning "length 4 and an array of size 4 " "pr92765" { xfail *-*-* } }
a7160771
MS
125}
126
127
128#undef T
129#define T(a, b, n) sink (0 == strncmp (a, b, n), a, b)
130
131void strncmp_array_lit (void)
132{
133 if (strncmp (a4, "12345", 5)) // { dg-warning "'strncmp' of a string of length 5, an array of size 4 and bound of 5 evaluates to nonzero" }
3bb6a9c0 134 // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 }
a7160771
MS
135 sink (0, a4);
136
137 int cmp;
138 cmp = strncmp (a4, "54321", 5); // { dg-warning "'strncmp' of a string of length 5, an array of size 4 and bound of 5 evaluates to nonzero" }
139 if (cmp) // { dg-message "in this expression" }
140 sink (0, a4);
141
142 // Verify no warning when the bound is the same as the array size.
143 T (a4, "4321", 4);
144 T (a4, "654321", 4);
145
146 T (a4, "12345", 5); // { dg-warning "length 5, an array of size 4 and bound of 5 " }
147 T (a4, "123456", 6); // { dg-warning "length 6, an array of size 4 and bound of 6" }
148
149 T ("1234", a4, 4);
150 T ("12345", a4, 4);
151
152 T ("12345", a4, 5); // { dg-warning "length 5, an array of size 4 and bound of 5 " }
153 T ("123456", a4, 6); // { dg-warning "length 6, an array of size 4 and bound of 6 " }
154}
155
156
157void strncmp_strarray_copy (void)
158{
159 {
160 char a[] = "1234";
161 char b[6];
162 strcpy (b, "12345");
163 if (strncmp (a, b, 5)) // { dg-warning "'strncmp' of strings of length 4 and 5 and bound of 5 evaluates to nonzero" }
3bb6a9c0 164 // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 }
a7160771
MS
165 sink (0, a, b);
166 }
167
168 {
169 char a[] = "4321";
170 char b[6];
171 strcpy (b, "54321");
172 int cmp;
173 cmp = strncmp (a, b, 5); // { dg-warning "'strncmp' of strings of length 4 and 5 and bound of 5 evaluates to nonzero" }
174 if (cmp) // { dg-message "in this expression" }
175 sink (0, a, b);
176 }
177
178 strcpy (a4, "abc");
179 T (a4, "54321", 5); // { dg-warning "'strncmp' of strings of length 3 and 5 and bound of 5 evaluates to nonzero " }
180}
181
182