|
1 /* |
|
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. |
|
8 * |
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
|
13 * accompanied this code). |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License version |
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 * |
|
23 */ |
|
24 |
|
25 /** |
|
26 * @test |
|
27 * @bug 6942326 |
|
28 * @summary x86 code in string_indexof() could read beyond reserved heap space |
|
29 * |
|
30 * @run main/othervm/timeout=300 -Xmx32m -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=exclude,Test,main -XX:CompileCommand=exclude,Test,test_varsub_indexof -XX:CompileCommand=exclude,Test,test_varstr_indexof -XX:CompileCommand=exclude,Test,test_missub_indexof -XX:CompileCommand=exclude,Test,test_consub_indexof -XX:CompileCommand=exclude,Test,test_conmis_indexof -XX:CompileCommand=exclude,Test,test_subcon Test |
|
31 * |
|
32 */ |
|
33 |
|
34 public class Test { |
|
35 |
|
36 static String[] strings = new String[1024]; |
|
37 private static final int ITERATIONS = 100000; |
|
38 |
|
39 public static void main(String[] args) { |
|
40 |
|
41 long start_total = System.currentTimeMillis(); |
|
42 |
|
43 // search variable size substring in string (33 chars). |
|
44 String a = " 1111111111111xx1111111111111xx11y"; // +1 to execute a.substring(1) first |
|
45 String b = "1111111111111xx1111111111111xx11y"; |
|
46 test_varsub_indexof(a, b); |
|
47 |
|
48 // search variable size substring in string (32 chars). |
|
49 a = " 1111111111111xx1111111111111xx1y"; |
|
50 b = "1111111111111xx1111111111111xx1y"; |
|
51 test_varsub_indexof(a, b); |
|
52 |
|
53 // search variable size substring in string (17 chars). |
|
54 a = " 1111111111111xx1y"; |
|
55 b = "1111111111111xx1y"; |
|
56 test_varsub_indexof(a, b); |
|
57 |
|
58 // search variable size substring in string (16 chars). |
|
59 a = " 111111111111xx1y"; |
|
60 b = "111111111111xx1y"; |
|
61 test_varsub_indexof(a, b); |
|
62 |
|
63 // search variable size substring in string (8 chars). |
|
64 a = " 1111xx1y"; |
|
65 b = "1111xx1y"; |
|
66 test_varsub_indexof(a, b); |
|
67 |
|
68 // search variable size substring in string (7 chars). |
|
69 a = " 111xx1y"; |
|
70 b = "111xx1y"; |
|
71 test_varsub_indexof(a, b); |
|
72 |
|
73 |
|
74 |
|
75 // search substring (17 chars) in variable size string. |
|
76 a = "1111111111111xx1x"; |
|
77 b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first |
|
78 test_varstr_indexof(a, b); |
|
79 |
|
80 // search substring (16 chars) in variable size string. |
|
81 a = "111111111111xx1x"; |
|
82 b = " 1111111111111xx1111111111111xx1x"; |
|
83 test_varstr_indexof(a, b); |
|
84 |
|
85 // search substring (9 chars) in variable size string. |
|
86 a = "11111xx1x"; |
|
87 b = " 1111111111111xx1111111111111xx1x"; |
|
88 test_varstr_indexof(a, b); |
|
89 |
|
90 // search substring (8 chars) in variable size string. |
|
91 a = "1111xx1x"; |
|
92 b = " 1111111111111xx1111111111111xx1x"; |
|
93 test_varstr_indexof(a, b); |
|
94 |
|
95 // search substring (4 chars) in variable size string. |
|
96 a = "xx1x"; |
|
97 b = " 1111111111111xx1111111111111xx1x"; |
|
98 test_varstr_indexof(a, b); |
|
99 |
|
100 // search substring (3 chars) in variable size string. |
|
101 a = "x1x"; |
|
102 b = " 1111111111111xx1111111111111xx1x"; |
|
103 test_varstr_indexof(a, b); |
|
104 |
|
105 // search substring (2 chars) in variable size string. |
|
106 a = "1y"; |
|
107 b = " 1111111111111xx1111111111111xx1y"; |
|
108 test_varstr_indexof(a, b); |
|
109 |
|
110 |
|
111 |
|
112 // search non matching variable size substring in string (33 chars). |
|
113 a = " 1111111111111xx1111111111111xx11z"; // +1 to execute a.substring(1) first |
|
114 b = "1111111111111xx1111111111111xx11y"; |
|
115 test_missub_indexof(a, b); |
|
116 |
|
117 // search non matching variable size substring in string (32 chars). |
|
118 a = " 1111111111111xx1111111111111xx1z"; |
|
119 b = "1111111111111xx1111111111111xx1y"; |
|
120 test_missub_indexof(a, b); |
|
121 |
|
122 // search non matching variable size substring in string (17 chars). |
|
123 a = " 1111111111111xx1z"; |
|
124 b = "1111111111111xx1y"; |
|
125 test_missub_indexof(a, b); |
|
126 |
|
127 // search non matching variable size substring in string (16 chars). |
|
128 a = " 111111111111xx1z"; |
|
129 b = "111111111111xx1y"; |
|
130 test_missub_indexof(a, b); |
|
131 |
|
132 // search non matching variable size substring in string (8 chars). |
|
133 a = " 1111xx1z"; |
|
134 b = "1111xx1y"; |
|
135 test_missub_indexof(a, b); |
|
136 |
|
137 // search non matching variable size substring in string (7 chars). |
|
138 a = " 111xx1z"; |
|
139 b = "111xx1y"; |
|
140 test_missub_indexof(a, b); |
|
141 |
|
142 |
|
143 |
|
144 // Testing constant substring search in variable size string. |
|
145 |
|
146 // search constant substring (17 chars). |
|
147 b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first |
|
148 TestCon tc = new TestCon17(); |
|
149 test_consub_indexof(tc, b); |
|
150 |
|
151 // search constant substring (16 chars). |
|
152 b = " 1111111111111xx1111111111111xx1x"; |
|
153 tc = new TestCon16(); |
|
154 test_consub_indexof(tc, b); |
|
155 |
|
156 // search constant substring (9 chars). |
|
157 b = " 1111111111111xx1111111111111xx1x"; |
|
158 tc = new TestCon9(); |
|
159 test_consub_indexof(tc, b); |
|
160 |
|
161 // search constant substring (8 chars). |
|
162 b = " 1111111111111xx1111111111111xx1x"; |
|
163 tc = new TestCon8(); |
|
164 test_consub_indexof(tc, b); |
|
165 |
|
166 // search constant substring (4 chars). |
|
167 b = " 1111111111111xx1111111111111xx1x"; |
|
168 tc = new TestCon4(); |
|
169 test_consub_indexof(tc, b); |
|
170 |
|
171 // search constant substring (3 chars). |
|
172 b = " 1111111111111xx1111111111111xx1x"; |
|
173 tc = new TestCon3(); |
|
174 test_consub_indexof(tc, b); |
|
175 |
|
176 // search constant substring (2 chars). |
|
177 b = " 1111111111111xx1111111111111xx1y"; |
|
178 tc = new TestCon2(); |
|
179 test_consub_indexof(tc, b); |
|
180 |
|
181 // search constant substring (1 chars). |
|
182 b = " 1111111111111xx1111111111111xx1y"; |
|
183 tc = new TestCon1(); |
|
184 test_consub_indexof(tc, b); |
|
185 |
|
186 |
|
187 // search non matching constant substring (17 chars). |
|
188 b = " 1111111111111xx1111111111111xx1z"; // +1 to execute b.substring(1) first |
|
189 tc = new TestCon17(); |
|
190 test_conmis_indexof(tc, b); |
|
191 |
|
192 // search non matching constant substring (16 chars). |
|
193 b = " 1111111111111xx1111111111111xx1z"; |
|
194 tc = new TestCon16(); |
|
195 test_conmis_indexof(tc, b); |
|
196 |
|
197 // search non matching constant substring (9 chars). |
|
198 b = " 1111111111111xx1111111111111xx1z"; |
|
199 tc = new TestCon9(); |
|
200 test_conmis_indexof(tc, b); |
|
201 |
|
202 // search non matching constant substring (8 chars). |
|
203 b = " 1111111111111xx1111111111111xx1z"; |
|
204 tc = new TestCon8(); |
|
205 test_conmis_indexof(tc, b); |
|
206 |
|
207 // search non matching constant substring (4 chars). |
|
208 b = " 1111111111111xx1111111111111xx1z"; |
|
209 tc = new TestCon4(); |
|
210 test_conmis_indexof(tc, b); |
|
211 |
|
212 // search non matching constant substring (3 chars). |
|
213 b = " 1111111111111xx1111111111111xx1z"; |
|
214 tc = new TestCon3(); |
|
215 test_conmis_indexof(tc, b); |
|
216 |
|
217 // search non matching constant substring (2 chars). |
|
218 b = " 1111111111111xx1111111111111xx1z"; |
|
219 tc = new TestCon2(); |
|
220 test_conmis_indexof(tc, b); |
|
221 |
|
222 // search non matching constant substring (1 chars). |
|
223 b = " 1111111111111xx1111111111111xx1z"; |
|
224 tc = new TestCon1(); |
|
225 test_conmis_indexof(tc, b); |
|
226 |
|
227 long end_total = System.currentTimeMillis(); |
|
228 System.out.println("End run time: " + (end_total - start_total)); |
|
229 |
|
230 } |
|
231 |
|
232 public static long test_init(String a, String b) { |
|
233 for (int i = 0; i < 512; i++) { |
|
234 strings[i * 2] = new String(b.toCharArray()); |
|
235 strings[i * 2 + 1] = new String(a.toCharArray()); |
|
236 } |
|
237 System.out.print(a.length() + " " + b.length() + " "); |
|
238 return System.currentTimeMillis(); |
|
239 } |
|
240 |
|
241 public static void test_end(String a, String b, int v, int expected, long start) { |
|
242 long end = System.currentTimeMillis(); |
|
243 int res = (v/ITERATIONS); |
|
244 System.out.print(" " + res); |
|
245 System.out.println(" time:" + (end - start)); |
|
246 if (res != expected) { |
|
247 System.out.println("wrong indexOf result: " + res + ", expected " + expected); |
|
248 System.out.println("\"" + b + "\".indexOf(\"" + a + "\")"); |
|
249 System.exit(97); |
|
250 } |
|
251 } |
|
252 |
|
253 public static int test_subvar() { |
|
254 int s = 0; |
|
255 int v = 0; |
|
256 for (int i = 0; i < ITERATIONS; i++) { |
|
257 v += strings[s].indexOf(strings[s + 1]); |
|
258 s += 2; |
|
259 if (s >= strings.length) s = 0; |
|
260 } |
|
261 return v; |
|
262 } |
|
263 |
|
264 public static void test_varsub_indexof(String a, String b) { |
|
265 System.out.println("Start search variable size substring in string (" + b.length() + " chars)"); |
|
266 long start_it = System.currentTimeMillis(); |
|
267 int limit = 1; // last a.length() == 1 |
|
268 while (a.length() > limit) { |
|
269 a = a.substring(1); |
|
270 long start = test_init(a, b); |
|
271 int v = test_subvar(); |
|
272 test_end(a, b, v, (b.length() - a.length()), start); |
|
273 } |
|
274 long end_it = System.currentTimeMillis(); |
|
275 System.out.println("End search variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it)); |
|
276 } |
|
277 |
|
278 public static void test_varstr_indexof(String a, String b) { |
|
279 System.out.println("Start search substring (" + a.length() + " chars) in variable size string"); |
|
280 long start_it = System.currentTimeMillis(); |
|
281 int limit = a.length(); |
|
282 while (b.length() > limit) { |
|
283 b = b.substring(1); |
|
284 long start = test_init(a, b); |
|
285 int v = test_subvar(); |
|
286 test_end(a, b, v, (b.length() - a.length()), start); |
|
287 } |
|
288 long end_it = System.currentTimeMillis(); |
|
289 System.out.println("End search substring (" + a.length() + " chars) in variable size string, time: " + (end_it - start_it)); |
|
290 } |
|
291 |
|
292 public static void test_missub_indexof(String a, String b) { |
|
293 System.out.println("Start search non matching variable size substring in string (" + b.length() + " chars)"); |
|
294 long start_it = System.currentTimeMillis(); |
|
295 int limit = 1; // last a.length() == 1 |
|
296 while (a.length() > limit) { |
|
297 a = a.substring(1); |
|
298 long start = test_init(a, b); |
|
299 int v = test_subvar(); |
|
300 test_end(a, b, v, (-1), start); |
|
301 } |
|
302 long end_it = System.currentTimeMillis(); |
|
303 System.out.println("End search non matching variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it)); |
|
304 } |
|
305 |
|
306 |
|
307 |
|
308 public static void test_consub_indexof(TestCon tc, String b) { |
|
309 System.out.println("Start search constant substring (" + tc.constr().length() + " chars)"); |
|
310 long start_it = System.currentTimeMillis(); |
|
311 int limit = tc.constr().length(); |
|
312 while (b.length() > limit) { |
|
313 b = b.substring(1); |
|
314 long start = test_init(tc.constr(), b); |
|
315 int v = test_subcon(tc); |
|
316 test_end(tc.constr(), b, v, (b.length() - tc.constr().length()), start); |
|
317 } |
|
318 long end_it = System.currentTimeMillis(); |
|
319 System.out.println("End search constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it)); |
|
320 } |
|
321 |
|
322 public static void test_conmis_indexof(TestCon tc, String b) { |
|
323 System.out.println("Start search non matching constant substring (" + tc.constr().length() + " chars)"); |
|
324 long start_it = System.currentTimeMillis(); |
|
325 int limit = tc.constr().length(); |
|
326 while (b.length() > limit) { |
|
327 b = b.substring(1); |
|
328 long start = test_init(tc.constr(), b); |
|
329 int v = test_subcon(tc); |
|
330 test_end(tc.constr(), b, v, (-1), start); |
|
331 } |
|
332 long end_it = System.currentTimeMillis(); |
|
333 System.out.println("End search non matching constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it)); |
|
334 } |
|
335 |
|
336 public static int test_subcon(TestCon tc) { |
|
337 int s = 0; |
|
338 int v = 0; |
|
339 for (int i = 0; i < ITERATIONS; i++) { |
|
340 v += tc.indexOf(strings[s]); |
|
341 s += 2; |
|
342 if (s >= strings.length) s = 0; |
|
343 } |
|
344 return v; |
|
345 } |
|
346 |
|
347 private interface TestCon { |
|
348 public String constr(); |
|
349 public int indexOf(String str); |
|
350 } |
|
351 |
|
352 // search constant substring (17 chars). |
|
353 private final static class TestCon17 implements TestCon { |
|
354 private static final String constr = "1111111111111xx1x"; |
|
355 public String constr() { return constr; } |
|
356 public int indexOf(String str) { return str.indexOf(constr); } |
|
357 } |
|
358 |
|
359 // search constant substring (16 chars). |
|
360 private final static class TestCon16 implements TestCon { |
|
361 private static final String constr = "111111111111xx1x"; |
|
362 public String constr() { return constr; } |
|
363 public int indexOf(String str) { return str.indexOf(constr); } |
|
364 } |
|
365 |
|
366 // search constant substring (9 chars). |
|
367 private final static class TestCon9 implements TestCon { |
|
368 private static final String constr = "11111xx1x"; |
|
369 public String constr() { return constr; } |
|
370 public int indexOf(String str) { return str.indexOf(constr); } |
|
371 } |
|
372 |
|
373 // search constant substring (8 chars). |
|
374 private final static class TestCon8 implements TestCon { |
|
375 private static final String constr = "1111xx1x"; |
|
376 public String constr() { return constr; } |
|
377 public int indexOf(String str) { return str.indexOf(constr); } |
|
378 } |
|
379 |
|
380 // search constant substring (4 chars). |
|
381 private final static class TestCon4 implements TestCon { |
|
382 private static final String constr = "xx1x"; |
|
383 public String constr() { return constr; } |
|
384 public int indexOf(String str) { return str.indexOf(constr); } |
|
385 } |
|
386 |
|
387 // search constant substring (3 chars). |
|
388 private final static class TestCon3 implements TestCon { |
|
389 private static final String constr = "x1x"; |
|
390 public String constr() { return constr; } |
|
391 public int indexOf(String str) { return str.indexOf(constr); } |
|
392 } |
|
393 |
|
394 // search constant substring (2 chars). |
|
395 private final static class TestCon2 implements TestCon { |
|
396 private static final String constr = "1y"; |
|
397 public String constr() { return constr; } |
|
398 public int indexOf(String str) { return str.indexOf(constr); } |
|
399 } |
|
400 |
|
401 |
|
402 // search constant substring (1 chars). |
|
403 private final static class TestCon1 implements TestCon { |
|
404 private static final String constr = "y"; |
|
405 public String constr() { return constr; } |
|
406 public int indexOf(String str) { return str.indexOf(constr); } |
|
407 } |
|
408 } |
|
409 |