131
|
1 /* PR middle-end/81384 - built-in form of strnlen missing
|
|
2
|
|
3 Since the strnlen patch affects the handling for strncmp and other
|
|
4 bounded functions, verify that a bound in excess of the maximum
|
|
5 object size specified for strncmp is diagnosed regardless of
|
|
6 attribute nonstring. Also verify that a bound that's greater than
|
|
7 the size of a non-string array is diagnosed, even if it's not in
|
|
8 excess of the maximum object size.
|
|
9
|
|
10 { dg-do compile }
|
|
11 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
|
|
12
|
|
13 #include "range.h"
|
|
14
|
|
15 extern int strncmp (const char*, const char*, size_t);
|
|
16
|
|
17 #define STR /* not non-string */
|
|
18 #define NS __attribute__ ((nonstring))
|
|
19
|
|
20 #define _CAT(s, n) s ## n
|
|
21 #define CAT(s, n) _CAT (s, n)
|
|
22 #define UNIQ(n) CAT (n, __LINE__)
|
|
23
|
|
24 void sink (int);
|
|
25
|
|
26 #define T(at1, N1, at2, N2, bound) \
|
|
27 do { \
|
|
28 extern at1 char UNIQ (a)[N1]; \
|
|
29 extern at2 char UNIQ (b)[N2]; \
|
|
30 sink (strncmp (UNIQ (a), UNIQ (b), bound)); \
|
|
31 } while (0)
|
|
32
|
|
33 void strncmp_cst (void)
|
|
34 {
|
|
35 size_t n = DIFF_MAX;
|
|
36
|
|
37 T (STR, /* [] */, STR, /* [] */, n);
|
|
38 T (STR, /* [] */, STR, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
39
|
|
40 T (STR, 1, STR, /* [] */, n);
|
|
41 T (STR, 2, STR, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
42
|
|
43 T (STR, /* [] */, STR, 3, n);
|
|
44 T (STR, /* [] */, STR, 4, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
45
|
|
46 T (STR, /* [] */, NS, /* [] */, n);
|
|
47 T (STR, /* [] */, NS, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
48
|
|
49 T (STR, 5, NS, /* [] */, n);
|
|
50 T (STR, 6, NS, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
51
|
|
52 T (STR, /* [] */, NS, 7, n); /* { dg-warning "argument 2 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
53
|
|
54 T (STR, /* [] */, NS, 8, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
55
|
|
56 T (NS, /* [] */, STR, /* [] */, n);
|
|
57 T (NS, /* [] */, STR, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
58
|
|
59 T (NS, 9, STR, /* [] */, n); /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
60 T (NS, 10, STR, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
61
|
|
62 T (NS, /* [] */, STR, 11, n);
|
|
63 T (NS, /* [] */, STR, 12, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
64
|
|
65 T (NS, /* [] */, NS, /* [] */, n);
|
|
66 T (NS, /* [] */, NS, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
67
|
|
68 T (NS, 13, NS, /* [] */, n); /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
69 T (NS, 14, NS, /* [] */, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
70
|
|
71 T (NS, /* [] */, NS, 15, n); /* { dg-warning "argument 2 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
72 T (NS, /* [] */, NS, 16, n + 1); /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
|
|
73 }
|
|
74
|
|
75
|
|
76 void strncmp_range (void)
|
|
77 {
|
|
78 size_t n = DIFF_MAX;
|
|
79 n = UR (n, n + 1);
|
|
80
|
|
81 T (STR, /* [] */, STR, /* [] */, n);
|
|
82 T (STR, /* [] */, STR, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
83
|
|
84 T (STR, 1, STR, /* [] */, n);
|
|
85 T (STR, 2, STR, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
86
|
|
87 T (STR, /* [] */, STR, 3, n);
|
|
88 T (STR, /* [] */, STR, 4, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
89
|
|
90 T (STR, /* [] */, NS, /* [] */, n);
|
|
91 T (STR, /* [] */, NS, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
92
|
|
93 T (STR, 5, NS, /* [] */, n);
|
|
94 T (STR, 6, NS, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
95
|
|
96 T (STR, /* [] */, NS, 7, n); /* { dg-warning "argument 2 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
97
|
|
98 T (STR, /* [] */, NS, 8, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
99
|
|
100 T (NS, /* [] */, STR, /* [] */, n);
|
|
101 T (NS, /* [] */, STR, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
102
|
|
103 T (NS, 9, STR, /* [] */, n); /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
104 T (NS, 10, STR, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
105
|
|
106 T (NS, /* [] */, STR, 11, n);
|
|
107 T (NS, /* [] */, STR, 12, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
108
|
|
109 T (NS, /* [] */, NS, /* [] */, n);
|
|
110 T (NS, /* [] */, NS, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
111
|
|
112 T (NS, 13, NS, /* [] */, n); /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
113 T (NS, 14, NS, /* [] */, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
114
|
|
115 T (NS, /* [] */, NS, 15, n); /* { dg-warning "argument 2 declared attribute .nonstring. is smaller than the specified bound" } */
|
|
116 T (NS, /* [] */, NS, 16, n + 1); /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
|
|
117 }
|