Test6942326.java revision 12158:0fe2815ffa74
18097Sjkh/* 28097Sjkh * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. 38097Sjkh * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 48097Sjkh * 58097Sjkh * This code is free software; you can redistribute it and/or modify it 68097Sjkh * under the terms of the GNU General Public License version 2 only, as 78649Sjkh * published by the Free Software Foundation. 88097Sjkh * 98097Sjkh * This code is distributed in the hope that it will be useful, but WITHOUT 108097Sjkh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 118097Sjkh * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 128097Sjkh * version 2 for more details (a copy is included in the LICENSE file that 138097Sjkh * accompanied this code). 148097Sjkh * 158097Sjkh * You should have received a copy of the GNU General Public License version 168097Sjkh * 2 along with this work; if not, write to the Free Software Foundation, 178097Sjkh * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 188097Sjkh * 198097Sjkh * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 208097Sjkh * or visit www.oracle.com if you need additional information or have any 218097Sjkh * questions. 228097Sjkh */ 238097Sjkh 248097Sjkh/** 258097Sjkh * @test 268097Sjkh * @bug 6942326 278097Sjkh * @summary x86 code in string_indexof() could read beyond reserved heap space 288097Sjkh * 298097Sjkh * @run main/othervm/timeout=300 -Xmx32m -Xbatch -XX:+IgnoreUnrecognizedVMOptions 308097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::main 318097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_varsub_indexof 328097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_varstr_indexof 338097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_missub_indexof 348097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_consub_indexof 358097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_conmis_indexof 368097Sjkh * -XX:CompileCommand=exclude,compiler.codegen.Test6942326::test_subcon 378097Sjkh * compiler.codegen.Test6942326 388097Sjkh */ 398097Sjkh 408097Sjkhpackage compiler.codegen; 418097Sjkh 428097Sjkhpublic class Test6942326 { 438097Sjkh 448097Sjkh static String[] strings = new String[1024]; 458097Sjkh private static final int ITERATIONS = 100000; 468097Sjkh 478262Sjkh public static void main(String[] args) { 488262Sjkh 498262Sjkh long start_total = System.currentTimeMillis(); 508262Sjkh 518262Sjkh // search variable size substring in string (33 chars). 528262Sjkh String a = " 1111111111111xx1111111111111xx11y"; // +1 to execute a.substring(1) first 538262Sjkh String b = "1111111111111xx1111111111111xx11y"; 548262Sjkh test_varsub_indexof(a, b); 558317Sjkh 568262Sjkh // search variable size substring in string (32 chars). 578347Sjkh a = " 1111111111111xx1111111111111xx1y"; 588262Sjkh b = "1111111111111xx1111111111111xx1y"; 598262Sjkh test_varsub_indexof(a, b); 608314Sjkh 618262Sjkh // search variable size substring in string (17 chars). 628262Sjkh a = " 1111111111111xx1y"; 638262Sjkh b = "1111111111111xx1y"; 648262Sjkh test_varsub_indexof(a, b); 658262Sjkh 668262Sjkh // search variable size substring in string (16 chars). 678097Sjkh a = " 111111111111xx1y"; 688097Sjkh b = "111111111111xx1y"; 698097Sjkh test_varsub_indexof(a, b); 708097Sjkh 718097Sjkh // search variable size substring in string (8 chars). 728097Sjkh a = " 1111xx1y"; 738262Sjkh b = "1111xx1y"; 748097Sjkh test_varsub_indexof(a, b); 758641Sjkh 768641Sjkh // search variable size substring in string (7 chars). 778641Sjkh a = " 111xx1y"; 788641Sjkh b = "111xx1y"; 798641Sjkh test_varsub_indexof(a, b); 808641Sjkh 818317Sjkh 828097Sjkh 838347Sjkh // search substring (17 chars) in variable size string. 848097Sjkh a = "1111111111111xx1x"; 858262Sjkh b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first 868262Sjkh test_varstr_indexof(a, b); 878262Sjkh 888262Sjkh // search substring (16 chars) in variable size string. 898262Sjkh a = "111111111111xx1x"; 908640Sjkh b = " 1111111111111xx1111111111111xx1x"; 918628Sjkh test_varstr_indexof(a, b); 928641Sjkh 938640Sjkh // search substring (9 chars) in variable size string. 948097Sjkh a = "11111xx1x"; 958097Sjkh b = " 1111111111111xx1111111111111xx1x"; 968097Sjkh test_varstr_indexof(a, b); 978097Sjkh 988097Sjkh // search substring (8 chars) in variable size string. 998097Sjkh a = "1111xx1x"; 1008097Sjkh b = " 1111111111111xx1111111111111xx1x"; 1018097Sjkh test_varstr_indexof(a, b); 1028097Sjkh 1038262Sjkh // search substring (4 chars) in variable size string. 1048097Sjkh a = "xx1x"; 1058317Sjkh b = " 1111111111111xx1111111111111xx1x"; 1068097Sjkh test_varstr_indexof(a, b); 1078097Sjkh 1088097Sjkh // search substring (3 chars) in variable size string. 1098097Sjkh a = "x1x"; 1108262Sjkh b = " 1111111111111xx1111111111111xx1x"; 1118097Sjkh test_varstr_indexof(a, b); 1128314Sjkh 1138262Sjkh // search substring (2 chars) in variable size string. 1148262Sjkh a = "1y"; 1158262Sjkh b = " 1111111111111xx1111111111111xx1y"; 1168628Sjkh test_varstr_indexof(a, b); 1178628Sjkh 1188097Sjkh 1198097Sjkh 1208097Sjkh // search non matching variable size substring in string (33 chars). 1218097Sjkh a = " 1111111111111xx1111111111111xx11z"; // +1 to execute a.substring(1) first 1228097Sjkh b = "1111111111111xx1111111111111xx11y"; 1238097Sjkh test_missub_indexof(a, b); 1248097Sjkh 1258097Sjkh // search non matching variable size substring in string (32 chars). 1268097Sjkh a = " 1111111111111xx1111111111111xx1z"; 1278262Sjkh b = "1111111111111xx1111111111111xx1y"; 1288097Sjkh test_missub_indexof(a, b); 1298317Sjkh 1308097Sjkh // search non matching variable size substring in string (17 chars). 1318097Sjkh a = " 1111111111111xx1z"; 1328097Sjkh b = "1111111111111xx1y"; 1338097Sjkh test_missub_indexof(a, b); 1348097Sjkh 1358262Sjkh // search non matching variable size substring in string (16 chars). 1368314Sjkh a = " 111111111111xx1z"; 1378262Sjkh b = "111111111111xx1y"; 1388262Sjkh test_missub_indexof(a, b); 1398262Sjkh 1408628Sjkh // search non matching variable size substring in string (8 chars). 1418628Sjkh a = " 1111xx1z"; 1428097Sjkh b = "1111xx1y"; 1438097Sjkh test_missub_indexof(a, b); 1448097Sjkh 1458097Sjkh // search non matching variable size substring in string (7 chars). 1468097Sjkh a = " 111xx1z"; 1478097Sjkh b = "111xx1y"; 1488097Sjkh test_missub_indexof(a, b); 1498097Sjkh 1508097Sjkh 1518262Sjkh 1528097Sjkh // Testing constant substring search in variable size string. 1538317Sjkh 1548097Sjkh // search constant substring (17 chars). 1558097Sjkh b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first 1568097Sjkh TestCon tc = new TestCon17(); 1578097Sjkh test_consub_indexof(tc, b); 1588097Sjkh 1598262Sjkh // search constant substring (16 chars). 1608314Sjkh b = " 1111111111111xx1111111111111xx1x"; 1618262Sjkh tc = new TestCon16(); 1628097Sjkh test_consub_indexof(tc, b); 1638097Sjkh 1648097Sjkh // search constant substring (9 chars). 1658097Sjkh b = " 1111111111111xx1111111111111xx1x"; 1668097Sjkh tc = new TestCon9(); 1678097Sjkh test_consub_indexof(tc, b); 1688262Sjkh 1698262Sjkh // search constant substring (8 chars). 1708628Sjkh b = " 1111111111111xx1111111111111xx1x"; 1718628Sjkh tc = new TestCon8(); 1728097Sjkh test_consub_indexof(tc, b); 1738097Sjkh 1748097Sjkh // search constant substring (4 chars). 1758097Sjkh b = " 1111111111111xx1111111111111xx1x"; 1768097Sjkh tc = new TestCon4(); 1778208Sjkh test_consub_indexof(tc, b); 1788208Sjkh 1798208Sjkh // search constant substring (3 chars). 1808208Sjkh b = " 1111111111111xx1111111111111xx1x"; 1818208Sjkh tc = new TestCon3(); 1828208Sjkh test_consub_indexof(tc, b); 1838649Sjkh 1848208Sjkh // search constant substring (2 chars). 1858317Sjkh b = " 1111111111111xx1111111111111xx1y"; 1868208Sjkh tc = new TestCon2(); 1878208Sjkh test_consub_indexof(tc, b); 1888208Sjkh 1898208Sjkh // search constant substring (1 chars). 1908208Sjkh b = " 1111111111111xx1111111111111xx1y"; 1918649Sjkh tc = new TestCon1(); 1928640Sjkh test_consub_indexof(tc, b); 1938628Sjkh 1948641Sjkh 1958640Sjkh // search non matching constant substring (17 chars). 1968556Sjkh b = " 1111111111111xx1111111111111xx1z"; // +1 to execute b.substring(1) first 1978649Sjkh tc = new TestCon17(); 1988649Sjkh test_conmis_indexof(tc, b); 1998649Sjkh 2008208Sjkh // search non matching constant substring (16 chars). 2018208Sjkh b = " 1111111111111xx1111111111111xx1z"; 2028208Sjkh tc = new TestCon16(); 2038302Sjkh test_conmis_indexof(tc, b); 2048302Sjkh 2058302Sjkh // search non matching constant substring (9 chars). 2068302Sjkh b = " 1111111111111xx1111111111111xx1z"; 2078302Sjkh tc = new TestCon9(); 2088302Sjkh test_conmis_indexof(tc, b); 2098302Sjkh 2108317Sjkh // search non matching constant substring (8 chars). 2118302Sjkh b = " 1111111111111xx1111111111111xx1z"; 2128302Sjkh tc = new TestCon8(); 2138302Sjkh test_conmis_indexof(tc, b); 2148302Sjkh 2158302Sjkh // search non matching constant substring (4 chars). 2168628Sjkh b = " 1111111111111xx1111111111111xx1z"; 2178649Sjkh tc = new TestCon4(); 2188438Sjkh test_conmis_indexof(tc, b); 2198302Sjkh 2208302Sjkh // search non matching constant substring (3 chars). 2218302Sjkh b = " 1111111111111xx1111111111111xx1z"; 2228208Sjkh tc = new TestCon3(); 2238208Sjkh test_conmis_indexof(tc, b); 2248208Sjkh 2258208Sjkh // search non matching constant substring (2 chars). 2268208Sjkh b = " 1111111111111xx1111111111111xx1z"; 2278208Sjkh tc = new TestCon2(); 2288208Sjkh test_conmis_indexof(tc, b); 2298556Sjkh 2308208Sjkh // search non matching constant substring (1 chars). 2318317Sjkh b = " 1111111111111xx1111111111111xx1z"; 2328208Sjkh tc = new TestCon1(); 2338208Sjkh test_conmis_indexof(tc, b); 2348208Sjkh 2358208Sjkh long end_total = System.currentTimeMillis(); 2368208Sjkh System.out.println("End run time: " + (end_total - start_total)); 2378556Sjkh 2388640Sjkh } 2398628Sjkh 2408641Sjkh public static long test_init(String a, String b) { 2418640Sjkh for (int i = 0; i < 512; i++) { 2428281Sjkh strings[i * 2] = new String(b.toCharArray()); 2438556Sjkh strings[i * 2 + 1] = new String(a.toCharArray()); 2448556Sjkh } 2458556Sjkh System.out.print(a.length() + " " + b.length() + " "); 2468208Sjkh return System.currentTimeMillis(); 2478208Sjkh } 2488208Sjkh 2498262Sjkh public static void test_end(String a, String b, int v, int expected, long start) { 2508262Sjkh long end = System.currentTimeMillis(); 2518262Sjkh int res = (v/ITERATIONS); 2528262Sjkh System.out.print(" " + res); 2538262Sjkh System.out.println(" time:" + (end - start)); 2548262Sjkh if (res != expected) { 2558262Sjkh System.out.println("wrong indexOf result: " + res + ", expected " + expected); 2568278Sjkh System.out.println("\"" + b + "\".indexOf(\"" + a + "\")"); 2578262Sjkh System.exit(97); 2588556Sjkh } 2598262Sjkh } 2608317Sjkh 2618262Sjkh public static int test_subvar() { 2628262Sjkh int s = 0; 2638262Sjkh int v = 0; 2648262Sjkh for (int i = 0; i < ITERATIONS; i++) { 2658262Sjkh v += strings[s].indexOf(strings[s + 1]); 2668302Sjkh s += 2; 2678302Sjkh if (s >= strings.length) s = 0; 2688302Sjkh } 2698302Sjkh return v; 2708556Sjkh } 2718640Sjkh 2728628Sjkh public static void test_varsub_indexof(String a, String b) { 2738641Sjkh System.out.println("Start search variable size substring in string (" + b.length() + " chars)"); 2748640Sjkh long start_it = System.currentTimeMillis(); 2758262Sjkh int limit = 1; // last a.length() == 1 2768556Sjkh while (a.length() > limit) { 2778556Sjkh a = a.substring(1); 2788556Sjkh long start = test_init(a, b); 2798262Sjkh int v = test_subvar(); 2808262Sjkh test_end(a, b, v, (b.length() - a.length()), start); 2818262Sjkh } 2828262Sjkh long end_it = System.currentTimeMillis(); 2838262Sjkh System.out.println("End search variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it)); 2848262Sjkh } 2858262Sjkh 2868347Sjkh public static void test_varstr_indexof(String a, String b) { 2878347Sjkh System.out.println("Start search substring (" + a.length() + " chars) in variable size string"); 2888347Sjkh long start_it = System.currentTimeMillis(); 2898347Sjkh int limit = a.length(); 2908347Sjkh while (b.length() > limit) { 2918347Sjkh b = b.substring(1); 2928347Sjkh long start = test_init(a, b); 2938594Sjkh int v = test_subvar(); 2948594Sjkh test_end(a, b, v, (b.length() - a.length()), start); 2958347Sjkh } 2968347Sjkh long end_it = System.currentTimeMillis(); 2978347Sjkh System.out.println("End search substring (" + a.length() + " chars) in variable size string, time: " + (end_it - start_it)); 2988347Sjkh } 2998347Sjkh 3008347Sjkh public static void test_missub_indexof(String a, String b) { 3018347Sjkh System.out.println("Start search non matching variable size substring in string (" + b.length() + " chars)"); 3028347Sjkh long start_it = System.currentTimeMillis(); 303 int limit = 1; // last a.length() == 1 304 while (a.length() > limit) { 305 a = a.substring(1); 306 long start = test_init(a, b); 307 int v = test_subvar(); 308 test_end(a, b, v, (-1), start); 309 } 310 long end_it = System.currentTimeMillis(); 311 System.out.println("End search non matching variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it)); 312 } 313 314 315 316 public static void test_consub_indexof(TestCon tc, String b) { 317 System.out.println("Start search constant substring (" + tc.constr().length() + " chars)"); 318 long start_it = System.currentTimeMillis(); 319 int limit = tc.constr().length(); 320 while (b.length() > limit) { 321 b = b.substring(1); 322 long start = test_init(tc.constr(), b); 323 int v = test_subcon(tc); 324 test_end(tc.constr(), b, v, (b.length() - tc.constr().length()), start); 325 } 326 long end_it = System.currentTimeMillis(); 327 System.out.println("End search constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it)); 328 } 329 330 public static void test_conmis_indexof(TestCon tc, String b) { 331 System.out.println("Start search non matching constant substring (" + tc.constr().length() + " chars)"); 332 long start_it = System.currentTimeMillis(); 333 int limit = tc.constr().length(); 334 while (b.length() > limit) { 335 b = b.substring(1); 336 long start = test_init(tc.constr(), b); 337 int v = test_subcon(tc); 338 test_end(tc.constr(), b, v, (-1), start); 339 } 340 long end_it = System.currentTimeMillis(); 341 System.out.println("End search non matching constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it)); 342 } 343 344 public static int test_subcon(TestCon tc) { 345 int s = 0; 346 int v = 0; 347 for (int i = 0; i < ITERATIONS; i++) { 348 v += tc.indexOf(strings[s]); 349 s += 2; 350 if (s >= strings.length) s = 0; 351 } 352 return v; 353 } 354 355 private interface TestCon { 356 public String constr(); 357 public int indexOf(String str); 358 } 359 360 // search constant substring (17 chars). 361 private final static class TestCon17 implements TestCon { 362 private static final String constr = "1111111111111xx1x"; 363 public String constr() { return constr; } 364 public int indexOf(String str) { return str.indexOf(constr); } 365 } 366 367 // search constant substring (16 chars). 368 private final static class TestCon16 implements TestCon { 369 private static final String constr = "111111111111xx1x"; 370 public String constr() { return constr; } 371 public int indexOf(String str) { return str.indexOf(constr); } 372 } 373 374 // search constant substring (9 chars). 375 private final static class TestCon9 implements TestCon { 376 private static final String constr = "11111xx1x"; 377 public String constr() { return constr; } 378 public int indexOf(String str) { return str.indexOf(constr); } 379 } 380 381 // search constant substring (8 chars). 382 private final static class TestCon8 implements TestCon { 383 private static final String constr = "1111xx1x"; 384 public String constr() { return constr; } 385 public int indexOf(String str) { return str.indexOf(constr); } 386 } 387 388 // search constant substring (4 chars). 389 private final static class TestCon4 implements TestCon { 390 private static final String constr = "xx1x"; 391 public String constr() { return constr; } 392 public int indexOf(String str) { return str.indexOf(constr); } 393 } 394 395 // search constant substring (3 chars). 396 private final static class TestCon3 implements TestCon { 397 private static final String constr = "x1x"; 398 public String constr() { return constr; } 399 public int indexOf(String str) { return str.indexOf(constr); } 400 } 401 402 // search constant substring (2 chars). 403 private final static class TestCon2 implements TestCon { 404 private static final String constr = "1y"; 405 public String constr() { return constr; } 406 public int indexOf(String str) { return str.indexOf(constr); } 407 } 408 409 410 // search constant substring (1 chars). 411 private final static class TestCon1 implements TestCon { 412 private static final String constr = "y"; 413 public String constr() { return constr; } 414 public int indexOf(String str) { return str.indexOf(constr); } 415 } 416} 417 418