commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jérôme Leroux (JIRA) <j...@apache.org>
Subject [jira] [Commented] (BCEL-183) Implement Java 7 field/method name validation rules
Date Wed, 17 Dec 2014 14:32:13 GMT

    [ https://issues.apache.org/jira/browse/BCEL-183?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14249902#comment-14249902
] 

Jérôme Leroux commented on BCEL-183:
------------------------------------

According to the Java SE 7 Edition of _The Java Virtual Machine Specification_, there is not
restriction on the attributes of a method named {{<clinit>}}. To be considered as a
_class or interface initialization method_ a method must have the name {{<clinit>}},
take no arguments, and be void. A method named {{<clinit>}} that is not a  _class or
interface initialization method_ is still valid. That's why there is no specific check for
these methods in the verifier.

The only restriction is about calling a method named {{<clinit>}}, it is forbidden.
The issue is handle by the {{validMethodNameReference(String)}} method.

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.9
{quote}
A class or interface has at most one class or interface initialization method and is initialized
(§5.5) by invoking that method. The initialization method of a class or interface has the
special name <clinit>, takes no arguments, and is void (§4.3.3).

Other methods named <clinit> in a class file are of no consequence. They are not class
or interface initialization methods. They cannot be invoked by any Java Virtual Machine instruction
and are never invoked by the Java Virtual Machine itself. 
{quote}

In the Second Edition of _The Java Virtual Machine Specification_, this clarification is missing.
http://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#12174
{quote}
A class or interface has at most one class or interface initialization method and is initialized
(§2.17.4) by invoking that method. The initialization method of a class or interface is static
and takes no arguments. It has the special name <clinit>. This name is supplied by a
compiler. Because the name <clinit> is not a valid identifier, it cannot be used directly
in a program written in the Java programming language. Class and interface initialization
methods are invoked implicitly by the Java virtual machine; they are never invoked directly
from any Java virtual machine instruction, but are invoked only indirectly as part of the
class initialization process.
{quote}


> Implement Java 7 field/method name validation rules
> ---------------------------------------------------
>
>                 Key: BCEL-183
>                 URL: https://issues.apache.org/jira/browse/BCEL-183
>             Project: Commons BCEL
>          Issue Type: Improvement
>          Components: Verifier
>    Affects Versions: 5.2
>            Reporter: Jérôme Leroux
>             Fix For: 6.0
>
>         Attachments: BCEL-183-2.patch, BCEL-183-2.zip, BCEL-183-src.zip, BCEL-183.patch,
BCEL-183.zip
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> The JustIce bytecode verifier checks the validity of the field name and the variable
name considering the java langage specification. 
> This check is not specified by the bytecode verifier specification.
> This may lead to bytecode verification errors in pass2 on valid classfiles.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message