annotate gcc/testsuite/gcc.dg/Wstring-compare-2.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR tree-optimization/90879 - fold zero-equality of strcmp between
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 a longer string and a smaller array
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Test for a warning for strcmp of a longer string against smaller
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 array.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 { dg-options "-O2 -Wall -Wstring-compare -Wno-stringop-truncation -ftrack-macro-expansion=0" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 typedef __SIZE_TYPE__ size_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 extern void* memcpy (void*, const void*, size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 extern int strcmp (const char*, const char*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 extern size_t strlen (const char*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 extern char* strcpy (char*, const char*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 extern char* strncpy (char*, const char*, size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 extern int strncmp (const char*, const char*, size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 void sink (int, ...);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #define sink(...) sink (__LINE__, __VA_ARGS__)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 extern char a1[1], a2[2], a3[3], a4[4], a5[5], a6[6], a7[7], a8[8], a9[9];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #define T(a, b) sink (0 == strcmp (a, b))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 void test_string_cst (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 const char *s1 = "1", *s2 = "12";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 T (s1, a1); // { dg-warning ".strcmp. of a string of length 1 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 T (s1, a2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 T (s1, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 T (a1, s1); // { dg-warning ".strcmp. of a string of length 1 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 T (a2, s1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 T (a3, s1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 T (s2, a1); // { dg-warning ".strcmp. of a string of length 2 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 T (s2, a2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 T (s2, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 T (a1, s2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 T (a2, s2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 T (a3, s2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 void test_string_cst_off_cst (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 const char *s1 = "1", *s2 = "12", *s3 = "123", *s4 = "1234";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 T (s1, a2 + 1); // { dg-warning ".strcmp. of a string of length 1 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 T (a2 + 1, s1); // { dg-warning ".strcmp. of a string of length 1 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 T (s3 + 1, a2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 T (s3 + 1, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 T (s2, a4 + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 T (s2, a4 + 2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 T (s4, a4 + 1); // { dg-warning ".strcmp. of a string of length 4 and an array of size 3 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 T (s3, a5 + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 /* Use strncpy below rather than memcpy until PR 91183 is resolved. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 #undef T
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 #define T(s, n, a) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 do { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 char arr[32]; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 sink (arr); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 strncpy (arr, s, n < 0 ? strlen (s) + 1: n); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 sink (0 == strcmp (arr, a)); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 } while (0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 void test_string_exact_length (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 const char *s1 = "1", *s2 = "12";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 T (s1, -1, a1); // { dg-warning ".strcmp. of a string of length 1 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 T (s1, -1, a2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 T (s1, -1, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 T (s2, -1, a1); // { dg-warning ".strcmp. of a string of length 2 and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 T (s2, -1, a2); // { dg-warning ".strcmp. of a string of length 2 and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 T (s2, -1, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 void test_string_min_length (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 const char *s1 = "1", *s2 = "12";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 T (s1, 1, a1); // { dg-warning ".strcmp. of a string of length 1 or more and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 T (s1, 1, a2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 T (s1, 1, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 T (s2, 2, a1); // { dg-warning ".strcmp. of a string of length 2 or more and an array of size 1 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 T (s2, 2, a2); // { dg-warning ".strcmp. of a string of length 2 or more and an array of size 2 evaluates to nonzero" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 T (s2, 2, a3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 int test_strncmp_str_lit_var (const char *s, long n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 if (strncmp (s, "123456", n) == 0) // { dg-bogus "\\\[-Wstring-compare" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 int test_strlen_strncmp_str_lit_var (const char *s, long n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 if (__builtin_strlen (s) < n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 if (n == 6)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 if (strncmp (s, "123456", n) == 0) // { dg-bogus "\\\[-Wstring-compare" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127