Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/fstack-protector-strong.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* Test that stack protection is done on chosen functions. */ | |
2 | |
3 /* { dg-do compile { target i?86-*-* x86_64-*-* rs6000-*-* s390x-*-* } } */ | |
4 /* { dg-options "-O2 -fstack-protector-strong" } */ | |
5 | |
6 /* This test checks the presence of __stack_chk_fail function in assembler. | |
7 * Compiler generates _stack_chk_fail_local (wrapper) calls instead for PIC. | |
8 */ | |
9 /* { dg-require-effective-target nonpic } */ | |
10 | |
11 #include<string.h> | |
12 | |
13 extern int g0; | |
14 extern int* pg0; | |
15 int | |
16 goo (int *); | |
17 int | |
18 hoo (int); | |
19 | |
20 /* Function frame address escaped function call. */ | |
21 int | |
22 foo1 () | |
23 { | |
24 int i; | |
25 return goo (&i); | |
26 } | |
27 | |
28 struct ArrayStruct | |
29 { | |
30 int a; | |
31 int array[10]; | |
32 }; | |
33 | |
34 struct AA | |
35 { | |
36 int b; | |
37 struct ArrayStruct as; | |
38 }; | |
39 | |
40 /* Function frame contains array. */ | |
41 int | |
42 foo2 () | |
43 { | |
44 struct AA aa; | |
45 int i; | |
46 for (i = 0; i < 10; ++i) | |
47 { | |
48 aa.as.array[i] = i * (i-1) + i / 2; | |
49 } | |
50 return aa.as.array[5]; | |
51 } | |
52 | |
53 /* Address computation based on a function frame address. */ | |
54 int | |
55 foo3 () | |
56 { | |
57 int a; | |
58 int *p; | |
59 p = &a + 5; | |
60 return goo (p); | |
61 } | |
62 | |
63 /* Address cast based on a function frame address. */ | |
64 int | |
65 foo4 () | |
66 { | |
67 int a; | |
68 return goo (g0 << 2 ? (int *)(3 * (long)(void *)(&a)) : 0); | |
69 } | |
70 | |
71 /* Address cast based on a local array. */ | |
72 int | |
73 foo5 () | |
74 { | |
75 short array[10]; | |
76 return goo ((int *)(array + 5)); | |
77 } | |
78 | |
79 struct BB | |
80 { | |
81 int one; | |
82 int two; | |
83 int three; | |
84 }; | |
85 | |
86 /* Address computaton based on a function frame address.*/ | |
87 int | |
88 foo6 () | |
89 { | |
90 struct BB bb; | |
91 return goo (&bb.one + sizeof(int)); | |
92 } | |
93 | |
94 /* Function frame address escaped via global variable. */ | |
95 int | |
96 foo7 () | |
97 { | |
98 int a; | |
99 pg0 = &a; | |
100 goo (pg0); | |
101 return *pg0; | |
102 } | |
103 | |
104 /* Check that this covers -fstack-protector. */ | |
105 int | |
106 foo8 () | |
107 { | |
108 char base[100]; | |
109 memcpy ((void *)base, (const void *)pg0, 105); /* { dg-warning "writing 105 bytes into a region of size 100" } */ | |
110 return (int)(base[32]); | |
111 } | |
112 | |
113 /* Check that this covers -fstack-protector. */ | |
114 int | |
115 foo9 () | |
116 { | |
117 char* p = __builtin_alloca (100); | |
118 return goo ((int *)(p + 50)); | |
119 } | |
120 | |
121 int | |
122 global2 (struct BB* pbb); | |
123 | |
124 /* Address taken on struct. */ | |
125 int | |
126 foo10 () | |
127 { | |
128 struct BB bb; | |
129 int i; | |
130 bb.one = global2 (&bb); | |
131 for (i = 0; i < 10; ++i) | |
132 { | |
133 bb.two = bb.one + bb.two; | |
134 bb.three = bb.one + bb.two + bb.three; | |
135 } | |
136 return bb.three; | |
137 } | |
138 | |
139 struct B | |
140 { | |
141 /* Discourage passing this struct in registers. */ | |
142 int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; | |
143 }; | |
144 | |
145 struct B global3 (void); | |
146 | |
147 int foo11 () | |
148 { | |
149 return global3 ().a1; | |
150 } | |
151 | |
152 void foo12 () | |
153 { | |
154 global3 (); | |
155 } | |
156 | |
157 /* { dg-final { scan-assembler-times "stack_chk_fail" 12 } } */ |