1 /* PR middle-end/81384 - built-in form of strnlen missing
2 
3    Verify that a strnlen bound in excess of the maximum object size
4    is diagnosed regardless of attribute nonstring.  Also verify that
5    a bound that's greater than the size of a non-string array is
6    diagnosed, even if it's not in excess of the maximum object size.
7 
8    { dg-do compile }
9    { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
10 
11 #include "range.h"
12 
13 extern size_t strnlen (const char*, size_t);
14 
15 #define STR   /* not non-string */
16 #define NS    __attribute__ ((nonstring))
17 
18 #define _CAT(s, n)   s ## n
19 #define CAT(s, n)    _CAT (s, n)
20 #define UNIQ(n)      CAT (n, __LINE__)
21 
22 void sink (size_t);
23 
24 #define T(attr, N, bound)			\
25   do {						\
26     extern attr char UNIQ (a)[N];		\
27     sink (strnlen (UNIQ (a), bound));		\
28   } while (0)
29 
strnlen_cst(void)30 void strnlen_cst (void)
31 {
32   size_t n = DIFF_MAX;
33 
34   T (STR, /* [] */, n);
35   T (STR, /* [] */, n + 1);    /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
36 
37   T (STR, 1, n);
38   T (STR, 2, n + 1);           /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
39 
40   T (NS, /* [] */, n);
41   T (NS, /* [] */, n + 1);     /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
42 
43   T (NS, 9, n);                /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
44   T (NS, 10, n + 1);           /* { dg-warning "specified bound \[0-9\]+ exceeds maximum object size \[0-9\]+" } */
45 }
46 
47 
strnlen_range(void)48 void strnlen_range (void)
49 {
50   size_t n = DIFF_MAX;
51   n = UR (n, n + 1);
52 
53   T (STR, /* [] */, n);
54   T (STR, /* [] */, n + 1);    /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
55 
56   T (STR, 1, n);
57   T (STR, 2, n + 1);           /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
58 
59   T (NS, /* [] */, n);
60   T (NS, /* [] */, n + 1);     /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
61 
62   T (NS, 9, n);                /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound" } */
63   T (NS, 10, n + 1);           /* { dg-warning "specified bound \\\[\[0-9\]+, \[0-9\]+] exceeds maximum object size \[0-9\]+" } */
64 }
65