You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Vera Petrashkova (JIRA)" <ji...@apache.org> on 2007/07/06 13:06:04 UTC

[jira] Updated: (HARMONY-4378) [drlvm][verifier] VM does not reject class when aastore instruction uses the value which is not compatible with the component type of array

     [ https://issues.apache.org/jira/browse/HARMONY-4378?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Vera Petrashkova updated HARMONY-4378:
--------------------------------------

    Attachment: aastoreTest.zip

> [drlvm][verifier]  VM does not reject class when  aastore instruction uses the value which is not compatible with the component type of array
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-4378
>                 URL: https://issues.apache.org/jira/browse/HARMONY-4378
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>            Reporter: Vera Petrashkova
>            Priority: Minor
>         Attachments: aastoreTest.zip
>
>
> According to J2SE VM specifications VM must throw VerifyError when  assignment 
> conversions are not applied.
> But VM does not reject class when aastore instruction uses the value which is not compatible with the component type of array.
> The incorrect situation can not be described on java because such source code is rejected by compiler.
> It is similar the following case:
> --------------------
> public interface aastIntf { 
>     public abstract void intfMethod();
> }
> public class aastClIm implements aastIntf {
>     public void intfMethod() {
>         return;
>     }
>     public int test (String[] args) {
>         try {
>             aastCl cl = new aastCl();
>             cl.testField = new aaClIm();
>             cl.testNeg();
>             return 104;
>        } catch (VerifyError e) {
>            return 104;
>        } catch (ArrayStoreException e) {
>            return 104;
>        }
>    }
> }
> public class aastCl  {
>     public aastIntf testField [];
>     public void testNeg () {
>         aastClIm [][] marr = new aastClIm[1][1];
>          marr[0] = testField;                   <<<<<<<<<<<<<<<<<< wrong assignment
>         return;
>     }
> }
> ------------------------
> The following synthetic test demonstrates this issue. Class files are in attachment.
> -------------aastIntf.jj------------------
> .interface public aastIntf
> .super java/lang/Object
> .method public abstract intfMethod()V
> .end method
> -------aastCl.jj----------
> .class public aastCl
> .super java/lang/Object
> .field public testField [LaastIntf;
> ; standard initializer
> .method public <init>()V
>    aload_0
>    invokespecial java/lang/Object/<init>()V
>    return
> .end method
> .method public testNeg()V
>    .limit stack 3
>    .limit locals 2
>    aload_0
>    getfield aastCl/testField [LaastIntf;
>    astore_1
> ; aastClIm [][] marr = new aastClIm[1][1]
> ; marr[0] = testField 
>    sipush 1
>    sipush 1
>    multianewarray [[LaastClIm; 2
>    sipush 0
>    aload_1
>    aastore
>   return
> .end method
> -------aastClIm.jj--------
> .class public aastClIm
> .super java/lang/Object
> .implements aastIntf
> ; standard initializer
> .method public <init>()V
>    aload_0
>    invokespecial java/lang/Object/<init>()V
>    return
> .end method
> ; test method
> .method public test([Ljava/lang/String;)I
>    .limit stack 3
>    .limit locals 3
> .catch java/lang/VerifyError from first to second using catcher
> .catch java/lang/ArrayStoreException from first to second using catcher1
> first:
>    new aastCl
>    dup
>    invokespecial aastCl/<init>()V
>    astore_2
>    aload_2
>    sipush 1
>    anewarray aastClIm
>    putfield aastCl/testField [LaastIntf;
>    aload_2
>    invokevirtual aastCl/testNeg()V
> second:
>    sipush 105
>    ireturn
> catcher:
>    sipush 104
>    ireturn
> catcher1:
>    sipush 104
>    ireturn
> .end method
> .method public intfMethod()V
>   .limit stack 2
>   .limit locals 1
>    return
> .end method
> --------test.java---------
> public class test {
>     public static void main(String[] args) {        
>         try {           
>             int t = new aastClIm().test(args);
>             System.out.println( t == 104 ? "Test passed" : "Test failed");
>             System.out.println("Returned value: "+t);
>         } catch (Throwable e){
>             System.out.println("Test failed. Unexpected error was thrown");
>             e.printStackTrace();
>         }
>     }
> }
> -------------
> Output on Harmony:
> ==========
> Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> java version "1.5.0"
> pre-alpha : not complete or compatible
> svn = r551077, (Jun 27 2007), Windows/ia32/msvc 1310, release build
> http://harmony.apache.org
> Test failed
> Returned value: 105
> This test also fails on RI:
> ===========
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
> Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
> Test failed
> Returned value: 105
> This issue causes the failure of VTS test
> vm/jvms/classFile/constraints/structural/constraint18/aastore03/aastore03.xml

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.