hotspot/test/compiler/6942326/Test.java
changeset 8494 4258c78226d9
equal deleted inserted replaced
8493:c865bf427f0e 8494:4258c78226d9
       
     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