1 /* Test -Wsizeof-pointer-memaccess warnings.  */
2 /* { dg-do compile } */
3 /* { dg-options "-Wsizeof-pointer-memaccess -Wno-stringop-overflow -Wno-stringop-truncation -ftrack-macro-expansion=0" } */
4 
5 #define bos(ptr) __builtin_object_size (ptr, 1)
6 #define bos0(ptr) __builtin_object_size (ptr, 0)
7 
8 #define memset(dst, val, sz) \
9   (FUNC (memset, dst, val, sz, bos (dst)), sink ((dst)))
10 
11 #define memcpy(dst, src, sz) \
12   (FUNC (memcpy, dst, src, sz, bos (dst)), sink ((dst)))
13 
14 #define memmove(dst, src, sz) \
15   (FUNC (memmove, dst, src, sz, bos (dst)), sink ((dst)))
16 
17 #define mempcpy(dst, src, sz) \
18   (FUNC (mempcpy, dst, src, sz, bos (dst)), sink ((dst)))
19 
20 #define strncpy(dst, src, sz)				\
21   (FUNC (strncpy, dst, src, sz, bos (dst)), sink (dst))
22 
23 #define strncat(dst, src, sz) \
24   (FUNC (strncat, dst, src, sz, bos (dst)), sink (dst))
25 
26 #define stpncpy(dst, src, sz) \
27   (FUNC (stpncpy, dst, src, sz, bos (dst)), sink (dst))
28 
29 void sink (void*);
30 
31 #define S10 "123456789"
32 extern char a10[10];
33 
test_string_literal(char * dst)34 void test_string_literal (char *dst)
35 {
36 #define FUNC(f, d, s, n, x) __builtin_ ## f (d, s, n)
37 
38   /* It's common to call memcpy and other raw memory functions with
39      size drerived from the source argument.  Verify that no warning
40      is ussued for such calls.  */
41   memcpy (dst, S10, sizeof S10);
42   mempcpy (dst, S10, sizeof S10);
43   memmove (dst, S10, sizeof S10);
44 
45   memset (dst, 0, sizeof S10);
46 
47   stpncpy (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
48 
49   strncpy (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
50 
51   strncat (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
52 
53   /* Unlike in the cases above, even though the calls below are likely
54      wrong, it's not easy to detect that  the expression (sizeof X - 1)
55      involves sizeof of the source, so no warning is issued here, as
56      helpful as one might be.  Whether -Wstringop-truncation is issued
57      is tested elsewhere.  */
58   stpncpy (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
59 
60   strncpy (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
61 
62   strncat (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
63 }
64 
65 
test_char_array(char * dst)66 void test_char_array (char *dst)
67 {
68   memcpy (dst, a10, sizeof a10);
69   mempcpy (dst, a10, sizeof a10);
70   memmove (dst, a10, sizeof a10);
71 
72   memset (dst, 0, sizeof a10);
73 
74   stpncpy (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
75 
76   strncpy (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
77 
78   strncat (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
79 
80   stpncpy (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
81 
82   strncpy (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
83 
84   strncat (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
85 }
86 
87 
88 #undef FUNC
89 #define FUNC(f, d, s, n, os) __builtin___ ## f ## _chk (d, s, n, os)
90 
test_char_array_chk(char * dst)91 void test_char_array_chk (char *dst)
92 {
93   memcpy (dst, S10, sizeof S10);
94   mempcpy (dst, S10, sizeof S10);
95   memmove (dst, S10, sizeof S10);
96 
97   memset (dst, 0, sizeof S10);
98 
99   stpncpy (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
100 
101   strncpy (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
102 
103   strncat (dst, S10, sizeof S10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
104 
105   stpncpy (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
106 
107   strncpy (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
108 
109   strncat (dst, S10, sizeof S10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
110 }
111 
112 
test_string_literal_chk(char * dst)113 void test_string_literal_chk (char *dst)
114 {
115   memcpy (dst, a10, sizeof a10);
116   mempcpy (dst, a10, sizeof a10);
117   memmove (dst, a10, sizeof a10);
118 
119   memset (dst, 0, sizeof a10);
120 
121   stpncpy (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
122 
123   strncpy (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
124 
125   strncat (dst, a10, sizeof a10);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" } */
126 
127   stpncpy (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
128 
129   strncpy (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
130 
131   strncat (dst, a10, sizeof a10 - 1);   /* { dg-warning "\\\[-Wsizeof-pointer-memaccess]" "" { xfail *-*-* } } */
132 }
133