Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/Wstringop-truncation.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 /* PR tree-optimization/84468 - Inconsistent -Wstringop-truncation warnings | |
2 with -O2 | |
3 { dg-do compile } | |
4 { dg-options "-O2 -Wstringop-truncation -ftrack-macro-expansion=0 -g" } */ | |
5 | |
6 #define strncpy __builtin_strncpy | |
7 | |
8 struct A | |
9 { | |
10 char a[4]; | |
11 }; | |
12 | |
13 void no_pred_succ_lit (struct A *p) | |
14 { | |
15 /* The following is folded early on, before the strncpy statement | |
16 has a basic block. Verify that the case is handled gracefully | |
17 (i.e., there's no assumption that the statement does have | |
18 a basic block). */ | |
19 strncpy (p->a, "1234", sizeof p->a - 1); /* { dg-warning "\\\[-Wstringop-truncation" } */ | |
20 } | |
21 | |
22 /* Verify a strncpy call in a basic block with no predecessor or | |
23 successor. */ | |
24 void no_pred_succ (struct A *p, const struct A *q) | |
25 { | |
26 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-warning "\\\[-Wstringop-truncation" } */ | |
27 } | |
28 | |
29 | |
30 /* Verify a strncpy call in a basic block with no successor. */ | |
31 void no_succ (struct A *p, const struct A *q) | |
32 { | |
33 if (q->a) | |
34 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-warning "\\\[-Wstringop-truncation" } */ | |
35 } | |
36 | |
37 /* Verify a strncpy call in a basic block with nul assignment in | |
38 a successor block. */ | |
39 void succ (struct A *p, const struct A *q) | |
40 { | |
41 /* Verify that the assignment suppresses the warning for the conditional | |
42 strcnpy call. The conditional should be folded to true since the | |
43 address of an array can never be null (see bug 84470). */ | |
44 if (q->a) | |
45 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
46 | |
47 p->a[sizeof p->a - 1] = 0; | |
48 } | |
49 | |
50 | |
51 void succ_2 (struct A *p, const struct A *q, int i) | |
52 { | |
53 /* Same as above but with a conditional that cannot be eliminated. */ | |
54 if (i < 0) | |
55 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
56 | |
57 p->a[sizeof p->a - 1] = 0; | |
58 } | |
59 | |
60 | |
61 /* Verify a strncpy call in a basic block with nul assignment in | |
62 the next successor block. */ | |
63 int next_succ (struct A *p, const struct A *q, int i, int j) | |
64 { | |
65 /* Same as above but with a nested conditionals with else clauses. */ | |
66 if (i < 0) | |
67 { | |
68 if (j < 0) | |
69 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
70 } | |
71 else | |
72 __builtin_strcpy (p->a, q->a); | |
73 | |
74 p->a[sizeof p->a - 1] = 0; | |
75 return 0; | |
76 } | |
77 | |
78 | |
79 int next_succ_1 (struct A *p, const struct A *q, int i, int j) | |
80 { | |
81 /* Same as above but with a nested conditionals with else clauses. */ | |
82 if (i < 0) | |
83 { | |
84 if (j < 0) | |
85 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
86 else | |
87 strncpy (p->a, q->a, sizeof p->a - 2); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
88 } | |
89 | |
90 p->a[sizeof p->a - 2] = 0; | |
91 return 1; | |
92 } | |
93 | |
94 | |
95 int next_succ_2 (struct A *p, const struct A *q, int i, int j) | |
96 { | |
97 /* Same as above but with a nested conditionals with else clauses. */ | |
98 if (i < 0) | |
99 { | |
100 if (j < 0) | |
101 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
102 else | |
103 strncpy (p->a, q->a, sizeof p->a - 2); /* { dg-bogus "\\\[-Wstringop-truncation" } */ | |
104 } | |
105 else | |
106 __builtin_strcpy (p->a, q->a); | |
107 | |
108 p->a[sizeof p->a - 2] = 0; | |
109 return 2; | |
110 } | |
111 | |
112 | |
113 void cond_succ_warn (struct A *p, const struct A *q, int i) | |
114 { | |
115 /* Verify that a conditional assignment doesn't suppress the warning. */ | |
116 strncpy (p->a, q->a, sizeof p->a - 1); /* { dg-warning "\\\[-Wstringop-truncation" } */ | |
117 | |
118 if (i < 0) | |
119 p->a[sizeof p->a - 1] = 0; | |
120 } | |
121 | |
122 void cond_succ_nowarn (struct A *p, const struct A *q) | |
123 { | |
124 /* Verify that distinct but provably equivalent conditionals are | |
125 recognized and don't trigger the warning. */ | |
126 if (p != q) | |
127 strncpy (p->a, q->a, sizeof p->a - 1); | |
128 | |
129 if (p->a != q->a) | |
130 p->a[sizeof p->a - 1] = 0; | |
131 } |