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