| # LyX 1.1 created this file. For more info see http://www.lyx.org/ |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| \lyxformat 218 |
| \textclass scrbook |
| \begin_preamble |
| |
| \end_preamble |
| \language english |
| \inputencoding latin1 |
| \fontscheme default |
| \graphics default |
| \float_placement !htp |
| \paperfontsize default |
| \spacing single |
| \papersize Default |
| \paperpackage a4wide |
| \use_geometry 0 |
| \use_amsmath 0 |
| \paperorientation portrait |
| \secnumdepth 2 |
| \tocdepth 2 |
| \paragraph_separation indent |
| \defskip medskip |
| \quotes_language english |
| \quotes_times 2 |
| \papercolumns 1 |
| \papersides 2 |
| \paperpagestyle default |
| |
| \layout Subject |
| |
| |
| \emph on |
| Diplomarbeit |
| \layout Title |
| |
| JustIce |
| \newline |
| |
| \size small |
| A Free Class File Verifier for Java |
| \latex latex |
| |
| \backslash |
| texttrademark\SpecialChar ~ |
| |
| \layout Author |
| |
| Enver Haase |
| \newline |
| |
| \size tiny |
| <ehaase@inf.fu-berlin.de> |
| \layout Date |
| |
| September 2001 |
| \layout Publishers |
| |
| Freie Universität Berlin |
| \newline |
| Institut für Informatik |
| \newline |
| Takustraße 9 |
| \newline |
| D-14195 Berlin |
| \layout Lowertitleback |
| |
| |
| \series bold |
| \size scriptsize |
| Revision |
| \series default |
| |
| \series bold |
| \shape smallcaps |
| $Id$ |
| \layout Minisec |
| |
| Erklärung |
| \begin_float footnote |
| \layout Standard |
| |
| I declare that I wrote this |
| \emph on |
| Diplomarbeit |
| \emph default |
| completely on my own and without the help of persons not listed. |
| All sources of information are listed in the Bibliography section. |
| \end_float |
| \layout Standard |
| |
| Hiermit versichere ich, die vorliegende Diplomarbeit selbständig und ohne |
| fremde Hilfe verfaßt zu haben. |
| Es wurden nur die in der Bibliographie angegebenen Quellen benutzt. |
| \layout Minisec |
| |
| Danksagung |
| \begin_float footnote |
| \layout Standard |
| |
| The creation of this |
| \emph on |
| Diplomarbeit |
| \emph default |
| paper was supported and supervised by Prof. |
| Dr. |
| Elfriede Fehr and Dipl.-Inform. |
| Markus Dahm. |
| Keith Seymour suggested a lot of language-related improvements. |
| Thank you. |
| \end_float |
| \layout Standard |
| |
| Während der Anfertigung dieser Diplomarbeit wurde ich von Prof. |
| Dr. |
| Elfriede Fehr und Dipl.-Inform. |
| Markus Dahm betreut, wofür ich mich an dieser Stelle herzlich bedanke. |
| \layout Standard |
| |
| Desweiteren bedanke ich mich bei Keith Seymour, der mir eine Reihe sprachspezifi |
| scher Verbesserungsvorschläge sandte. |
| \layout Minisec |
| |
| Autor |
| \begin_float footnote |
| \layout Standard |
| |
| Author |
| \end_float |
| \layout Standard |
| |
| Enver Haase |
| \newline |
| Gubener Straße 18 |
| \newline |
| D-10243 Berlin |
| \newline |
| |
| \layout Standard |
| |
| |
| \begin_inset LatexCommand \tableofcontents{} |
| |
| \end_inset |
| |
| |
| \layout Addchap |
| |
| Abstract |
| \layout Standard |
| |
| When Sun Microsystems developed their |
| \emph on |
| Java Platform |
| \emph default |
| in the early 1990s, it was originally designed for use in networked and |
| embedded consumer-electronics applications. |
| But when they introduced it around 1995, it quickly became used in World |
| Wide Web browser software. |
| This was a way to bring interactive content to demanding World Wide Web |
| users. |
| Sun took great care for the robustness of the platform: they planned to |
| connect embedded devices and let them share data and code over a network. |
| Defective devices transmitting bad data or unreliable network connections |
| should not cause other devices to crash. |
| This property made Java a good choice for the code-executing engine in |
| World Wide Web browsers: defective server software or transmission errors |
| would not cause the |
| \emph on |
| Java Platform |
| \emph default |
| to crash; this is also true for purposely malicious code hidden on the |
| Web. |
| The code-executing part of the |
| \emph on |
| Java Platform |
| \emph default |
| is called |
| \emph on |
| The Java Virtual Machine |
| \emph default |
| (the |
| \emph on |
| JVM |
| \emph default |
| , for short). |
| This execution engine has to assure that the code to be executed is well-behave |
| d; it has to |
| \emph on |
| verify |
| \emph default |
| the code. |
| Therefore, the |
| \emph on |
| verifier |
| \emph default |
| is an integral part of every JVM, but JustIce implements a verifier that |
| is not integrated in a JVM. |
| It was implemented using a software library called the |
| \emph on |
| Byte Code Engineering Library |
| \emph default |
| (the |
| \emph on |
| BCEL |
| \emph default |
| , for short) by Markus Dahm |
| \begin_inset LatexCommand \cite{BCEL98,BCEL-WWW} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| The BCEL is intended to give users a convenient mechanism to analyze, create |
| and manipulate (binary) Java class files. |
| It offers an object-oriented view of otherwise raw data, including program |
| code. |
| This library is, therefore, well-respected especially in the compiler-writer |
| community whenever the JVM is chosen as the target machine of the compiler. |
| Compiler back-ends use the BCEL to produce code for the JVM; and as new |
| compilers may be faulty, they may produce bad code. |
| Testing these compilers often is a difficult task. |
| The generated code should not only be semantically correct, but it also |
| has to pass the verifiers of all existing JVM implementations. |
| Normally, a lot of human interaction is required to run test cases. |
| If the code is rejected by a verifier, one often does not know why. |
| Most verifiers emit error messages which do not identify the offending |
| instruction. |
| \layout Standard |
| |
| JustIce presents an Application Programming Interface (API) that may be |
| used to automate the procedure sketched above. |
| The constraints imposed on class files are designed to be strict, therefore |
| eleminating the need to run several verifiers on the generated code. |
| If code passes the JustIce verifier, it should pass all other verifiers. |
| JustIce was also designed to output human-understandable messages if the |
| verification of some code fails. |
| \layout Standard |
| |
| The application range of JustIce is not limited to compiler back-ends, in |
| the same sense as the BCEL is not only useful in this area. |
| Transformations of existing code and even generation of hand-crafted code |
| fall into its scope, too. |
| As a side effect, JustIce exports some data structures such as a control |
| flow graph; so its API may also be used for applications targeting other |
| problem areas such as static analyses of program code. |
| \layout Chapter |
| |
| Introduction |
| \layout Section |
| |
| Low Level Security as a Part of a Many-Tiered Strategy |
| \layout Standard |
| |
| The Java programming language is well-known for its inherent security facilities |
| such as the lack of pointer arithmetic or the need for memory allocation |
| and deallocation. |
| Lesser known is that this is only the top of an iceberg; the |
| \emph on |
| Java Platform |
| \emph default |
| implements a many-tiered security strategy |
| \begin_inset LatexCommand \cite{Yellin-WWW} |
| |
| \end_inset |
| |
| . |
| It was designed to run even untrusted code -- code that possibly was not |
| produced by a compiler for the Java programming language, code that may |
| be corrupt or code that may have malicious intent (such as stealing credit |
| card number information from a hard disk drive). |
| Three considerations were made: |
| \layout Itemize |
| |
| Untrusted code could damage hardware, software, or information on the host |
| machine. |
| \layout Itemize |
| |
| It could pass unauthorized information to anyone. |
| \layout Itemize |
| |
| It could cause the host machine to become unusable through resource depletion. |
| \layout Standard |
| |
| While some security features such as type-safety or the already-mentioned |
| lack of pointer arithmetic of the Java programming language are a convenient |
| help for programmers, they can only help to reduce programming errors. |
| Of course these features do not help targeting the above problems. |
| At a lower level, however, the |
| \emph on |
| Java Plat\SpecialChar \- |
| form |
| \emph default |
| implements a so-called sandbox: an area where code can be executed but |
| that has well-defined boundaries shielding the rest of the system. |
| This is achieved by means of a |
| \emph on |
| Java Virtual Machine |
| \emph default |
| (JVM) emulation; the host platform does not directly run untrusted code, |
| but a |
| \emph on |
| run-time system |
| \emph default |
| which in turn runs the code, restricting its access to system resources. |
| \layout Standard |
| |
| A run-time system cannot safely assume that untrusted code is well-behaved. |
| Code could cause stack overflows, stack underruns, or otherwise erroneous |
| behaviour that may bring the run-time system into an undefined state -- |
| possibly allowing access to protected memory areas. |
| One could protect the run-time system by letting it predict the effects |
| of every single instruction just in time while actually executing it -- |
| but that would be too time-consuming to be applicable in practice. |
| \layout Standard |
| |
| Therefore, good behaviour of program code has to be enforced |
| \emph on |
| before |
| \emph default |
| it is actually executed -- at least as far as this is possible. |
| This is the lowest level of Java security; there has to be an integral |
| component in every JVM implementation doing so ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 420). |
| This part of the JVM is called the |
| \emph on |
| class file verifier |
| \emph default |
| , yet better known as the |
| \emph on |
| bytecode verifier. |
| |
| \emph default |
| Technically speaking, bytecode verification is only a part of class file |
| verification so |
| \emph on |
| class file verifier |
| \emph default |
| is a more embracing term. |
| JustIce implements a whole class file verifier. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 396 |
| file chap1.eps |
| width 3 100 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| Concept of Class File Verification |
| \end_float |
| \layout Section |
| |
| Why Another Verifier? |
| \layout Standard |
| |
| As said before, every JVM implementation must contain a class file verifier, |
| so it is reasonable to ask for the motivation behind creating just another |
| class file verifier -- especially one that is |
| \emph on |
| not |
| \emph default |
| part of a JVM implementation. |
| \layout Subsection |
| |
| Bytecode Engineers Need JustIce |
| \layout Standard |
| |
| Shortly after the |
| \emph on |
| Java Platform |
| \emph default |
| was introduced, it was adopted with pleasure because of its inherent independen |
| ce from operating systems and concrete hardware. |
| Industry and educational institutions with heterogenous networked computers |
| could now run the same software program on different host machines. |
| Soon, many efforts were put into research and development of compilers |
| for programming languages other than the Java programming language that |
| use the JVM bytecode as target. |
| \layout Standard |
| |
| Nowadays, many other programming languages do have the JVM as its target |
| platform; e.g. |
| Fortran |
| \begin_inset LatexCommand \cite{f2j} |
| |
| \end_inset |
| |
| , Ada |
| \begin_inset LatexCommand \cite{AppMag-WWW} |
| |
| \end_inset |
| |
| , Scheme |
| \begin_inset LatexCommand \cite{KAWA-WWW} |
| |
| \end_inset |
| |
| or modified Java language versions |
| \begin_inset LatexCommand \cite{GJ-WWW,PMG-WWW} |
| |
| \end_inset |
| |
| . |
| A vast collection of programming languages targeting the JVM can be found |
| on the World Wide Web |
| \begin_inset LatexCommand \cite{PL4JVM} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| All these compilers emit code for the JVM -- and so all these compilers |
| have to pass the JVM's verifier. |
| Implementors of such compilers have to consider the security related constraint |
| s the JVM poses on the generated code. |
| It is difficult to test if the emitted code works on all JVM implementations, |
| passing all JVM verifier implementations. |
| This is especially problematic if not all of the project's class files |
| are loaded into the JVM during a test run, because then they will not be |
| verified. |
| \layout Standard |
| |
| Having an opportunity to verify the transitive hull of referenced class |
| files (starting with some main class file) would be of help; JustIce offers |
| it. |
| \layout Standard |
| |
| The Bytecode Engineering Library by Markus Dahm is often used as a compiler |
| back-end to emit code, but it is also used to hand-craft code or to implement |
| bytecode transformations. |
| Because JustIce works closely together with the BCEL, users of the BCEL |
| do not even have to leave their development environment to run the JustIce |
| verifier. |
| \layout Standard |
| |
| To our knowledge, JustIce is the only implementation of a Java class file |
| verifier that was written in the Java programming language |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| itself |
| \begin_float footnote |
| \layout Standard |
| |
| In a personal communication, Robert Stärk told the author that there was |
| a Java implementation of the verifier discussed in |
| \begin_inset LatexCommand \cite{JBook} |
| |
| \end_inset |
| |
| , written by Joachim Schmid using the BCEL. |
| However, it is not released for public use yet. |
| \end_float |
| . |
| Because of its |
| \emph on |
| Verification API |
| \emph default |
| , it can be included in other software projects written in Java with more |
| ease than any other verifier implementation in a different programming |
| language could provide. |
| \layout Subsection |
| |
| JustIce is Verbose |
| \layout Standard |
| |
| Usually, when classes pass the verifier, it is mute. |
| JustIce, in contrast, distinguishes between verification results and messages. |
| Messages are often warnings, but the reason for emitting such a warning |
| instead of a negative verification result is because the class file does |
| not pose a threat to the integrity of the JVM and thus does not have to |
| be rejected. |
| \layout Standard |
| |
| When a verification error occurs and the class file is rejected, even the |
| built-in verifiers usually produce some output saying so. |
| As an example, consider the following verifier run: |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| ehaase@haneman:/home/ehaase > java Cc |
| \newline |
| Exception in thread "main" java.lang.VerifyError: |
| \newline |
| (class: Cc, method: ttt signature: ()V) |
| \newline |
| Recursive call to jsr entry |
| \family default |
| |
| \newline |
| |
| \latex latex |
| |
| \newline |
| |
| \layout Standard |
| |
| One might ask |
| \emph on |
| which |
| \emph default |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| jsr entry |
| \begin_inset Quotes erd |
| \end_inset |
| |
| (a branch target of a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or a |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction) is called recursively and which instructions may be responsible |
| for this. |
| Compare this to JustIce's output: |
| \newline |
| |
| \newline |
| [...] |
| \layout Standard |
| |
| |
| \family typewriter |
| Pass 3b, method number 0 ['public static void ttt()']: |
| \layout Standard |
| |
| |
| \family typewriter |
| VERIFIED_REJECTED |
| \layout Standard |
| |
| |
| \family typewriter |
| Constraint violated in method 'public static void ttt()': |
| \layout Standard |
| |
| |
| \family typewriter |
| Subroutine with local variable '1', JSRs '[ 36: jsr[168](3) -> astore_1, |
| 8: jsr[168](3) -> astore_1, 30: jsr[168](3) -> astore_1, 23: jsr[168](3) |
| -> astore_1]', RET ' 62: ret[169](2) 1' is called by a subroutine which |
| uses the same local variable index as itself; maybe even a recursive call? |
| JustIce's clean definition of a subroutine forbids both. |
| \newline |
| |
| \family default |
| [...] |
| \layout Standard |
| |
| |
| \family typewriter |
| Warnings: |
| \layout Standard |
| |
| |
| \family typewriter |
| Pass 2: Attribute 'LineNumber(0, 4), LineNumber(0, 5), LineNumber(15, 8), |
| LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 13), LineNumber(64, |
| 15)' as an attribute of Code attribute '<CODE>' (method 'public static |
| void ttt()') will effectively be ignored and is only useful for debuggers |
| and such. |
| \layout Standard |
| |
| |
| \family typewriter |
| Pass 2: Attribute 'LineNumber(0, 1), LineNumber(4, 1)' as an attribute of |
| Code attribute '<CODE>' (method 'public void <init>()') will effectively |
| be ignored and is only useful for debuggers and such. |
| \layout Standard |
| |
| |
| \family typewriter |
| Pass 3a: LineNumberTable attribute 'LineNumber(0, 4), LineNumber(0, 5), |
| LineNumber(15, 8), LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, |
| 13), LineNumber(64, 15)' refers to the same code offset ('0') more than |
| once which is violating the semantics [but is sometimes produced by IBM's |
| 'jikes' compiler]. |
| \newline |
| |
| \layout Standard |
| |
| This output obviously has an answer to the above question; it shows the |
| only |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instructions possibly responsible for a recursive call (which is not allowed |
| by the specification of the JVM). |
| For the special --but clean-- definition of subroutines JustIce uses, please |
| see section |
| \begin_inset LatexCommand \ref{Subroutines_Def} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| Note also the warning messages. |
| Class files that were not generated by Sun's |
| \emph on |
| javac |
| \emph default |
| compiler have a tendency to look a little different in some corner cases. |
| IBM's |
| \emph on |
| jikes |
| \emph default |
| compiler, for instance, produces LineNumberTable attributes (see |
| \begin_inset LatexCommand \ref{LineNumberTableAttribute} |
| |
| \end_inset |
| |
| ) which look different from those created by |
| \emph on |
| javac |
| \emph default |
| . |
| Detecting such differences is desirable because future JVMs will have stricter |
| verification checks |
| \begin_float footnote |
| \layout Standard |
| |
| The Solaris port of Sun's JVM, version 1.3.0_01, already has (some of) the |
| stricter checks built in. |
| You may enable them using the command-line option '-Xfuture'. |
| Nothing about this issue is mentioned in the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| \end_float |
| (which most old |
| \emph on |
| javac |
| \emph default |
| -compiled class files will probably still pass). |
| JustIce guides bytecode engineers to create class files that are indistinguisha |
| ble from those created by |
| \emph on |
| javac |
| \emph default |
| to retain compatibility with Sun's future JVM implementations. |
| Figure |
| \begin_inset LatexCommand \ref{FigVenn} |
| |
| \end_inset |
| |
| graphically shows the relationship between class files and the verifier |
| \begin_float footnote |
| \layout Standard |
| |
| This is a simplicistic figure; unfortunately, there are class files produced |
| by the |
| \emph on |
| javac |
| \emph default |
| compiler that do not pass the verifier. |
| Please see section |
| \begin_inset LatexCommand \ref{javacRejected} |
| |
| \end_inset |
| |
| for more details. |
| \end_float |
| . |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 378 |
| file VennDiag.eps |
| width 3 100 |
| height 3 45 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{FigVenn} |
| |
| \end_inset |
| |
| Venn diagram showing the operating domain of the Java verifier. |
| \end_float |
| \layout Subsection |
| |
| JustIce is Free |
| \layout Standard |
| |
| Currently, there is no other free and complete open source verifier available |
| known to the author. |
| You may have a look at the JVM's source code by Sun Microsystems but you |
| are not allowed to use the knowledge from that inspection for your own |
| projects or even use their code. |
| JustIce is a clean-room implementation: the author wrote JustIce by only |
| reading the Java |
| \latex latex |
| |
| \backslash |
| texttrademark |
| \latex default |
| \SpecialChar ~ |
| Virtual Machine Specification, Second Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| and comparing the behaviour of JustIce with the behaviour of commercial |
| implementations of Sun Microsystems and IBM Corporation. |
| \layout Standard |
| |
| The open source JVM implementation |
| \emph on |
| Kaffe |
| \emph default |
| |
| \begin_inset LatexCommand \cite{Kaffe-WWW} |
| |
| \end_inset |
| |
| , for example |
| \emph on |
| , |
| \emph default |
| does not have a |
| \emph on |
| complete |
| \emph default |
| verifier built in (although mandated by the JVM specification). |
| \layout Standard |
| |
| |
| \emph on |
| Kissme |
| \emph default |
| |
| \begin_inset LatexCommand \cite{kissme-WWW} |
| |
| \end_inset |
| |
| , another open source JVM implementation, currently does not include any |
| verifier at all. |
| |
| \layout Standard |
| |
| The JVM implementations |
| \emph on |
| SableVM |
| \emph default |
| |
| \begin_inset LatexCommand \cite{SableVM-WWW} |
| |
| \end_inset |
| |
| and Intel Corporation's |
| \emph on |
| Open Runtime Platform |
| \emph default |
| |
| \begin_inset LatexCommand \cite{ORP-WWW} |
| |
| \end_inset |
| |
| are platforms to experiment with performance-enhancements. |
| They are not intended to work as general-purpose JVMs so they do not need |
| to implement verifiers. |
| \layout Standard |
| |
| Other open source projects that could make use of a free verifier include |
| the Java compiler |
| \emph on |
| gcj |
| \emph default |
| which is part of the GNU compiler collection |
| \begin_inset LatexCommand \cite{GCC-WWW} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| JustIce is covered by the well-known and respected software license |
| \emph on |
| GNU General Public License |
| \emph default |
| (GPL); see section |
| \begin_inset LatexCommand \ref{GPL} |
| |
| \end_inset |
| |
| . |
| The author hopes other free software will benefit from it; from the JustIce |
| software |
| \begin_inset LatexCommand \cite{JustIce} |
| |
| \end_inset |
| |
| as well as from this paper describing some of the inner workings of JustIce. |
| \layout Chapter |
| |
| The Java Virtual Machine |
| \layout Standard |
| |
| The Java Virtual Machine (JVM) is an abstract machine specified in |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| It has no knowledge about the Java programming language; but only of a |
| certain binary file format: the class file format. |
| A class file contains machine instructions for the JVM (called |
| \emph on |
| bytecodes |
| \emph default |
| ), a symbol table (called |
| \emph on |
| constant pool |
| \emph default |
| ) and some other ancillary information. |
| \layout Standard |
| |
| On method invocation, a local stack frame is set up called the |
| \emph on |
| execution frame |
| \emph default |
| . |
| It consists of an |
| \emph on |
| operand stack |
| \emph default |
| and |
| \emph on |
| local variables |
| \emph default |
| (which may be compared to registers of traditional machines). |
| \layout Standard |
| |
| The instructions in the code arrays of class files are interpreted by the |
| JVM. |
| There are 212 legal instructions; they have read-access to the class file's |
| constant pool and they can modify the operand stack and the local variables |
| in their execution frame. |
| An invoked method reads its arguments from the local variables. |
| Certain instructions pass a return value to the invoking method. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{Classfile Structure} |
| |
| \end_inset |
| |
| The ClassFile Structure |
| \layout Standard |
| |
| Traditionally, the JVM loads its programs from files stored on file systems |
| of host machines; these files have names that end with |
| \emph on |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| .class |
| \begin_inset Quotes erd |
| \end_inset |
| |
| |
| \emph default |
| . |
| It is possible to store the files in various other ways; a so-called |
| \emph on |
| class loader |
| \emph default |
| is then used to transform the files internally to the desired, basic class |
| file format. |
| Therefore, it suffices to explain the structure of traditional class files. |
| Every class file consists of a single |
| \family typewriter |
| ClassFile |
| \family default |
| structure as defined below. |
| It defines a single class as known from the Java Programming Language |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| . |
| The terms |
| \emph on |
| class |
| \emph default |
| and |
| \emph on |
| class file |
| \emph default |
| may therefore be used interchangeably. |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 526 |
| file classfile.eps |
| width 3 100 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Standard |
| |
| A class file consists of constants, fields, methods, attributes and some |
| ancillary information. |
| This figure was taken from |
| \begin_inset LatexCommand \cite{BCEL98} |
| |
| \end_inset |
| |
| , used with permission of the author. |
| \layout Caption |
| |
| A Class File |
| \end_float |
| \layout Standard |
| |
| As we will see, the |
| \family typewriter |
| ClassFile |
| \family default |
| structure and its sub-structures are defined for upwards compatibility, |
| i.e., new structure definitions can be added to the specification easily |
| at a later time. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| ClassFile { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 magic; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 minor_version; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 major_version; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 constant_pool_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| cp_info constant_pool[constant_pool_count-1]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 access_flags; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 this_class; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 super_class; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 interfaces_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 interfaces[interfaces_count]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 fields_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| field_info fields[fields_count]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 methods_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| method_info methods[methods_count]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attributes_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| attribute_info attributes[attributes_count]; |
| \newline |
| } |
| \newline |
| |
| \newline |
| |
| \family default |
| You may read an ' |
| \family typewriter |
| u |
| \family default |
| ' as 'byte times'; e.g., ' |
| \family typewriter |
| u2 |
| \family default |
| ' means 'two bytes in size'. |
| We will not delve into too much detail here; the exact specification of |
| the entries are published by Sun |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| But one should note that besides some other information, a class file basically |
| defines |
| \emph on |
| attributes |
| \emph default |
| , |
| \emph on |
| constants |
| \emph default |
| , |
| \emph on |
| fields |
| \emph default |
| and |
| \emph on |
| methods |
| \emph default |
| . |
| Also, there are strong structural constraints imposed on class files. |
| It is a verifier's task to validate them. |
| \layout Subsection |
| |
| Attributes |
| \layout Standard |
| |
| The general format of an attribute is defined below. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| attribute_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attribute_name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 attribute_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 info[attribute_length]; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| An attribute is basically a typed data container; its type is determined |
| by its name. |
| Every JVM is required to be silent about attributes of types it does not |
| know. |
| On the other hand, newly defined attributes are required not to impose |
| a semantical change on the class file. |
| These attributes should be uniquely named; in fact, the pair (<attribute |
| name>, <attribute length>) is required to be unique. |
| This is guaranteed because attributes not defined by Sun Microsystems have |
| to be named according to the package naming scheme of the Java Programming |
| Language |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| . |
| Certain basic attributes are predefined. |
| They are used in the |
| \family typewriter |
| ClassFile |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Classfile Structure} |
| |
| \end_inset |
| |
| ), |
| \family typewriter |
| field_info |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Fields} |
| |
| \end_inset |
| |
| ) and |
| \family typewriter |
| method_info |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Methods} |
| |
| \end_inset |
| |
| ). |
| Also, attributes may be nested: the |
| \family typewriter |
| Code |
| \family default |
| attribute references other attributes. |
| \layout Standard |
| |
| Some examples for predefined attributes are listed below. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{ConstantValueAttribute} |
| |
| \end_inset |
| |
| The ConstantValue attribute |
| \layout Standard |
| |
| The ConstantValue attribute has the following format: |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| ConstantValue_attribute { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attribute_name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 attribute_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 constantvalue_index; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| The |
| \family typewriter |
| ConstantValue |
| \family default |
| attribute represents the value of a constant field. |
| It has a fixed length: it contains only a two-byte reference into the constant |
| pool. |
| Only |
| \family typewriter |
| field_info |
| \family default |
| structures (see section |
| \begin_inset LatexCommand \ref{Fields} |
| |
| \end_inset |
| |
| ) contain this type of attribute. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{CodeAttribute} |
| |
| \end_inset |
| |
| The Code Attribute |
| \layout Standard |
| |
| The |
| \family typewriter |
| Code |
| \family default |
| attribute is used in the |
| \family typewriter |
| method_info |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Methods} |
| |
| \end_inset |
| |
| ) structure. |
| It represents the program code of a method and it is defined as follows: |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| Code_attribute { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attribute_name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 attribute_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 max_stack; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 max_locals; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 code_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 code[code_length]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 exception_table_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 start_pc; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 end_pc; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 handler_pc; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 catch_type; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } exception_table[exception_table_length]; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attributes_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| attribute_info attributes[attributes_count]; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| This is the most complex of all predefined attributes. |
| Every method that has code (i.e., every non-native, non-abstract method) |
| must have such an attribute. |
| Note that the maximum stack depth and the number of local variables for |
| a method invocation are defined here. |
| This is important for the JVM when it creates an |
| \emph on |
| execution frame |
| \emph default |
| (see section |
| \begin_inset LatexCommand \ref{LV_and_OpStack} |
| |
| \end_inset |
| |
| ) at the time the method is invoked. |
| \layout Standard |
| |
| Also, the exception handlers are defined here. |
| Exception handlers prevent an executing method from an abrupt completion |
| if an exceptional situation occurs. |
| Code areas are said to be protected against a class of exceptional situations |
| by an exception handler |
| \begin_float footnote |
| \layout Standard |
| |
| The JVM closely reflects the |
| \emph on |
| exception |
| \emph default |
| mechanism of the Java programming language |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| . |
| In the Java programming language, exceptions can be |
| \emph on |
| thrown |
| \emph default |
| , and they can be |
| \emph on |
| caught |
| \emph default |
| explicitly. |
| If an internal JVM error occurs, the JVM also --implicitly-- throws an |
| exception. |
| \end_float |
| . |
| Algorithm |
| \begin_inset LatexCommand \ref{ExcHdAlgo} |
| |
| \end_inset |
| |
| shows an example for the use of exception handlers. |
| The exact meaning of the instruction opcodes is not important here, the |
| most common instructions are explained later in this paper. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Standard |
| |
| [Let |
| \family typewriter |
| start_pc |
| \family default |
| and |
| \family typewriter |
| end_pc |
| \family default |
| protect the area A to B, inclusive. |
| Let the |
| \family typewriter |
| catch_type |
| \family default |
| be |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \family typewriter |
| java.lang.NullPointerException |
| \family default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| Let the |
| \family typewriter |
| handler_pc |
| \family default |
| point to C.] |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| aconst_null\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; push a NULL onto the operand stack. |
| \layout Standard |
| |
| |
| \family typewriter |
| A:\SpecialChar ~ |
| nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; do nothing |
| \layout Standard |
| |
| |
| \family typewriter |
| B:\SpecialChar ~ |
| getfield Foo::bar\SpecialChar ~ |
| \SpecialChar ~ |
| ; dereference NULL, cause NullPointerExc. |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ;\SpecialChar ~ |
| never executed |
| \layout Standard |
| |
| |
| \family typewriter |
| C:\SpecialChar ~ |
| nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ;\SpecialChar ~ |
| this is executed: we could handle |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ;\SpecialChar ~ |
| the NullPointerException |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ;\SpecialChar ~ |
| leave method (complete normally) |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{ExcHdAlgo} |
| |
| \end_inset |
| |
| Use of Exception Handlers |
| \end_float |
| \layout Standard |
| |
| The most important item, however, is the |
| \family typewriter |
| code |
| \family default |
| item. |
| It defines the bytecode of this method; i.e., the JVM machine instructions. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{LineNumberTableAttribute} |
| |
| \end_inset |
| |
| The LineNumberTable Attribute |
| \layout Standard |
| |
| The |
| \family typewriter |
| LineNumberTable |
| \family default |
| attribute is defined as follows: |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| LineNumberTable_attribute { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attribute_name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u4 attribute_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 line_number_table_length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 start_pc; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 line_number; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } line_number_table[line_number_table_length]; |
| \newline |
| } |
| \newline |
| |
| \family default |
| |
| \newline |
| This attribute describes the relation between source code line numbers and |
| JVM instruction offsets in the |
| \family typewriter |
| code |
| \family default |
| array of the |
| \family typewriter |
| Code_attribute |
| \family default |
| ; it can be used by debuggers to show the source code of currently executing |
| JVM machine instructions. |
| This attribute is usually a sub-attribute of a |
| \family typewriter |
| Code_attribute |
| \family default |
| . |
| Multiple |
| \family typewriter |
| LineNumberTable |
| \family default |
| attributes may together represent a given line of a source code file. |
| |
| \layout Subsection |
| |
| Constants |
| \layout Standard |
| |
| All the constants together form the |
| \emph on |
| constant pool |
| \emph default |
| . |
| The general |
| \family typewriter |
| cp_info |
| \family default |
| structure is straightforward. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| cp_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 tag; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 info[]; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| The 'tag' defines what 'info' follows it. |
| Constants define either constant values or constant symbolic references, |
| such as references to other classes. |
| Currently, eleven constant types are defined: |
| \family typewriter |
| Class |
| \family default |
| , |
| \family typewriter |
| Field\SpecialChar \- |
| ref |
| \family default |
| , |
| \family typewriter |
| Method\SpecialChar \- |
| ref |
| \family default |
| , |
| \family typewriter |
| In\SpecialChar \- |
| ter\SpecialChar \- |
| face\SpecialChar \- |
| Method\SpecialChar \- |
| ref |
| \family default |
| , |
| \family typewriter |
| String |
| \family default |
| , |
| \family typewriter |
| In\SpecialChar \- |
| teger |
| \family default |
| , |
| \family typewriter |
| Float |
| \family default |
| , |
| \family typewriter |
| Long |
| \family default |
| , |
| \family typewriter |
| Double |
| \family default |
| , |
| \family typewriter |
| Name\SpecialChar \- |
| And\SpecialChar \- |
| Type |
| \family default |
| and |
| \family typewriter |
| Utf8 |
| \family default |
| . |
| \layout Standard |
| |
| Most of the names are self-explanatory; the interested reader will find |
| more information in the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| Constants can be nested; this is done by referring to the constant pool |
| index of the enclosed constant. |
| \layout Standard |
| |
| See the following examples. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| CONSTANT_Utf8_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 tag; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 length; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 bytes[length]; |
| \newline |
| } |
| \newline |
| |
| \newline |
| |
| \family default |
| A CONSTANT_Utf8 represents a constant string. |
| Such a string is e.g. |
| used to describe names of methods, names of fields, names of attributes, |
| types of methods or types of fields. |
| This string is encoded in UTF-8 format, a variant of the unicode character |
| set |
| \begin_inset LatexCommand \cite{Unicode} |
| |
| \end_inset |
| |
| . |
| |
| \family typewriter |
| |
| \family default |
| The tag for this type of constant is simply the number 1, as defined in |
| the Java Virtual Machine Specification, Second Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| \family typewriter |
| |
| \newline |
| |
| \newline |
| CONSTANT_NameAndType_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 tag; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 descriptor_index; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| A Constant_NameAndType represents a name and a signature of a method, the |
| tag is the number 12. |
| |
| \family typewriter |
| |
| \family default |
| Both |
| \family typewriter |
| class_index |
| \family default |
| and |
| \family typewriter |
| descriptor_index |
| \family default |
| refer to a |
| \family typewriter |
| CONSTANT_Utf8 |
| \family default |
| . |
| \family typewriter |
| |
| \newline |
| |
| \newline |
| CONSTANT_InterfaceMethodref_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u1 tag; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 class_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 name_and_type_index; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| A |
| \family typewriter |
| CONSTANT_InterfaceMethodref |
| \family default |
| describes a reference to a method defined in an interface class (see section |
| |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| for an explanation of interfaces), the tag is number 11. |
| The interface class is referenced via a two-byte index into the constant |
| pool. |
| A |
| \family typewriter |
| Constant_Class |
| \family default |
| is expected there describing a reference to some class file. |
| Every method has a name, zero or more argument types and a return type; |
| this is described in the |
| \family typewriter |
| CONSTANT_NameAndType |
| \family default |
| that is also referenced via a two-byte constant pool index. |
| \layout Standard |
| |
| Note that there are implicit constraints on the integrity of a class file: |
| for example, there must not be a |
| \family typewriter |
| CONSTANT_Integer |
| \family default |
| where a |
| \family typewriter |
| CONSTANT_Utf8 |
| \family default |
| is expected for a certain entity. |
| As another example, the names and the types of methods are encoded as strings |
| in UTF-8 format |
| \begin_inset LatexCommand \cite{Unicode} |
| |
| \end_inset |
| |
| . |
| They have to be well-formed (according to the specification) to be valid. |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{Fields} |
| |
| \end_inset |
| |
| Fields |
| \layout Standard |
| |
| Each field is described by a field_info structure as defined below. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| field_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 access_flags; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 descriptor_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attributes_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| attribute_info attributes[attributes_count]; |
| \family default |
| |
| \newline |
| } |
| \newline |
| |
| \newline |
| A field has to be unique in a class file with respect to its name and descriptor |
| \begin_float footnote |
| \layout Standard |
| |
| The descriptor of a field describes its type. |
| E.g., a descriptor of |
| \begin_inset Quotes eld |
| \end_inset |
| |
| [I |
| \begin_inset Quotes erd |
| \end_inset |
| |
| means |
| \begin_inset Quotes eld |
| \end_inset |
| |
| one-dimensional array of |
| \family typewriter |
| int |
| \family default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| \end_float |
| . |
| We see that fields reference constants in the constant pool via their constant |
| pool indices (such as a |
| \family typewriter |
| CONSTANT_Utf8 |
| \family default |
| describing a field's name). |
| An important attribute used by fields is the ConstantValue attribute (see |
| section |
| \begin_inset LatexCommand \ref{ConstantValueAttribute} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| The |
| \family typewriter |
| access_flags |
| \family default |
| entry is a bit vector that specifies the accessibility and other properties |
| \begin_float footnote |
| \layout Standard |
| |
| Often called |
| \emph on |
| visibility |
| \emph default |
| . |
| \end_float |
| of the field. |
| E.g., a field with the |
| \family typewriter |
| ACC_PRIVATE |
| \begin_float footnote |
| \layout Standard |
| |
| Bit number 1. |
| \end_float |
| bit set is not accessible to other classes. |
| A field with the |
| \family typewriter |
| ACC_PUBLIC |
| \begin_float footnote |
| \layout Standard |
| |
| Bit number 0. |
| \end_float |
| bit set is accessible to any other class. |
| Any combination with both the |
| \family typewriter |
| ACC_PRIVATE |
| \family default |
| and the |
| \family typewriter |
| ACC_PUBLIC |
| \family default |
| bit set is not valid. |
| \layout Standard |
| |
| The |
| \family typewriter |
| descriptor_index |
| \family default |
| refers to a |
| \family typewriter |
| CONSTANT_Utf8 |
| \family default |
| that symbolically encodes the type of the field. |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{Methods} |
| |
| \end_inset |
| |
| Methods |
| \layout Standard |
| |
| Each method is described by a method_info structure as defined below. |
| \newline |
| |
| \newline |
| |
| \family typewriter |
| method_info { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 access_flags; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 name_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 descriptor_index; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| u2 attributes_count; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| attribute_info attributes[attributes_count]; |
| \newline |
| } |
| \family default |
| |
| \newline |
| |
| \newline |
| As we can easily see, this is exactly the same structure we already know |
| as |
| \family typewriter |
| field_info |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Fields} |
| |
| \end_inset |
| |
| ). |
| The difference lies in the meaning of the enlisted entities. |
| For example, an access flag saying a field was volatile (non-cacheable) |
| would not make any sense if set in a |
| \family typewriter |
| method_info |
| \family default |
| structure. |
| Vice versa, an access flag saying the floating point instructions should |
| work in |
| \begin_inset Quotes eld |
| \end_inset |
| |
| FP-strict |
| \begin_inset Quotes erd |
| \end_inset |
| |
| mode would be of no use if set in a |
| \family typewriter |
| field_info |
| \family default |
| structure. |
| \layout Standard |
| |
| Methods use a different set of attributes than fields; for example, the |
| |
| \family typewriter |
| Constant\SpecialChar \- |
| Value |
| \family default |
| attribute (see section |
| \begin_inset LatexCommand \ref{ConstantValueAttribute} |
| |
| \end_inset |
| |
| ) is of no use here. |
| The |
| \family typewriter |
| Code |
| \family default |
| and |
| \family typewriter |
| Exceptions |
| \family default |
| attributes frequently used by methods are of no use for fields on the other |
| hand. |
| \layout Section |
| |
| The Execution Engine |
| \layout Standard |
| |
| Before a piece of code (the code of a |
| \begin_inset Quotes eld |
| \end_inset |
| |
| method |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ) is executed, an |
| \emph on |
| execution frame |
| \emph default |
| is set up. |
| It consists of a program counter (as known from traditional CPUs), a set |
| of local variables (similar to registers known from traditional CPUs), |
| and an operand stack. |
| For each new invocation instance of a method, a new execution frame is |
| set up; it is destroyed on method termination. |
| \layout Standard |
| |
| Because a method may invoke other methods or itself recursively, there is |
| a global method invocation stack. |
| \layout Standard |
| |
| There also is a garbage-collected heap shared among the execution frames. |
| This heap is used for object allocation (see section |
| \begin_inset LatexCommand \ref{Instructions} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| The number of local variables is not fixed. |
| Every method defines how many local variables are used for its code (up |
| to 65536). |
| \layout Standard |
| |
| Also note that there is no equivalent of a |
| \emph on |
| Processor Status Word |
| \emph default |
| (PSW) in the JVM. |
| Traditionally, a PSW has flags that are set implicitly during execution |
| of the instructions (such as an overflow or is-zero flag). |
| This is often used for conditional branching. |
| The JVM, however, uses the operand stack to store the result of a comparison |
| instruction explicitly. |
| This result is often read from the stack by the JVM's conditional branching |
| instructions. |
| \layout Standard |
| |
| Should exceptional situations occur (such as an out-of-memory situation), |
| the JVM does not lock up. |
| Instead, an |
| \begin_inset Quotes eld |
| \end_inset |
| |
| exception is thrown |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ; the currently executing program is signalled. |
| These signals can be processed ( |
| \begin_inset Quotes eld |
| \end_inset |
| |
| exceptions can be caught |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ). |
| If such a signal is not handled by the currently executing method, the |
| JVM will search a handler through the invocation hierarchy and stop execution |
| only if none was found. |
| \layout Standard |
| |
| There is a thread mechanism in the JVM. |
| Basically every thread creates an own method invocation stack (so there |
| may be more than one active execution frame at a time), but this feature |
| is not important for the rest of this text. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 379 |
| file exframe.eps |
| width 3 100 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Standard |
| |
| This figure shows a method invocation stack. |
| Method |
| \family typewriter |
| main |
| \family default |
| was invoked by the system, |
| \family typewriter |
| main |
| \family default |
| invoked |
| \family typewriter |
| foo |
| \family default |
| , |
| \family typewriter |
| foo |
| \family default |
| invoked |
| \family typewriter |
| bar |
| \family default |
| , and |
| \family typewriter |
| bar |
| \family default |
| invoked |
| \family typewriter |
| foo |
| \family default |
| recursively. |
| This figure assumes |
| \family typewriter |
| main |
| \family default |
| allocates one local variable and one operand stack slot, |
| \family typewriter |
| foo |
| \family default |
| allocates three local variables and two operand stack slots and |
| \family typewriter |
| bar |
| \family default |
| allocates one local variable and two operand stack slots. |
| \layout Caption |
| |
| Method Invocation Stack |
| \end_float |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{LV_and_OpStack} |
| |
| \end_inset |
| |
| Local Variables and the Operand Stack |
| \layout Standard |
| |
| The method information in a class file defines how many local variables |
| are used on this method's invocation. |
| It also defines the maximum operand stack size. |
| Together, the local variables array and the operand stack are called the |
| |
| \emph on |
| execution frame |
| \emph default |
| . |
| \layout Standard |
| |
| A single stack slot has a width of 32 bits, which is also the width of a |
| local variable. |
| Therefore, values of types that occupy 64 bits ( |
| \emph on |
| double |
| \emph default |
| and |
| \emph on |
| long |
| \emph default |
| ) must be stored in two consecutive stack slots or local variables. |
| \layout Standard |
| |
| The verifier takes care that the stack cannot overflow and that it cannot |
| underflow. |
| Also, it takes care that instructions may only access local variables if |
| they contain a value of a known, correct type (see section |
| \begin_inset LatexCommand \ref{Pass3Spec} |
| |
| \end_inset |
| |
| ). |
| |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{Instructions} |
| |
| \end_inset |
| |
| Introduction to JVM Instructions |
| \layout Standard |
| |
| This section is derived from section 2.2 of |
| \begin_inset LatexCommand \cite{BCEL98} |
| |
| \end_inset |
| |
| , used with permission of the author. |
| \layout Standard |
| |
| The JVM's instruction set currently consists of 212 instructions, 44 opcodes |
| are marked as reserved and may be used for future extensions or intermediate |
| optimizations within the Virtual Machine. |
| The instruction set can be roughly grouped as follows: |
| \layout Description |
| |
| Stack\SpecialChar ~ |
| operations: Constants can be pushed onto the stack either by loading |
| them from the constant pool with the |
| \latex latex |
| |
| \backslash |
| texttt{ldc} |
| \latex default |
| instruction or with special ``short-cut'' instructions where the operand |
| is encoded into the instructions, e.g., |
| \latex latex |
| |
| \backslash |
| texttt{iconst |
| \backslash |
| _0} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{bipush} |
| \latex default |
| (push byte value). |
| \layout Description |
| |
| Arithmetic\SpecialChar ~ |
| operations: The instruction set of the JVM distinguishes its operand |
| types using different instructions to operate on values of specific type. |
| Arithmetic operations starting with |
| \latex latex |
| |
| \backslash |
| texttt{i} |
| \latex default |
| , for example, denote an integer operation. |
| E.g., |
| \latex latex |
| |
| \backslash |
| texttt{iadd} |
| \latex default |
| that adds two integers and pushes the result back on the operand stack. |
| The Java types |
| \latex latex |
| |
| \backslash |
| texttt{boolean} |
| \latex default |
| , |
| \latex latex |
| |
| \backslash |
| texttt{byte} |
| \latex default |
| , |
| \latex latex |
| |
| \backslash |
| texttt{short} |
| \latex default |
| , and |
| \latex latex |
| |
| \backslash |
| texttt{char} |
| \latex default |
| are handled as integers by the JVM. |
| \layout Description |
| |
| |
| \begin_inset LatexCommand \label{RetDesc} |
| |
| \end_inset |
| |
| Control\SpecialChar ~ |
| flow: There are branch instructions like |
| \latex latex |
| |
| \backslash |
| texttt{goto} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{if |
| \backslash |
| _icmpeq} |
| \latex default |
| , which compares two integers for equality. |
| There is also a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \begin_float footnote |
| \layout Standard |
| |
| There is a |
| \begin_inset Quotes eld |
| \end_inset |
| |
| wide |
| \begin_inset Quotes erd |
| \end_inset |
| |
| version of |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| called |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| . |
| The instructions |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| play in important role in chapter |
| \begin_inset LatexCommand \ref{Pass3Spec} |
| |
| \end_inset |
| |
| . |
| \end_float |
| (jump into subroutine) and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| (return from subroutine) pair of instructions. |
| Exceptions may be thrown with the |
| \latex latex |
| |
| \backslash |
| texttt{athrow} |
| \latex default |
| instruction. |
| Branch targets are coded as offsets from the current byte code position, |
| i.e., they are coded with an integer number. |
| \layout Description |
| |
| Load\SpecialChar ~ |
| and\SpecialChar ~ |
| store\SpecialChar ~ |
| operations for local variables like |
| \latex latex |
| |
| \backslash |
| texttt{iload} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{istore} |
| \latex default |
| . |
| There are also array operations like |
| \latex latex |
| |
| \backslash |
| texttt{iastore} |
| \latex default |
| which stores an integer value into an array. |
| \layout Description |
| |
| Field\SpecialChar ~ |
| access: The value of an instance field may be retrieved with |
| \latex latex |
| |
| \backslash |
| texttt{getfield} |
| \latex default |
| and written with |
| \latex latex |
| |
| \backslash |
| texttt{putfield} |
| \latex default |
| . |
| For static fields, there are |
| \latex latex |
| |
| \backslash |
| texttt{getstatic} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{putstatic} |
| \latex default |
| counterparts. |
| \layout Description |
| |
| Method\SpecialChar ~ |
| invocation: Methods may either be called via static references with |
| |
| \latex latex |
| |
| \backslash |
| texttt{invokestatic} |
| \latex default |
| or be bound virtually with the |
| \latex latex |
| |
| \backslash |
| texttt{invokevirtual} |
| \latex default |
| instruction. |
| Super class methods and private methods are invoked with |
| \latex latex |
| |
| \backslash |
| texttt{invokespecial} |
| \latex default |
| . |
| \layout Description |
| |
| Object\SpecialChar ~ |
| allocation: Class instances are allocated with the |
| \latex latex |
| |
| \backslash |
| texttt{new} |
| \latex default |
| instruction, arrays of basic type like |
| \latex latex |
| |
| \backslash |
| texttt{int[]} |
| \latex default |
| with |
| \latex latex |
| |
| \backslash |
| texttt{newarray} |
| \latex default |
| , arrays of references like |
| \latex latex |
| |
| \backslash |
| texttt{String[][]} |
| \latex default |
| with |
| \latex latex |
| |
| \backslash |
| texttt{anewarray} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{multianewarray} |
| \latex default |
| . |
| \layout Description |
| |
| Conversion\SpecialChar ~ |
| and\SpecialChar ~ |
| type\SpecialChar ~ |
| checking: For stack operands of basic type there exist |
| casting operations like |
| \latex latex |
| |
| \backslash |
| texttt{f2i} |
| \latex default |
| which converts a float value into an integer. |
| The validity of a type cast may be checked with |
| \latex latex |
| |
| \backslash |
| texttt{checkcast} |
| \latex default |
| and the |
| \latex latex |
| |
| \backslash |
| texttt{instanceof} |
| \latex default |
| operator can be directly mapped to the equally named instruction. |
| \layout Standard |
| |
| Most instructions have a fixed length, but there are also some variable-length |
| instructions: In particular, the |
| \latex latex |
| |
| \backslash |
| texttt{lookupswitch} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{tableswitch} |
| \latex default |
| instructions, which are often used by compilers to implement the Java language |
| |
| \latex latex |
| |
| \backslash |
| texttt{switch()} |
| \latex default |
| statements. |
| Since the number of |
| \latex latex |
| |
| \backslash |
| texttt{case} |
| \latex default |
| clauses may vary, these instructions contain a variable number of statements. |
| \layout Standard |
| |
| In a class file, the |
| \family typewriter |
| code |
| \family default |
| item in the |
| \family typewriter |
| Code |
| \family default |
| attributes (which in turn are attributes of |
| \family typewriter |
| method_info |
| \family default |
| structures), is a byte array in which binary representations of JVM instruction |
| s are stored sequentially. |
| This is also called |
| \emph on |
| bytecode |
| \emph default |
| . |
| \layout Standard |
| |
| The JVM is a stack-based machine. |
| There are local variables which may be compared to registers, but most |
| instructions work on the operand stack. |
| E.g., the |
| \latex latex |
| |
| \backslash |
| texttt{iadd} |
| \latex default |
| instruction pops two integers from the operand stack and pushes the result |
| of the add operation on top of the stack. |
| \layout Standard |
| |
| We will not list all of the instructions here, since these are explained |
| in detail in the JVM specification. |
| However, you will find the most common instructions in table |
| \begin_inset LatexCommand \ref{typeprefixes} |
| |
| \end_inset |
| |
| , cited with slight corrections and modifications from chapter 4 of |
| \begin_inset LatexCommand \cite{JNS} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| \begin_float tab |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{typeprefixes} |
| |
| \end_inset |
| |
| Type Prefixes and the Most Common JVM Instructions |
| \layout Standard |
| \align center |
| |
| \begin_inset Tabular |
| <lyxtabular version="2" rows="9" columns="2"> |
| <features rotate="false" islongtable="false" endhead="0" endfirsthead="0" endfoot="0" endlastfoot="0"> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="true" width="" special=""> |
| <row topline="true" bottomline="true" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Prefix |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Bytecode type |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| i |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Integer |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| f |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Floating point |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| l |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Long |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| d |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Double precision floating point |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| b |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Byte |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| s |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Short |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| c |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Character |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="true" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| a |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Object reference |
| \end_inset |
| </cell> |
| </row> |
| </lyxtabular> |
| |
| \end_inset |
| |
| |
| \end_float |
| \layout Standard |
| |
| |
| \begin_inset Tabular |
| <lyxtabular version="2" rows="29" columns="10"> |
| <features rotate="false" islongtable="true" endhead="1" endfirsthead="0" endfoot="0" endlastfoot="0"> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="left" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> |
| <column alignment="left" valignment="top" leftline="true" rightline="true" width="4cm" special=""> |
| <row topline="true" bottomline="true" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| Instruction |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| int |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| long |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| float |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| double |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| byte |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| char |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| short |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| object ref. |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| |
| \size scriptsize |
| Function |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2c |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to character |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2d |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to double |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2i |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to integer |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2f |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to float |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2l |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to long |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?2s |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Convert value of type <?> to short |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?add |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Add two values of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?aload |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Push an element of type <?> from an array onto the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?and |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform logical AND on two values of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?astore |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Pop an element of type <?> from the stack and store it in an array of type |
| <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?cmp |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Compare two long values. |
| If they are equal push 0, if the first is greater push 1, else push -1 |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?cmpg |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Compare two IEEE values of type <?> from the stack. |
| If they are equal push 0, if the first is greater push 1, if the second |
| is greater push -1. |
| If either is NaN (not a number) push 1 |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?cmpl |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Compare two IEEE values of type <?> from the stack. |
| If they are equal push 0, if the first is greater push 1, if the second |
| is greater push -1. |
| If either is NaN (not a number) push -1 |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?const |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Push a constant value of type <?> onto the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?div |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform a division using two values of type <?> and push the quotient onto |
| the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?inc |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Increment the top of the stack (possibly by a negative value) |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?ipush |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Push a sign extended byte or short value onto the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?load |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Push a value of type <?> from a local variable onto the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?mul |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform multiplication of two values of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?neg |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Negate a value of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?newarray |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Create a new array of object references |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?or |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform logical OR on two values of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?rem |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform a division using two values of type <?> and push the remainder onto |
| the stack |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?return |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Return a value of type <?> to the invoking method |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?shl |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform arithmetic shift left on a value of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?shr |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform arithmetic shift right on a value of type <?> |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="false" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?store |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Pop a value of type <?> and store it into a local variable |
| \end_inset |
| </cell> |
| </row> |
| <row topline="true" bottomline="true" newpage="false"> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| ?sub |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| X |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| \end_inset |
| </cell> |
| <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> |
| \begin_inset Text |
| |
| \layout Standard |
| |
| Perform a subtraction using two values of type <?> |
| \end_inset |
| </cell> |
| </row> |
| </lyxtabular> |
| |
| \end_inset |
| |
| |
| \layout Standard |
| |
| The opcode names are mostly self-explanatory. |
| In this paper, all bytecode is commented to support the intuitive understanding. |
| Algorithms |
| \begin_inset LatexCommand \ref{facjavapl} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{facjavabytecode} |
| |
| \end_inset |
| |
| show an example bytecode taken from |
| \begin_inset LatexCommand \cite{BCEL98} |
| |
| \end_inset |
| |
| . |
| It implements the well-known faculty function. |
| To understand this example, it is important to know that method arguments |
| are stored into the local variables of a newly created execution frame |
| upon method invocation. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{facjavapl} |
| |
| \end_inset |
| |
| Methed |
| \emph on |
| fac |
| \emph default |
| in a class |
| \emph on |
| Faculty |
| \emph default |
| , Java programming language version |
| \layout Standard |
| |
| |
| \family typewriter |
| public static final int fac(int n){ |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return (n==0)?1:n*fac(n-1); |
| \layout Standard |
| |
| |
| \family typewriter |
| } |
| \end_float |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{facjavabytecode} |
| |
| \end_inset |
| |
| Method |
| \emph on |
| fac |
| \emph default |
| in a class |
| \emph on |
| Faculty |
| \emph default |
| , Java bytecode version |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| Faculty.fac (I)I |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 0:\SpecialChar ~ |
| \SpecialChar ~ |
| iload_0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; load argument onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 1:\SpecialChar ~ |
| \SpecialChar ~ |
| ifne #8\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; non-zero? Then branch to 8. |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 4:\SpecialChar ~ |
| \SpecialChar ~ |
| iconst_1\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; push constant 1 onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 5:\SpecialChar ~ |
| \SpecialChar ~ |
| goto #16\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; jump to 16 |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 8:\SpecialChar ~ |
| \SpecialChar ~ |
| iload_0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; load argument onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 9:\SpecialChar ~ |
| \SpecialChar ~ |
| iload_0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; load argument onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 10:\SpecialChar ~ |
| iconst_1\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; push constant 1 onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 11:\SpecialChar ~ |
| isub\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; subtract the stack top from |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; the stack next-to-top which becomes |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; the new stack top |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 12:\SpecialChar ~ |
| invokestatic Faculty.fac (I)I\SpecialChar ~ |
| \SpecialChar ~ |
| ; call method fac recursively, |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; the new invocation |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; instance's argument is the stack top |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 15:\SpecialChar ~ |
| imul\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; multiply the return value with the |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; argument given to the current |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; invocation instance |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| 16:\SpecialChar ~ |
| ireturn\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; return value on top of the |
| \layout Standard |
| |
| |
| \family typewriter |
| \size footnotesize |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; stack to the invoking method |
| \end_float |
| \layout Chapter |
| |
| |
| \begin_inset LatexCommand \label{SpecPasses} |
| |
| \end_inset |
| |
| Specification of the Verification Passes |
| \layout Standard |
| |
| Sun describes a four-pass class file verifier in The Java Virtual Machine |
| Specification, Second Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| It is not necessary to implement the verification algorithms literally; |
| and it is not possible anyway (see section |
| \begin_inset LatexCommand \ref{SpecSubroutines} |
| |
| \end_inset |
| |
| ). |
| However, implementing a verifier with a multiple-pass architecture makes |
| sense. |
| It is a good thing to stay close to the specification because it is well-known |
| throughout the bytecode engineering community. |
| Also, the boundaries between the passes are not arbitrary. |
| They are drawn to improve the performance of the verifiers built into JVMs. |
| For example, classes are not verified (completely) before they are actually |
| used but they are loaded as soon as they are referenced in a certain way. |
| Most verifiers use the traditional multiple-pass architecture, including |
| Kimera |
| \begin_inset LatexCommand \cite{Kimera-WWW} |
| |
| \end_inset |
| |
| . |
| Work in other directions (for instance, the one-pass-architecture proposed |
| by Fong |
| \begin_inset LatexCommand \cite{Fong-WWW} |
| |
| \end_inset |
| |
| ) did not yield lasting results. |
| \layout Standard |
| |
| Pass one is basically about loading a class file into the JVM in a sane |
| way and pass two verifies that the loaded class file information is consistent. |
| Pass three verifies that the program code is well-behaved; pass four verifies |
| things that conceptually belong to pass three but are delayed to the run-time |
| for performance reasons. |
| \layout Standard |
| |
| Sometimes implementation details are discussed in this chapter. |
| Whenever the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| was ambigous about some issue, the behaviour of Sun's JVM implementations |
| was observed. |
| The discussed details are part of the specification of the JustIce verifier. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{PassOneSpec} |
| |
| \end_inset |
| |
| Pass One |
| \layout Standard |
| |
| The first pass of the verifier is only vaguely specified. |
| It is there to assure a class file |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \series bold |
| has the basic format of a class file. |
| The first four bytes must contain the right magic number. |
| All recognized attributes must be of the proper length. |
| The class file must not be truncated or have any extra bytes at the end. |
| The constant pool must not contain any superficially unrecognizable information |
| \series default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 141). |
| \layout Standard |
| |
| The right magic number is 0xCAFEBABE ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 94), which is easy to assure. |
| \layout Standard |
| |
| It is not clear what |
| \begin_inset Quotes eld |
| \end_inset |
| |
| superficially unrecognizable information |
| \begin_inset Quotes erd |
| \end_inset |
| |
| exactly is, however. |
| If an attribute is not known to the JVM (or verifier) implementation, it |
| has to be ignored -- so this does not seem to be |
| \begin_inset Quotes eld |
| \end_inset |
| |
| superficially unrecognizable information |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| Attributes that are not used cannot be detected in pass one. |
| One would have to look at the bytecodes to decide whether an attribute |
| is used or not (which is not the domain of pass one, but of pass three). |
| \layout Standard |
| |
| Observations show that most existing JVM verifiers |
| \begin_float footnote |
| \layout Standard |
| |
| An example of a verifier with this behaviour is the one implemented in Sun's |
| Solaris port of the JVM, version 1.3.0_01. |
| \end_float |
| ignore |
| \begin_inset Quotes eld |
| \end_inset |
| |
| extra bytes at the end |
| \begin_inset Quotes erd |
| \end_inset |
| |
| instead of rejecting class files bearing them. |
| \layout Standard |
| |
| The other two statements specify verification of the class file structure |
| (and the structure of the attributes therein). |
| But this is also the domain of pass two! Only by inspecting the way the |
| JVM |
| \emph on |
| loads |
| \emph default |
| , |
| \emph on |
| resolves |
| \emph default |
| and |
| \emph on |
| prepares |
| \emph default |
| classes one will understand the precise boundary between verification passes |
| one and two |
| \begin_inset LatexCommand \cite{Fong-WWW} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| 'Being careful when loading a class file' is a good definition for pass |
| one: the structure of the file to load is untrusted. |
| Every implicit statement such as |
| \begin_inset Quotes eld |
| \end_inset |
| |
| this attribute has a length of 1234 bytes in total |
| \begin_inset Quotes erd |
| \end_inset |
| |
| is validated. |
| \layout Standard |
| |
| |
| \emph on |
| Resolution |
| \emph default |
| is the transformation of a symbolic reference to an actual reference -- |
| i.e., as long as there is only a symbolic reference to an entity, this entity |
| cannot be verified at all because it has not been loaded yet. |
| Passes two and three are performed during the |
| \emph on |
| resolution |
| \emph default |
| of a class file; while loading of the class file --pass one-- must have |
| been performed before. |
| |
| \emph on |
| Resolution |
| \emph default |
| as such is meaningless to JustIce; the term is only used to draw the borders |
| between the verification passes. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{SpecPassTwo} |
| |
| \end_inset |
| |
| Pass Two |
| \layout Standard |
| |
| The checks performed in pass two enforce that the following constraints |
| are satisfied. |
| \layout Itemize |
| |
| Ensuring that final classes are not subclassed and that final methods are |
| not overridden. |
| \layout Itemize |
| |
| Checking that every class (except |
| \family typewriter |
| java.lang.Object |
| \family default |
| ) has a direct superclass. |
| \layout Itemize |
| |
| Ensuring that the constant pool satisfies the documented static constraints: |
| for example, that each |
| \family typewriter |
| CONSTANT_Class_info |
| \family default |
| structure in the constant pool contains in its |
| \family typewriter |
| name_index |
| \family default |
| item a valid constant pool index for a |
| \family typewriter |
| CONSTANT_Utf8_info |
| \family default |
| structure. |
| \layout Itemize |
| |
| Checking that all field references and method references in the constant |
| pool have valid names, valid classes, and a valid type descriptor. |
| \layout Standard |
| |
| As Frank Yellin puts it |
| \begin_inset LatexCommand \cite{Yellin-WWW} |
| |
| \end_inset |
| |
| : pass two |
| \begin_inset Quotes eld |
| \end_inset |
| |
| performs all verification that can be performed without looking at the bytecodes |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| Also, |
| \begin_inset Quotes eld |
| \end_inset |
| |
| this pass does not actually check to make sure that the given field or method |
| really exists in the given class; nor does it check that the type signatures |
| given refer to real classes. |
| \begin_inset Quotes erd |
| \end_inset |
| |
| Note that again |
| \emph on |
| resolution |
| \emph default |
| plays an important role to create the boundary between two passes; here |
| it is the boundary between pass two and pass three. |
| Because linking-time verification enhances the performance of the JVM, |
| checks that basically belong to pass two are delayed to pass three. |
| This leads to the obvious contradiction in the sentences cited above. |
| \layout Standard |
| |
| This performance enhancement has an ugly side effect. |
| Consider a reference to a method m contained in a class file C that does |
| not exist. |
| As long as this reference is not |
| \emph on |
| used |
| \emph default |
| , i.e., |
| \emph on |
| resolved |
| \emph default |
| , the absence of C cannot be detected. |
| Such a reference should in the author's opinion regarded as |
| \begin_inset Quotes eld |
| \end_inset |
| |
| superficially unrecognizable information |
| \begin_inset Quotes erd |
| \end_inset |
| |
| (see section |
| \begin_inset LatexCommand \ref{PassOneSpec} |
| |
| \end_inset |
| |
| ) and therefore be detected. |
| \layout Standard |
| |
| This pass has to verify the integrity of the clas file's data structures |
| as explained in section |
| \begin_inset LatexCommand \ref{Classfile Structure} |
| |
| \end_inset |
| |
| . |
| As an example, consider the Line\SpecialChar \- |
| Number\SpecialChar \- |
| Table atribute. |
| Sun did not specify there has to be exactly one |
| \family typewriter |
| Line\SpecialChar \- |
| Number\SpecialChar \- |
| Table |
| \family default |
| attribute (or none at all) per method, so possibly there is more than one |
| attribute of that kind. |
| This lax specification is not necessary due to the fact that you can put |
| all information in a single |
| \family typewriter |
| Line\SpecialChar \- |
| Number\SpecialChar \- |
| Table_attri\SpecialChar \- |
| bute |
| \begin_float footnote |
| \layout Standard |
| |
| Any number of |
| \family typewriter |
| line_number_table |
| \family default |
| array entries fits nicely in a single |
| \family typewriter |
| LineNumberTable_attribute |
| \family default |
| attribute. |
| \end_float |
| , but Sun did specify it this way ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 129). |
| \layout Standard |
| |
| Verifiers are requested to reject class files with inconsistent information |
| in their attributes. |
| However, here it may be that only by looking at all |
| \family typewriter |
| Line\SpecialChar \- |
| Number\SpecialChar \- |
| Table_attribute |
| \family default |
| s of a method, an inconsistency can be detected. |
| JustIce does so and rejects class files with inconsistent |
| \family typewriter |
| Line\SpecialChar \- |
| Number\SpecialChar \- |
| Table |
| \family default |
| information. |
| \layout Standard |
| |
| Furthermore, it issues warnings if such an attribute is detected at all |
| to discourage its use (see section |
| \begin_inset LatexCommand \ref{Pass2Impl} |
| |
| \end_inset |
| |
| ). |
| This is done because of possible different interpretations of the specification. |
| \layout Standard |
| |
| It should be noted that the use of attributes raises a few more problems |
| to class file verification. |
| A simple case is the presence of an unknown attribute that may safely be |
| ignored. |
| It is explicitly stated that such a class file must not be rejected. |
| On the other hand, how should a verifier react if --for example-- a |
| \family typewriter |
| field_info |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{Fields} |
| |
| \end_inset |
| |
| ) structure encloses a |
| \family typewriter |
| Code_attribute |
| \family default |
| ? JustIce will issue a warning but not reject the class file. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{Pass3Spec} |
| |
| \end_inset |
| |
| Pass Three |
| \layout Standard |
| |
| Performing pass three basically means |
| \emph on |
| verifying the bytecode |
| \emph default |
| . |
| There are so-called |
| \begin_inset Quotes eld |
| \end_inset |
| |
| static constraints |
| \begin_inset Quotes erd |
| \end_inset |
| |
| on both the instructions in the code array and their operands. |
| There are also so-called |
| \begin_inset Quotes eld |
| \end_inset |
| |
| structural constraints |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| The structural constraints specify constraints on relationships between |
| JVM instructions, so some people (including the author) regard |
| \begin_inset Quotes eld |
| \end_inset |
| |
| structural constraints |
| \begin_inset Quotes erd |
| \end_inset |
| |
| as a misnomer; they should be called |
| \begin_inset Quotes eld |
| \end_inset |
| |
| dynamic constraints |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| Static constraints are easily enforced using very simple checks. |
| Here is an example for such a check: let there be a |
| \family typewriter |
| Code |
| \family default |
| (see section |
| \begin_inset LatexCommand \ref{CodeAttribute} |
| |
| \end_inset |
| |
| ) attribute with a |
| \family typewriter |
| max_locals |
| \family default |
| value of 2. |
| Only local variables number 0 and 1 may be accessed by the bytecode in |
| this |
| \family typewriter |
| Code |
| \family default |
| attribute. |
| For all instructions accessing local variables, make sure they do not access |
| any other local variable. |
| \layout Standard |
| |
| Structural constraints are enforced using an algorithm sketched by Sun; |
| it implements a symbolic execution of a method's code, by means of data |
| flow analysis including type inference ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , pages 143-151). |
| This algorithm is called the |
| \emph on |
| data flow analyzer. |
| |
| \emph default |
| It is intuitively easy to understand, but it is hard to prove its correctness. |
| The reason for that is the very weak specification of its subtleties; especiall |
| y |
| \emph on |
| subroutines |
| \emph default |
| , |
| \emph on |
| wide date types |
| \emph default |
| and |
| \emph on |
| object initialization |
| \emph default |
| (see below). |
| The general approach, however, is sound |
| \begin_inset LatexCommand \cite{BCV-Soundness} |
| |
| \end_inset |
| |
| . |
| Here is an example for a structural constraint enforced by this algorithm: |
| during program execution, at any given point in the program the operand |
| stack is always of the same height, no matter which code path was taken |
| to reach that point. |
| |
| \layout Standard |
| |
| Pass three is the core of the verifier. |
| Note that we will split this pass up into two passes, namely a pass verifying |
| the static constraints and a pass verifying the structural constraints |
| of a method's code. |
| We will call these passes |
| \begin_inset Quotes eld |
| \end_inset |
| |
| pass 3a |
| \begin_inset Quotes erd |
| \end_inset |
| |
| and |
| \begin_inset Quotes eld |
| \end_inset |
| |
| pass 3b |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| In a way, they resemble pass one and pass two: the former pass carefully |
| parses an entity, while the latter pass performs additional verification. |
| |
| \layout Standard |
| |
| By defining pass four, the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| implicitly excludes |
| \begin_inset Quotes eld |
| \end_inset |
| |
| certain tests that could in principle be performed in Pass 3 |
| \begin_inset Quotes erd |
| \end_inset |
| |
| , because they are |
| \begin_inset Quotes eld |
| \end_inset |
| |
| delayed until the first time the code for the method is actually invoked |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| On the other hand, verifiers are allowed to perform pass four partially |
| or completely as a part of pass three. |
| JustIce performs the pass four checks in pass 3a. |
| \layout Subsection |
| |
| Static Constraints: Pass 3a |
| \layout Standard |
| |
| Sun gives examples of what the verifier does before starting the data flow |
| analyzer ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , pages 143-144): |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Branches must be within the bounds of the code array for the method. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| The targets of all control-flow instructions are each the start of an instructio |
| n. |
| In the case of a |
| \latex latex |
| |
| \backslash |
| texttt{wide} |
| \latex default |
| instruction the |
| \latex latex |
| |
| \backslash |
| texttt{wide} |
| \latex default |
| opcode is considered the start of the instruction, and the opcode giving |
| the operation modified by that |
| \latex latex |
| |
| \backslash |
| texttt{wide} |
| \latex default |
| instruction is not considered to start an instruction. |
| Branches into the middle of an instruction are disallowed. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| No instruction can access or modify a local variable at an index greater |
| than or equal to the number of local variables that its method indicates |
| it allocates. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| All references to the constant pool must be an entry of the appropriate |
| type. |
| For example: the instruction |
| \latex latex |
| |
| \backslash |
| texttt{ldc} |
| \latex default |
| can be used only for data of type int or float or for instances of class |
| String; the instruction |
| \latex latex |
| |
| \backslash |
| texttt{getfield} |
| \latex default |
| must reference a field. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| The code does not end in the middle of an instruction. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Execution cannot fall off the end of the code. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| For each exception handler, the starting and ending point of the code protected |
| by the handler must be at the beginning of an instruction or, in the case |
| of the ending point, immediately past the end of the code. |
| The starting point must be before the ending point. |
| The exception handler code must start at a valid instruction, and it may |
| not start at an opcode being modified by the |
| \latex latex |
| |
| \backslash |
| texttt{wide} |
| \latex default |
| instruction. |
| \layout Standard |
| |
| Most of these constraints are either static constraints on instructions |
| or on their operands. |
| A full list of constraints can be found in the Java Virtual Machine Specificati |
| on, Second Edition ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , pages 133-137). |
| \layout Standard |
| |
| The check for execution falling off the end of the code is an exception: |
| this is a structural constraint and should therefore be performed in pass |
| 3b. |
| Sun's verifiers, however, reject code that has an unreachable |
| \latex latex |
| |
| \backslash |
| texttt{nop} |
| \latex default |
| at the end of the code array. |
| Obviously, they reject the code before performing data flow analysis. |
| For the sake of compatibility, JustIce performs this check in pass 3a. |
| \layout Standard |
| |
| Note that the JVM's instructions differ in length. |
| Some instructions occupy only one byte (such as |
| \family typewriter |
| nop |
| \family default |
| ), others occupy three bytes (such as |
| \family typewriter |
| goto |
| \family default |
| ). |
| Branch instructions could therefore target operands of instructions. |
| For example, line 1 of algorithm |
| \begin_inset LatexCommand \ref{facjavabytecode} |
| |
| \end_inset |
| |
| reads |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \family typewriter |
| 1: ifne #8 |
| \family default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| If it would read |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \family typewriter |
| 1: ifne #7 |
| \family default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| , this code was malformed. |
| A special case is the instruction |
| \family typewriter |
| wide |
| \family default |
| . |
| This instruction takes another instruction |
| \emph on |
| as its operand |
| \emph default |
| , so one could be misguided into thinking this embedded instruction was |
| a valid target for branches. |
| It is not. |
| \layout Standard |
| |
| The checks Sun delays until pass four are performed in pass 3a by JustIce. |
| These are checks to ensure allowed and possible access to a referenced |
| type, listed below. |
| |
| \layout Itemize |
| |
| Is the type (class or interface) currently under examination allowed to |
| reference the type |
| \begin_float footnote |
| \layout Standard |
| |
| Interfaces may contain code, this is normally used for static initialization |
| of |
| \family typewriter |
| final |
| \family default |
| variables. |
| \end_float |
| ? |
| \layout Itemize |
| |
| Does the referenced method or field exist in the given class? |
| \layout Itemize |
| |
| Does the referenced method or field have the indicated descriptor (signature)? |
| \layout Itemize |
| |
| Does the method currently under examination have access to the referenced |
| method or field? |
| \layout Subsection |
| |
| Structural Constraints: Pass 3b |
| \layout Standard |
| |
| The structural constraints of JVM instructions are enforced by a data flow |
| analyzer. |
| This algorithm ensures the following constraints ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 142). |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| The operand stack is always the same size and contains the same types of |
| values. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| No local variable is accessed unless it is known to contain a value of an |
| appropriate type. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Methods are invoked with the appropriate arguments. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Fields are assigned only using values of appropriate types. |
| \layout Itemize |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| All opcodes have appropriate type arguments on the operand stack and in |
| the local variable array. |
| \layout Standard |
| |
| A full list of structural constraints can be found in The Java Virtual Machine |
| Specification, Second Edition ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , pages 137-139). |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{SunCoreAlgo} |
| |
| \end_inset |
| |
| Sun's Verification Algorithm |
| \layout Standard |
| |
| Sun specifies the data flow analyzer by giving an informal algorithm ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , pages 144-146). |
| This algorithm it cited here completely because it is the very core of |
| the verifier. |
| According to this algorithm, every bytecode instruction has a |
| \begin_inset Quotes eld |
| \end_inset |
| |
| changed |
| \begin_inset Quotes erd |
| \end_inset |
| |
| bit. |
| Initially, only the |
| \begin_inset Quotes eld |
| \end_inset |
| |
| changed |
| \begin_inset Quotes erd |
| \end_inset |
| |
| bit of the first instruction is set. |
| \layout Enumerate |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Select a virtual machine instruction whose "changed" bit is set. |
| If no instruction remains whose "changed" bit is set, the method has successful |
| ly been verified. |
| Otherwise, turn off the "changed" bit of the selected instruction. |
| \layout Enumerate |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Model the effect of the instruction on the operand stack and local variable |
| array by doing the following: |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If the instruction uses values from the operand stack, ensure that there |
| are a sufficient number of values on the stack and that the top values |
| on the stack are of an appropriate type. |
| Otherwise, verification fails. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If the instruction uses a local variable, ensure that the specified local |
| variable contains a value of the appropriate type. |
| Otherwise, verification fails. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If the instruction pushes values onto the operand stack, ensure that there |
| is sufficient room on the operand stack for the new values. |
| Add the indicated types to the top of the modeled operand stack. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If the instruction modifies a local variable, record that the local variable |
| now contains the new type. |
| \layout Enumerate |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Determine the instructions that can follow the current instruction. |
| Successor instructions can be one of the following: |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| The next instruction, if the current instruction is not an unconditional |
| control transfer instruction (for instance goto, return, or athrow). |
| Verification fails if it is possible to "fall off" the last instruction |
| of the method. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| The target(s) of a conditional or unconditional branch or switch. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| Any exception handlers for this instruction. |
| |
| \layout Enumerate |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Merge the state of the operand stack and local variable array at the end |
| of the execution of the current instruction into each of the successor |
| instructions. |
| In the special case of control transfer to an exception handler, the operand |
| stack is set to contain a single object of the exception type indicated |
| by the exception handler information. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If this is the first time the successor instruction has been visited, record |
| that the operand stack and local variable values calculated in steps 2 |
| and 3 are the state of the operand stack and local variable array prior |
| to executing the successor instruction. |
| Set the "changed" bit for the successor instruction. |
| \newline |
| |
| \latex latex |
| |
| \backslash |
| textbullet\SpecialChar ~ |
| |
| \latex default |
| If the successor instruction has been seen before, merge the operand stack |
| and local variable values calculated in steps 2 and 3 into the values already |
| there. |
| Set the "changed" bit if there is any modification to the values. |
| \layout Enumerate |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| Continue at step 1. |
| |
| \layout Standard |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| To merge two operand stacks, the number of values on each stack must be |
| identical. |
| The types of values on the stacks must also be identical, except that different |
| ly typed reference values may appear at corresponding places on the two |
| stacks. |
| In this case, the merged operand stack contains a reference to an instance |
| of the first common superclass of the two types. |
| Such a reference type always exists because the type Object is a superclass |
| of all class and interface types. |
| If the operand stacks cannot be merged, verification of the method fails. |
| \layout Standard |
| \pextra_type 1 \pextra_width 10mm |
| |
| |
| \series bold |
| To merge two local variable array states, corresponding pairs of local variables |
| are compared. |
| If the two types are not identical, then unless both contain reference |
| values, the verifier records that the local variable contains an unusable |
| value. |
| If both of the pair of local variables contain reference values, the merged |
| state contains a reference to an instance of the first common superclass |
| of the two types. |
| \layout Standard |
| |
| Certain instructions and data types complicate the data flow analyzer, most |
| notably the instruction |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| (see section |
| \begin_inset LatexCommand \ref{RetDesc} |
| |
| \end_inset |
| |
| ). |
| The algorithm above even uses a special definition of |
| \emph on |
| merging |
| \emph default |
| for the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction (see |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 151). |
| The |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction is parameterized with a value of type |
| \family typewriter |
| returnaddress |
| \family default |
| which is read from a local variable and used as a branching target. |
| The |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction is there to implement a (control flow) return from a |
| \emph on |
| subroutine |
| \emph default |
| . |
| \layout Subsubsection |
| |
| Reachability of Instructions |
| \layout Standard |
| |
| For the data flow analysis algorithm, you need to know all the possible |
| control flow successors of every instruction, i.e., you need to build a |
| \emph on |
| control flow graph |
| \emph default |
| (see below). |
| Without the instructions |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \begin_float footnote |
| \layout Standard |
| |
| Remember, a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction is an unconditional branch instruction that jumps into a |
| \emph on |
| subroutine |
| \emph default |
| . |
| Usually a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction leaves the |
| \emph on |
| subroutine |
| \emph default |
| . |
| \end_float |
| , |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| this calculation would be easy. |
| But to calculate successors of a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction, you need a complete control flow graph: you need to find out |
| which |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| pairs belong together. |
| Therefore, a cycle of self-dependency is created that has to be broken |
| somewhere. |
| This is explained in detail below. |
| \layout Standard |
| |
| This was also an issue that led to the definition of the term |
| \emph on |
| subroutine |
| \emph default |
| that JustIce uses. |
| This definition allows the prediction of a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction's target without performing control flow analysis. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{SpecSubroutines} |
| |
| \end_inset |
| |
| Subroutines |
| \layout Standard |
| |
| Subroutines make the verification algorithm extremely difficult. |
| They are harshly underspecified. |
| Although |
| \begin_inset Quotes eld |
| \end_inset |
| |
| the Java virtual machine has no guarantee that any file it is asked to load |
| was generated by that compiler |
| \begin_inset Quotes erd |
| \end_inset |
| |
| , the subroutine specification explains how |
| \emph on |
| javac |
| \emph default |
| transforms |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \latex latex |
| |
| \backslash |
| texttt{try} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{catch} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{finally} |
| \latex default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| clauses into subroutines |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| Intuitively, one gets the idea that a subroutine starts with some jump |
| target of a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction and ends with a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction. |
| But the specification fails to correctly specify what subroutines exactly |
| are at machine instruction level. |
| Consider algorithm |
| \begin_inset LatexCommand \ref{jsrpopalgo} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| \begin_float alg |
| \layout Standard |
| |
| |
| \family typewriter |
| 00 jsr\SpecialChar ~ |
| 03\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Jump to |
| \begin_inset Quotes eld |
| \end_inset |
| |
| subroutine |
| \begin_inset Quotes erd |
| \end_inset |
| |
| at offset 03; push return |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; address 03 onto stack. |
| \layout Standard |
| |
| |
| \family typewriter |
| 03 pop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Pop the return address off the stack. |
| \layout Standard |
| |
| |
| \family typewriter |
| 04 nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; No operation. |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{jsrpopalgo} |
| |
| \end_inset |
| |
| Is This a Subroutine? |
| \end_float |
| \layout Standard |
| |
| What is this? Is the |
| \emph on |
| NOP |
| \emph default |
| instruction part of a subroutine or not? Algorithm |
| \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} |
| |
| \end_inset |
| |
| shows another example. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{OneOrTwoSubroutinesAlgo} |
| |
| \end_inset |
| |
| One or Two Subroutines? |
| \layout Standard |
| |
| |
| \family typewriter |
| 00 iload_0\SpecialChar ~ |
| \SpecialChar ~ |
| ; Load a numerical 0 onto the stack. |
| \layout Standard |
| |
| |
| \family typewriter |
| 01 jsr\SpecialChar ~ |
| 05\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Jump to "subroutine" at offset 05; push return |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; address 04 onto stack. |
| \layout Standard |
| |
| |
| \family typewriter |
| 04 return\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Leave the method. |
| \layout Standard |
| |
| |
| \family typewriter |
| 05 dup\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Duplicate the stack's top. |
| \layout Standard |
| |
| |
| \family typewriter |
| 06 astore\SpecialChar ~ |
| 0\SpecialChar ~ |
| ; Store the return address from the stack into |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; local variable 0. |
| \layout Standard |
| |
| |
| \family typewriter |
| 07 astore\SpecialChar ~ |
| 1\SpecialChar ~ |
| ; Store the return address from the stack into |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; local variable 1. |
| \layout Standard |
| |
| |
| \family typewriter |
| 08 ifeq\SpecialChar ~ |
| 12\SpecialChar ~ |
| \SpecialChar ~ |
| ; If there is a 0 on top of the stack, jump to |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; offset 12. |
| \layout Standard |
| |
| |
| \family typewriter |
| 11 ret\SpecialChar ~ |
| 0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Return to offset 4 (because this is in local |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; variable 0 here). |
| \layout Standard |
| |
| |
| \family typewriter |
| 12 nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; No operation. |
| \layout Standard |
| |
| |
| \family typewriter |
| 13 ret\SpecialChar ~ |
| 1\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Return to offset 4 (because this is in local |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; variable 1 here). |
| \end_float |
| \layout Standard |
| |
| Do we deal with one subroutine (which is the case if you define subroutines |
| to start with a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| 's target) or are these two subroutines (which is the case if you count |
| the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instructions and believe that there must be exactly one |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| per subroutine)? |
| \layout Standard |
| |
| Recursive calls to subroutines are forbidden by the specification; however, |
| Sun's verifier implementations are not consequently deciding which recursive |
| calls to reject |
| \begin_float footnote |
| \layout Standard |
| |
| This was experimentally found by the author and also published in |
| \begin_inset LatexCommand \cite{JBook} |
| |
| \end_inset |
| |
| . |
| \end_float |
| . |
| This is a failure due to a missing definition of the term |
| \emph on |
| subroutine |
| \emph default |
| . |
| \layout Standard |
| |
| While the first example passes Sun's verifier, the second example is rejected. |
| The exact definition of the term |
| \emph on |
| subroutine |
| \emph default |
| cannot be deducted from ther behaviour of Sun's verifier. |
| \layout Standard |
| |
| A new, clean specification had to be defined. |
| Such a specification can of course not be compatible with the behaviour |
| of Sun's verifier in all corner cases. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{Subroutines_Def} |
| |
| \end_inset |
| |
| A Precise Definition of the Term |
| \emph on |
| Subroutine |
| \layout Standard |
| |
| Because Sun --inappropriately-- describes how |
| \emph on |
| javac |
| \emph default |
| creates subroutines, the definition presented here is based on the observation |
| of |
| \emph on |
| javac |
| \emph default |
| 's behaviour. |
| This makes the definition compatible with a lot of existing code, but without |
| violating the validity of far-reaching conclusions earned by exploiting |
| a clean definition |
| \begin_float footnote |
| \layout Standard |
| |
| Unfortunately, in some rare cases, |
| \emph on |
| javac |
| \emph default |
| produces code that is incompatible with the constraints related to our |
| definition of |
| \emph on |
| subroutine |
| \emph default |
| . |
| However, |
| \emph on |
| javac |
| \emph default |
| also produces code which is incompatible with Sun's verifier (see section |
| |
| \begin_inset LatexCommand \ref{StaerkJreject} |
| |
| \end_inset |
| |
| ). |
| \end_float |
| . |
| |
| \layout Itemize |
| |
| Every instruction of a method is part of exactly one subroutine (or the |
| top-level). |
| \layout Itemize |
| |
| The first instruction of a subroutine is an |
| \latex latex |
| |
| \backslash |
| texttt{astore N} |
| \latex default |
| instruction that stores the return address in local variable number |
| \emph on |
| N |
| \emph default |
| . |
| \layout Itemize |
| |
| There must be exactly one |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction per subroutine. |
| This instruction must work on the local variable |
| \emph on |
| N |
| \emph default |
| ; i.e., it is a |
| \latex latex |
| |
| \backslash |
| texttt{ret N} |
| \latex default |
| instruction. |
| \layout Itemize |
| |
| Subroutines are not protected by exception handlers. |
| \layout Itemize |
| |
| No instruction that is part of a subroutine is the target of an exception |
| handler. |
| \layout Itemize |
| |
| Subroutines of a subroutine do not access local variable |
| \emph on |
| N |
| \emph default |
| . |
| A subsubroutine of a subroutine is also considered a subroutine here, in |
| a recursive sense. |
| \layout Standard |
| |
| As we can see, a subroutine can be characterized by its set of instructions, |
| the most important instruction being the target of some |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction that is not part of the subroutine itself. |
| Another important property is the local variable |
| \emph on |
| N |
| \emph default |
| the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction is working on. |
| \layout Standard |
| |
| This way, we can make sure subroutines are properly nested, so that JustIce |
| would reject both the example bytecodes in algorithms |
| \begin_inset LatexCommand \ref{jsrpopalgo} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| The |
| \latex latex |
| |
| \backslash |
| texttt{astore} |
| \latex default |
| instruction mentioned above is so important because there is no JVM instruction |
| that can read values of a |
| \latex latex |
| |
| \backslash |
| texttt{returnaddress} |
| \latex default |
| type from local variables. |
| After entering a subroutine, the |
| \latex latex |
| |
| \backslash |
| texttt{astore} |
| \latex default |
| instruction pops the return address off the operand stack and writes it |
| into local variable number |
| \emph on |
| N |
| \emph default |
| . |
| Therefore we can be sure it will not be duplicated or deleted as in algorithms |
| |
| \begin_inset LatexCommand \ref{jsrpopalgo} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| The constraints concerning exception handlers are defined to make sure that |
| we can observe the control flow statically. |
| If an exception is thrown from within a subroutine, the method simply |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \emph on |
| completes abruptly |
| \emph default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 74). |
| If we would allow subroutine instructions to be protected by exception |
| handlers, it would not be clear if the handling instructions are part of |
| the subroutine or not. |
| \layout Standard |
| |
| We can also derive subsubroutines of subroutines recursively by exploiting |
| the properly-nested property explained above. |
| \layout Subsubsection |
| |
| The Control Flow Graph |
| \layout Standard |
| |
| A control flow graph is a directed graph with edges that represent possible |
| branches of control flow. |
| Similarly, the nodes describe groups of physically adjacent instructions |
| that have to be executed one after another -- without any possible control |
| flow branch to another instruction but the physical successor |
| \begin_float footnote |
| \layout Standard |
| |
| More information about control flow graphs can be found in |
| \begin_inset LatexCommand \cite{DragonBook} |
| |
| \end_inset |
| |
| . |
| \end_float |
| . |
| Figure |
| \begin_inset LatexCommand \ref{convcfg} |
| |
| \end_inset |
| |
| shows such a control flow graph for algorithm |
| \begin_inset LatexCommand \ref{facjavabytecode} |
| |
| \end_inset |
| |
| , the implementation of the faculty function discussed earlier. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 368 |
| file conventcfg.eps |
| width 3 100 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{convcfg} |
| |
| \end_inset |
| |
| A Conventional Control Flow Graph |
| \end_float |
| \layout Standard |
| |
| The JVM defines a sort of control flow orthogonal to the common execution |
| of instructions, namely, the exception mechanism. |
| Because every instruction could possibly throw an exception (say, a |
| \family typewriter |
| java.lang.VirtualMachineError |
| \family default |
| ) during its execution, the control flow graph calculated by JustIce always |
| uses only one instruction per node. |
| This also reflects the original verification algorithm given by Sun Microsystem |
| s. |
| Figure |
| \begin_inset LatexCommand \ref{justicecfg} |
| |
| \end_inset |
| |
| shows an example for such a control flow graph. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 473 |
| file justicecfg.eps |
| width 3 100 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{justicecfg} |
| |
| \end_inset |
| |
| A Control Flow Graph as Used by JustIce |
| \end_float |
| \layout Standard |
| |
| Instruction nodes are augmented with a data structure that represents the |
| simulated operand stack and the simulated local variables array. |
| When running the core verification algorithm, these nodes are put into |
| a queue which is equivalent to tagging them with a |
| \emph on |
| changed |
| \emph default |
| bit as Sun describes |
| \begin_float footnote |
| \layout Standard |
| |
| As explained later, JustIce uses a queue that allows duplicates: this is |
| a slight semantical change. |
| \end_float |
| . |
| \layout Subsubsection |
| |
| Subroutines Revisited: Interplay With the Data Flow Analyzer |
| \layout Standard |
| |
| There is another problem concerning subroutines. |
| Normally, when merging the type information of two simulated local variables, |
| the common type is recorded as |
| \emph on |
| unusable |
| \emph default |
| if the types differ. |
| This |
| \emph on |
| unusable |
| \emph default |
| value is then propagated to subsequent instructions to prevent read access. |
| \layout Standard |
| |
| This is not the case with the successors of the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction. |
| These successors are physical successors of some |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instructions. |
| \layout Standard |
| |
| Subroutines are said to be |
| \emph on |
| polymorphic |
| \emph default |
| with respect to their local variables arrays. |
| As an example, consider algorithm |
| \begin_inset LatexCommand \ref{lvpolymorphalgo} |
| |
| \end_inset |
| |
| . |
| This algorithm shows legal JVM code. |
| In line 11, local variable 0 may contain a value of the |
| \family typewriter |
| integer |
| \family default |
| or the |
| \family typewriter |
| float |
| \family default |
| type; depending on the |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| instruction that entered the subroutine. |
| Normally, this would cause the verifier to mark local variable 0 as |
| \emph on |
| unusable |
| \emph default |
| and propagate this information. |
| The successors of the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction are the instructions in lines 5 and 10. |
| However, a correct verifier does |
| \emph on |
| not |
| \emph default |
| mark local variable 0 as |
| \emph on |
| unusable |
| \emph default |
| for them, because the local variable 0 was not accessed or modified in |
| the subroutine. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{lvpolymorphalgo} |
| |
| \end_inset |
| |
| Local Variables are Polymorphic in Subroutines |
| \layout Standard |
| |
| |
| \family typewriter |
| 0 : iconst_0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; load integer constant 0 onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| 1 : istore 0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; move it into local variable 0 |
| \layout Standard |
| |
| |
| \family typewriter |
| 2 : jsr 11\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; enter subroutine |
| \layout Standard |
| |
| |
| \family typewriter |
| 5 : fconst 0.0\SpecialChar ~ |
| ; load float constant 0.0 onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| 6 : fstore 0\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; move it into local variable 0 |
| \layout Standard |
| |
| |
| \family typewriter |
| 7 : jsr 11\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; enter subroutine again |
| \layout Standard |
| |
| |
| \family typewriter |
| 10: return\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; complete method |
| \layout Standard |
| |
| |
| \family typewriter |
| 11: astore 1\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Subroutine entry: move return address |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; into local variable 1 |
| \layout Standard |
| |
| |
| \family typewriter |
| 12: nop\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; do nothing |
| \layout Standard |
| |
| |
| \family typewriter |
| 13: ret 1\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; return from subroutine |
| \end_float |
| \layout Standard |
| |
| Basically, only the local variables accessed in the called subroutine (and |
| the subroutines called from there, recursively) are merged with the correspondi |
| ng successor of a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction. |
| This means that in this special case, three sources are used to construct |
| the merged array of local variables type information (instead of only two): |
| the |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction, the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction and the "old" type information of the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction's target (which is the physical successor of the |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction). |
| \layout Standard |
| |
| One possibility to deal with this situation is |
| \emph on |
| inlining |
| \emph default |
| . |
| For instance, the verifier of the ElectricalFire JVM |
| \begin_inset LatexCommand \cite{EF} |
| |
| \end_inset |
| |
| uses this approach: instruction nodes of subroutines are duplicated for |
| every calling |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| or |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction. |
| This approach is equivalent to the one sketched by Sun (see |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 151). |
| |
| \layout Standard |
| |
| JustIce uses a variant of this approach: instruction nodes are augmented |
| with sets of local variables arrays. |
| The local variables array used for merging a |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| 's type information with the physical successor of some |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction is keyed by that |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction itself. |
| This still implies a special merging mechanism for the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instruction: only the physical successor of one |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instruction can be merged with the |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| at a time, because other |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| instructions have possibly not been symbolically executed yet and thus |
| bear no type information at the time of merging. |
| In this scenario, an instruction in a subroutine plays multiple roles; |
| one for each occurence of a |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| that is calling the subroutine. |
| The queue holding the instructions to symbolically execute is therefore |
| required to allow duplicates. |
| \layout Subsubsection |
| |
| Wide Data Types |
| \layout Standard |
| |
| The types |
| \family typewriter |
| long |
| \family default |
| and |
| \family typewriter |
| double |
| \family default |
| use two consecutive local variables if written to or read from a local variables |
| array. |
| Similarly, they use two operand stack slots. |
| This makes type verification a bit more difficult because of subtle special |
| cases. |
| For example, when a method uses three local variables at maximum (local |
| variables 0, 1 and 2), the code is not allowed to store a |
| \family typewriter |
| double |
| \family default |
| value in local variable 2 (because local variable 3 would have to be occupied, |
| too). |
| \layout Subsubsection |
| |
| Instance Initialization and Newly Created Objects |
| \layout Standard |
| |
| It would be difficult to verify that a newly created instance is initialized |
| exactly once, given all possible paths of execution flow in a method. |
| Fortunately (from a verifier implementor's view), Sun puts constraints |
| on object initialization that match the behaviour of the verifier --- instead |
| of putting sane constraints on object initialization and actually verifying |
| them. |
| \layout Standard |
| |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| A valid instruction sequence must not have an uninitialized object on the |
| operand stack or in a local variable during a backwards branch [\SpecialChar \ldots{} |
| ]. |
| Otherwise, a devious piece of code might fool the verifier into thinking |
| it had initialized a class instance when it had, in fact, initialized a |
| class instance created in a previous pass through a loop |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 148). |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{Pass4Spec} |
| |
| \end_inset |
| |
| Pass Four |
| \layout Standard |
| |
| Pass four performs |
| \begin_inset Quotes eld |
| \end_inset |
| |
| certain tests that could in principle be performed in Pass 3 |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 142). |
| These tests are usually delayed by JVM implementations until run-time, |
| because they possibly trigger the loading of referenced class file definitions. |
| This is a performance enhancement. |
| However, |
| \begin_inset Quotes eld |
| \end_inset |
| |
| A Java virtual machine implementation is allowed to perform any or all of |
| the Pass 4 steps as part of Pass 3 |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 143). |
| The tests |
| \layout Itemize |
| |
| ensure that the referenced method or field exists in the given class |
| \layout Itemize |
| |
| check that the referenced method or field has the indicated descriptor (signatur |
| e) |
| \layout Itemize |
| |
| check that the currently executing method has access to the referenced method |
| or field. |
| \layout Standard |
| |
| JustIce has no run-time system and so the tests of pass four are performed |
| in pass 3a. |
| \layout Standard |
| |
| There are tests that have to be performed at run-time: for example, if an |
| object referenced by an object reference on top of the operand stack implements |
| a certain interface or not |
| \begin_inset LatexCommand \cite{Fong2-WWW} |
| |
| \end_inset |
| |
| . |
| These are not considered part of the pass four verification. |
| \layout Chapter |
| |
| Implementation of the Verification Passes |
| \layout Standard |
| |
| Occasionally, the behaviour of other verifier implementations was explained |
| in section |
| \begin_inset LatexCommand \ref{SpecPasses} |
| |
| \end_inset |
| |
| |
| \emph on |
| . |
| |
| \emph default |
| This is not a mistake; the Java Virtual Machine Specification, Second Edition |
| |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| is unfortunately not detailed enough to make a clean-room implementation |
| of the JVM verifier possible. |
| Having a close look at the behaviour of existing verifier implementations |
| is sometimes necessary to interpret the specification correctly. |
| For that reason, the behaviour of these implementations is part of the |
| specification of JustIce whereever appropriate. |
| Still, there are some minor differences in behaviour between JustIce and |
| the traditional JVM built-in verifiers. |
| These differences were observed by using the traditional verifiers, not |
| by inspecting their source code. |
| \layout Standard |
| |
| JustIce is implemented in the Java programming language |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| using the Byte Code Engineering Library |
| \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} |
| |
| \end_inset |
| |
| . |
| \layout Section |
| |
| Pass One |
| \layout Standard |
| |
| The Byte Code Engineering Library (BCEL) presents an object oriented view |
| of the class file structure. |
| Therefore, an integral part of that library is parsing class files. |
| JustIce uses the BCEL, so there was nothing left to do to load a class |
| file in. |
| Only minor changes were made to the BCEL to make it more verbose when exception |
| al situations occur; i.e., when a garbled class file is loaded in. |
| The BCEL uses Java's exception mechanism to signal these situations; JustIce |
| transforms this behaviour into the behaviour expected by users of the Verificat |
| ion API (see section |
| \begin_inset LatexCommand \ref{Verification API} |
| |
| \end_inset |
| |
| ). |
| \layout Subsubsection |
| |
| Comparison to Sun's Implementation |
| \layout Standard |
| |
| There does not seem to be any difference in behaviour between JustIce and |
| the traditional verifiers. |
| Still, this conviction is a result of black box tests so it might not be |
| true in corner cases. |
| \layout Standard |
| |
| Unknown attributes are ignored (though JustIce records a warning message, |
| where the traditional verifiers don't). |
| \layout Standard |
| |
| Trailing bytes at the end of the class file are ignored in both versions, |
| contradicting the specification. |
| This was necessary because some Java run-time environments are broken concernin |
| g the handling of .JAR archive files. |
| The mechanism of loading class files from these archives files using the |
| Java Platform's API is used by BCEL and probably by Sun's JVM, too. |
| It is possible that this is the reason why Sun's verifier itself does not |
| enforce this constraint. |
| However, it does not really pose a threat to the integrity of any JVM known |
| to the author. |
| There is no entry in the |
| \family typewriter |
| ClassFile |
| \family default |
| structure (see section |
| \begin_inset LatexCommand \ref{Classfile Structure} |
| |
| \end_inset |
| |
| ) stating how long the class file is in its entirety, so a JVM implementor |
| cannot possibly base a wrong decision on that. |
| |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{Pass2Impl} |
| |
| \end_inset |
| |
| Pass Two |
| \layout Standard |
| |
| JustIce does perform |
| \begin_inset Quotes eld |
| \end_inset |
| |
| all verification that can be performed without looking at the bytecodes |
| \begin_inset Quotes erd |
| \end_inset |
| |
| in pass two. |
| For some reasons (like determining a valid ancestor hierarchy of a class), |
| pass two of JustIce has to load referenced classes. |
| Of course, this is done in a careful way: by pass-one-verifying them. |
| If loading of a referenced class should fail (i.e., verification pass one |
| fails on this class), the referencing class is rejected by JustIce's pass |
| two. |
| Pass two of JustIce does not pass-two-verify any referenced classes. |
| \layout Standard |
| |
| Also, JustIce's pass two emits a wealth of (warning) messages. |
| Their target is to guide a bytecode engineer to create class files that |
| are indistinguishable from those created by Sun's |
| \emph on |
| javac |
| \emph default |
| compiler with no debugging output. |
| For example, the use of |
| \family typewriter |
| LineNumberTable |
| \family default |
| attributes (see section |
| \begin_inset LatexCommand \ref{LineNumberTableAttribute} |
| |
| \end_inset |
| |
| ) is discouraged, because these atributes are only useful for debugging |
| purposes. |
| Still, they can be the reason for a class file to be rejected -- to be |
| on the safe side, finished applications for the JVM should not be shipped |
| with this debug information. |
| \layout Standard |
| |
| Most of the checks of pass two were implemented using the Visitor programming |
| pattern |
| \begin_inset LatexCommand \cite{DesignPatterns} |
| |
| \end_inset |
| |
| provided by the BCEL's |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.class\SpecialChar \- |
| file |
| \emph default |
| API. |
| This made it possible to have all the verification split into several methods |
| without having to define artificial boundaries. |
| For instance, a |
| \family typewriter |
| ConstantValue |
| \family default |
| attribute is verified in a method called |
| \emph on |
| visitConstantValue(ConstantValue) |
| \emph default |
| . |
| This is a use of the object oriented view of class files the BCEL offers. |
| \layout Subsubsection |
| |
| Comparison to Sun's Implementation |
| \layout Standard |
| |
| JustIce does not distinguish between run-time or link-time because it was |
| not intended to implement a JVM. |
| Therefore, the notion of |
| \emph on |
| resolving |
| \emph default |
| (see section |
| \begin_inset LatexCommand \ref{SpecPassTwo} |
| |
| \end_inset |
| |
| ) is useless for JustIce. |
| The author believes that the specification of pass two given by Sun closely |
| reflects their implementation (or the other way around) |
| \begin_float footnote |
| \layout Standard |
| |
| The Java Virtual Machine Specification, Second Edition, began as an internal |
| project documentation ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page xiv). |
| Unfortunately, this can still be felt sometimes. |
| \end_float |
| . |
| \layout Standard |
| |
| Sometimes, there are ambiguities in the specification. |
| For instance, it is said that |
| \begin_inset Quotes eld |
| \end_inset |
| |
| If the constant pool of a class or interface refers to any class or interface |
| that is not a member of a package, its |
| \family typewriter |
| ClassFile |
| \family default |
| structure must have exactly one |
| \family typewriter |
| InnerClasses |
| \family default |
| attribute in its |
| \family typewriter |
| attributes |
| \family default |
| table |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| A class or interface that is |
| \begin_inset Quotes eld |
| \end_inset |
| |
| not member of a package |
| \begin_inset Quotes erd |
| \end_inset |
| |
| is better known as a |
| \emph on |
| nested class |
| \emph default |
| or |
| \emph on |
| inner class |
| \emph default |
| |
| \begin_inset LatexCommand \cite{InnerSpec} |
| |
| \end_inset |
| |
| , but this is something specific to the Java language. |
| The |
| \emph on |
| javac |
| \emph default |
| compiler creates multiple, often funny-named |
| \begin_float footnote |
| \layout Standard |
| |
| For anonymous classes defined in a class |
| \emph on |
| X |
| \emph default |
| the names are |
| \emph on |
| X$1 |
| \emph default |
| , |
| \emph on |
| X$2 |
| \emph default |
| and so on. |
| For a named inner class |
| \emph on |
| I |
| \emph default |
| defined in class |
| \emph on |
| C |
| \emph default |
| the name is |
| \emph on |
| C$I |
| \emph default |
| . |
| There is, however, no guarantee for that: this is only observed behaviour |
| of javac. |
| Please see section |
| \begin_inset LatexCommand \ref{InnerBug} |
| |
| \end_inset |
| |
| for an example how this behaviour can lead to unexpected problems. |
| \end_float |
| class files that are otherwise indistinguishable from normal class files. |
| \layout Standard |
| |
| Therefore, it is generally not possible to decide if such an attribute is |
| missing; therefore Sun's implementation does not check this constraint. |
| JustIce, in contrast, uses its warning mechanism if the name of a referenced |
| class or interface could be a name of an inner class created by the |
| \emph on |
| javac |
| \emph default |
| compiler and the |
| \family typewriter |
| InnerClass |
| \family default |
| attribute is missing. |
| \layout Standard |
| |
| The sets of accepted or rejected class files concerning pass two are equal |
| using both Sun's implementation and JustIce, as exhaustive tests show. |
| This can, however, not be proven because one would need to analyze Sun's |
| source code for that (which is not intended: as already mentioned, JustIce |
| is a clean-room implementation). |
| \layout Section |
| |
| Pass Three |
| \layout Subsection |
| |
| Pass 3a |
| \layout Standard |
| |
| One feature of the BCEL's |
| \emph on |
| de.fub.bytecode.generic |
| \emph default |
| package is parsing code attributes of methods and transforming them into |
| so-called |
| \family typewriter |
| Instruction\SpecialChar \- |
| List |
| \family default |
| objects. |
| Consequently, this feature is used to implement pass 3a; a few additional |
| checks have been implemented where BCEL is too |
| \begin_inset Quotes eld |
| \end_inset |
| |
| trustful |
| \begin_inset Quotes erd |
| \end_inset |
| |
| when parsing, i.e., where BCEL relies on the correctness of the class file. |
| \layout Standard |
| |
| Pass 3a consists of the checking of static constraints on instructions and |
| static constraints on operands of these instructions. |
| The successful creation an an |
| \family typewriter |
| Instruction\SpecialChar \- |
| List |
| \family default |
| object already implies that the static constraints on instructions are |
| satisfied. |
| Similar to pass one, JustIce transforms the behaviour of BCEL's exception |
| mechanism into the behaviour expected by users of the Verification API |
| (see section |
| \begin_inset LatexCommand \ref{Verification API} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| The |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.ge\SpecialChar \- |
| ne\SpecialChar \- |
| ric |
| \emph default |
| API provided by BCEL offers a Visitor design pattern similar to the one |
| of the |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.class\SpecialChar \- |
| file |
| \emph default |
| API. |
| The tests for the static constraints on operands of instructions are implemente |
| d by using it. |
| For example, the constraints put on the operands of any |
| \latex latex |
| |
| \backslash |
| texttt{iload} |
| \latex default |
| instruction are verified using a |
| \emph on |
| visitILOAD(ILOAD) |
| \emph default |
| method defined in a Visitor class. |
| This Visitor class implements all the checks for integrity of all instruction's |
| operands. |
| Algorithm |
| \begin_inset LatexCommand \ref{visitILOADstaticoperands} |
| |
| \end_inset |
| |
| shows the impementation of the |
| \emph on |
| visitILOAD(ILOAD) |
| \emph default |
| method. |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{visitILOADstaticoperands} |
| |
| \end_inset |
| |
| visitILOAD, Visitor ensuring static constraints on operands of instructions |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar \- |
| \SpecialChar ~ |
| /** Checks if the constraints of operands of the said instruction(s) are |
| satisfied. |
| */ |
| \newline |
| \SpecialChar \- |
| public void visitILOAD(ILOAD o){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int idx = o.getIndex(); |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (idx < 0){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| constraintViolated(o, "Index '"+idx+"' must be non-negative."); |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| else{ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int maxminus1 = max_locals()-1; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (idx > maxminus1){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 |
| '"+maxminus1+"'."); |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| } |
| \end_float |
| \layout Standard |
| |
| JustIce does not provide any run-time, so the tests of pass four (see section |
| |
| \begin_inset LatexCommand \ref{Pass4Spec} |
| |
| \end_inset |
| |
| ) are not delayed until run-time, but performed here. |
| \layout Subsubsection |
| |
| Comparison to Sun's Implementation |
| \layout Standard |
| |
| Sun does not distinguish pass 3a and pass 3b. |
| However, Sun's verifiers also have to ensure that the static constraints |
| on instructions are satisfied before starting data flow analysis. |
| \layout Standard |
| |
| This is obvious because a data structure has to be built before the data |
| flow analyzer can be run; and this data structure has to be built carefully |
| \begin_float footnote |
| \layout Standard |
| |
| This actually means verifying the structural integrity of the bytecodes. |
| \end_float |
| because passes one and two did not look at the bytecodes before. |
| \layout Standard |
| |
| JustIce does implement pass four checks in pass 3a which Sun's verifiers |
| do not. |
| Because JustIce provides no run-time, the outcome of a verification failure |
| is reported instantly. |
| Traditional JVMs are required to silently delay the actions triggered by |
| that knowledge until run-time. |
| \layout Subsection |
| |
| Pass 3b |
| \layout Standard |
| |
| JustIce aims at implementing Sun's data flow analyzing algorithm as closely |
| as possible. |
| First, a control flow graph is built --- which implies analyzing a method's |
| subroutine calling structure first. |
| \layout Standard |
| |
| After that an implementation of the core algorithm sketched by Sun Microsystems |
| is started. |
| Verification failure is internally signalled by the Java exception handling |
| mechanism which is then transformed to match the Verification API (see |
| section |
| \begin_inset LatexCommand \ref{Verification API} |
| |
| \end_inset |
| |
| ). |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{SubroutineImpl} |
| |
| \end_inset |
| |
| Subroutines |
| \layout Standard |
| |
| Subroutines are modeled as instances of the |
| \family typewriter |
| Subroutine |
| \family default |
| interface |
| \emph on |
| . |
| |
| \emph default |
| They provide the following methods (note that an |
| \family typewriter |
| InstructionHandle |
| \family default |
| is the BCEL's programming handle to instruction objects and that |
| \emph on |
| X[] |
| \emph default |
| is the common Java notation for |
| \emph on |
| array of |
| \emph default |
| |
| \emph on |
| X |
| \emph default |
| ): |
| \layout Itemize |
| |
| |
| \emph on |
| boolean contains(InstructionHandle) |
| \emph default |
| |
| \newline |
| Returns true if and only if the given |
| \family typewriter |
| InstructionHandle |
| \family default |
| refers to an instruction that is part of this subroutine, |
| \layout Itemize |
| |
| |
| \emph on |
| InstructionHandle[] getInstructions() |
| \emph default |
| |
| \newline |
| Returns all instructions that together form this subroutine, |
| \layout Itemize |
| |
| |
| \emph on |
| int[] getAccessedLocalsIndices() |
| \emph default |
| |
| \newline |
| Returns an array containing the indices of the local variable slots accessed |
| by this subroutine (read-accessed, write-accessed or both); local variables |
| referenced by subroutines of this subroutine are not included, |
| \layout Itemize |
| |
| |
| \emph on |
| int[] getRecursivelyAccessedLocalsIndices() |
| \emph default |
| |
| \emph on |
| |
| \newline |
| |
| \emph default |
| Returns an array containing the indices of the local variable slots accessed |
| by this subroutine (read-accessed, write-accessed or both); local variables |
| referenced by subroutines of this subroutine are included, |
| \layout Itemize |
| |
| |
| \emph on |
| Subroutine[] subSubs() |
| \emph default |
| |
| \emph on |
| |
| \newline |
| |
| \emph default |
| Returns the subroutines that are directly called from this subroutine, |
| \layout Itemize |
| |
| |
| \emph on |
| InstructionHandle[] getEnteringJsrInstructions() |
| \emph default |
| |
| \newline |
| Returns all the JsrInstructions that have the first instruction of this |
| subroutine as their target, |
| \layout Itemize |
| |
| |
| \emph on |
| InstructionHandle getLeavingRET() |
| \emph default |
| |
| \newline |
| Returns the one and only RET that leaves the subroutine. |
| \layout Standard |
| |
| Together with information from a simple analysis of the possible control |
| flow transfer of all the other instructions but |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| (see section |
| \begin_inset LatexCommand \ref{Pass3Spec} |
| |
| \end_inset |
| |
| ), a control flow graph is built. |
| \layout Subsubsection |
| |
| The Control Flow Graph |
| \layout Standard |
| |
| The control flow graph is a single instance with respect to a given method |
| to verify. |
| It is defined by providing access to a set of contexts of instructions. |
| These are modeled as instances of the |
| \emph on |
| |
| \family typewriter |
| \emph default |
| In\SpecialChar \- |
| struc\SpecialChar \- |
| tion\SpecialChar \- |
| Con\SpecialChar \- |
| text |
| \family default |
| interface. |
| \layout Standard |
| |
| These instances enclose |
| \family typewriter |
| InstructionHandle |
| \family default |
| objects (which represent an instruction in the bytecode), but they augment |
| these objects with type information (a set of |
| \family typewriter |
| Frame |
| \family default |
| s, see below) as needed by the data flow analysis algorithm. |
| Also, a method called |
| \emph on |
| getSuccessors() |
| \emph default |
| is provided that calculates the possible control flow successors of a given |
| |
| \family typewriter |
| In\SpecialChar \- |
| struc\SpecialChar \- |
| tion\SpecialChar \- |
| Con\SpecialChar \- |
| text |
| \family default |
| instance. |
| \layout Standard |
| |
| The most notable method defined in the |
| \family typewriter |
| In\SpecialChar \- |
| struc\SpecialChar \- |
| tion\SpecialChar \- |
| Con\SpecialChar \- |
| text |
| \family default |
| \emph on |
| |
| \emph default |
| interface is, however, the |
| \emph on |
| execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) |
| \emph default |
| method. |
| This method is used to symbolically execute a given instruction. |
| \layout Standard |
| |
| The |
| \family typewriter |
| ArrayList |
| \family default |
| \emph on |
| |
| \emph default |
| argument is there to record the subroutine calling chain. |
| The properly-nested property of JustIce subroutines is exploited here: |
| one can simply count |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| / |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| instructions, similar to counting opened and closed braces in mathematical |
| expressions. |
| \layout Standard |
| |
| A |
| \family typewriter |
| Frame |
| \family default |
| is JustIce's model of an |
| \emph on |
| execution frame |
| \emph default |
| : a local variables array model together with an operand stack model. |
| Every |
| \emph on |
| InstructionContext |
| \emph default |
| instance is augmented with such a frame (to be precise, a set of such frames |
| as discussed in the specification of subroutines, see section |
| \begin_inset LatexCommand \ref{Pass3Spec} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| When frames are merged, the |
| \emph on |
| execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) |
| \emph default |
| method of some successor |
| \family typewriter |
| InstructionContext |
| \family default |
| is called. |
| The |
| \family typewriter |
| Frame |
| \family default |
| argument represents is the current type information of the predecessing |
| |
| \family typewriter |
| InstructionContext. |
| \layout Subsubsection |
| |
| Visitors |
| \layout Standard |
| |
| As in pass 3a, the Visitor pattern of the BCEL |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.ge\SpecialChar \- |
| ne\SpecialChar \- |
| ric |
| \emph default |
| API is also used in pass 3b. |
| While it was used to verify the static constraints of pass three in pass |
| 3a, it is now used to verify the structural constraints. |
| \layout Standard |
| |
| Before an instruction |
| \family typewriter |
| X |
| \family default |
| is symbolically executed, the corresponding |
| \emph on |
| visitX(X) |
| \emph default |
| method is invoked on an |
| \family typewriter |
| InstConstraintVisitor |
| \family default |
| instance. |
| This instance is there to verify all the preconditions are met to safely |
| execute the instruction |
| \family typewriter |
| X |
| \family default |
| . |
| The |
| \family typewriter |
| InstConstraintVisitor |
| \family default |
| class therefore holds information about the preconditions of all 212 valid |
| Java bytecode instructions. |
| A simplified version of this Visitor's |
| \emph on |
| visitILOAD(ILOAD) |
| \emph default |
| method is listed in algorithm |
| \begin_inset LatexCommand \ref{visitILOADInstConstraints} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| Similarly, the |
| \emph on |
| |
| \family typewriter |
| \emph default |
| ExecutionVisitor |
| \family default |
| class contains information about the behaviour of every bytecode instruction. |
| An instance of this class is used to model the effect of the bytecode instructi |
| ons on a |
| \emph on |
| Frame |
| \emph default |
| instance. |
| Algorithm |
| \begin_inset LatexCommand \ref{visitILOADExecution} |
| |
| \end_inset |
| |
| shows the |
| \emph on |
| visitILOAD(ILOAD) |
| \emph default |
| method of this Visitor. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{visitILOADInstConstraints} |
| |
| \end_inset |
| |
| visitILOAD, Visitor ensuring the structural (dynamic) constraints of instruction |
| s |
| \layout Standard |
| |
| |
| \family typewriter |
| public void visitILOAD(ILOAD o){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int produce = o.produceStack(cpg); |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if ( produce + stack().slotsUsed() > stack().maxStack() ){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().ma |
| xStack()-stack().slotsUsed())+" free stack slot(s) left. |
| \backslash |
| nStack: |
| \backslash |
| n"+stack()); |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| [\SpecialChar \ldots{} |
| ] |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \end_float |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{visitILOADExecution} |
| |
| \end_inset |
| |
| visitILOAD, Visitor symbolically executing instructions |
| \layout Standard |
| |
| |
| \family typewriter |
| /** Symbolically executes the corresponding Java Virtual Machine instruction. |
| */ |
| \newline |
| \SpecialChar \- |
| public void visitILOAD(ILOAD o){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| stack().push(Type.INT); |
| \newline |
| \SpecialChar \- |
| } |
| \end_float |
| \begin_float alg |
| \layout Caption |
| |
| Simplified Core Verification Algorithm of Pass 3b |
| \layout Standard |
| |
| |
| \series bold |
| \size small |
| public VerificationResult do_verify(Method m) |
| \series default |
| { |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ControlFlowGraph cfg; |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (m.hasCode()) |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| cfg = new ControlFlowGraph(m) |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| else |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return Good_VerificationResult; |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Frame f = new Frame(); |
| \shape slanted |
| // local variables and operand stack |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| f.localVariables().initialize(m.signature()); |
| \shape slanted |
| // put formal param types into loc. |
| vars |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| InstConstraintVisitor icv = new InstConstraintVisitor(); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ExecutionVisitor ev = new ExecutionVisitor(); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| try{ |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| circulationPump(cfg, f, icv, ev); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| catch(VerificationFailure){ |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return Bad_VerificationResult; |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return Good_VerificationResult; |
| \layout Standard |
| |
| |
| \size small |
| } |
| \newline |
| |
| \layout Standard |
| |
| |
| \series bold |
| \size small |
| public void circulationPump(ControlflowGraph cfg, Frame startFrame, InstConstrai |
| ntVisitor icv, ExecutionVisitor ev) throws VerificationFailure |
| \series default |
| { |
| \layout Standard |
| |
| |
| \size small |
| Instruction start = cfg.getFirstInstruction(); |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| /* |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| Now merge the first frame (type info) into the first instruction. |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| Empty list -> no instructions have been executed before. |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| */ |
| \layout Standard |
| |
| |
| \size small |
| start.execute(startFrame, EmptyInstructionList, icv, ev); |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| /* |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| Q is a Queue of pairs (Instruction, InstructionList). |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| */ |
| \layout Standard |
| |
| |
| \size small |
| Queue Q = EmptyQueue; |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| /* |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| Put the first instruction into the queue. |
| This is similar to initializing a breadth first search. |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| */ |
| \layout Standard |
| |
| |
| \size small |
| Q.add (start, EmptyInstructionList); |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| /* |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| The main loop |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| */ |
| \layout Standard |
| |
| |
| \size small |
| while (Q.isNotEmpty()){ |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Instruction u = fst(Q.head()); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| InstructionList ec = snd(Q.head()); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Q.removeHead(); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| InstructionList oldchain = ec; |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| InstructionList newchain = ec++[u]; |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| for (all successors v of u){ |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| |
| \shape slanted |
| /* |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| execute returns true if type info has changed. |
| It may throw VerificationFailures. |
| \layout Standard |
| |
| |
| \shape slanted |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| */ |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (v.execute(u.getOutFrame(oldchain), newchain,icv,ev)) |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Q.add((v, newchain)); |
| \layout Standard |
| |
| |
| \size small |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \layout Standard |
| |
| |
| \size small |
| } |
| \end_float |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{ComparisonSubroutines} |
| |
| \end_inset |
| |
| Comparison to Sun's Implementation |
| \layout Standard |
| |
| JustIce was originally aimed to be as compatible to Sun's implementation |
| as possible. |
| However, the unclear specification prevents clean room implementations |
| (i.e., implementations whose programmers did not look into Sun's code) from |
| perfect compatibility. |
| \layout Standard |
| |
| Fortunately, it JustIce closely matches Sun's implementation in its behaviour. |
| As a test case, the author verified the transitive hull of the referenced |
| class files starting with the |
| \emph on |
| de.fub.bytecode.verifier.Verifier |
| \emph default |
| class. |
| This set includes most of the classes of the Java 2 API supplied by Sun |
| Microsystems, i.e., a few hundreds of apparently correct classes. |
| A very small number of class files was rejected by JustIce because of its |
| different specification of subroutine constraints. |
| No other rejects were encountered. |
| \layout Standard |
| |
| Most class files that are found to be rejected by Sun's verifier implementations |
| are rejected by JustIce, too. |
| \layout Standard |
| |
| However, there are class file rejected by Sun's verifier implementations |
| but not by JustIce. |
| This should not occur, but JustIce does not mimic the programming errors |
| of Sun's verifiers so far. |
| Please see section |
| \begin_inset LatexCommand \ref{javacRejected} |
| |
| \end_inset |
| |
| for a discussion on a selected incompatibility issue. |
| \layout Standard |
| |
| An automated testing suite could solidify the trust in JustIce's implementation |
| which is not implemented yet. |
| Please see section |
| \begin_inset LatexCommand \ref{VerifierValidationSuite} |
| |
| \end_inset |
| |
| for a discussion on that topic. |
| \layout Section |
| |
| Pass Four |
| \layout Standard |
| |
| The tests Sun's verifiers perform during run-time but which in principle |
| could be performed in pass three |
| \emph on |
| are |
| \emph default |
| performed in pass 3a by JustIce. |
| \layout Subsubsection |
| |
| Comparison to Sun's Implementation |
| \layout Standard |
| |
| It sems natural that Sun's verifier implements the specification by Sun. |
| Obviously, JustIce has no run-time so JustIce has no pass four. |
| The checks Sun performs in pass four |
| \begin_float footnote |
| \layout Standard |
| |
| Some JVMs expose implementation mistakes concerning pass four verification. |
| See section |
| \begin_inset LatexCommand \ref{PassFourBug} |
| |
| \end_inset |
| |
| . |
| \end_float |
| are performed in pass 3a by JustIce. |
| \layout Chapter |
| |
| |
| \begin_inset LatexCommand \label{Verification API} |
| |
| \end_inset |
| |
| The Verification API |
| \layout Section |
| |
| Introduction |
| \layout Standard |
| |
| The Application Programming Interface (API) of JustIce uses object oriented |
| design patterns |
| \begin_inset LatexCommand \cite{DesignPatterns} |
| |
| \end_inset |
| |
| . |
| Readers not familiar with design patterns are encouraged to read at least |
| about the |
| \emph on |
| Visitor |
| \emph default |
| , |
| \emph on |
| Singleton |
| \emph default |
| , |
| \emph on |
| Observer |
| \emph default |
| and |
| \emph on |
| Factory |
| \emph default |
| patterns. |
| \layout Standard |
| |
| JustIce currently consists of four packages: |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.veri\SpecialChar \- |
| fier |
| \emph default |
| , |
| \emph on |
| de.fub. |
| byte\SpecialChar \- |
| code.veri\SpecialChar \- |
| fier.exc |
| \emph default |
| , |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.veri\SpecialChar \- |
| fier.statics |
| \emph default |
| and |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code.veri\SpecialChar \- |
| fier. |
| struc\SpecialChar \- |
| tu\SpecialChar \- |
| rals |
| \emph default |
| . |
| (We shall from now on omit the preceding |
| \emph on |
| de.fub.byte\SpecialChar \- |
| code |
| \emph default |
| .) The most important of them is the |
| \emph on |
| verifier |
| \emph default |
| package. |
| The class |
| \family typewriter |
| VerifierFactory |
| \family default |
| can be found here; this is the place where all verification starts. |
| The |
| \family typewriter |
| Veri\SpecialChar \- |
| fier\SpecialChar \- |
| Fac\SpecialChar \- |
| tory |
| \family default |
| creates |
| \family typewriter |
| Verifier |
| \family default |
| instances; only the |
| \family typewriter |
| VerifierFactory |
| \family default |
| can create these instances. |
| A |
| \family typewriter |
| Verifier |
| \family default |
| instance, in turn, has a one-to-one relationship with a class file to verify, |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| its class |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| You can instruct a |
| \family typewriter |
| Verifier |
| \family default |
| instance to run a verification pass on its class yielding a |
| \family typewriter |
| VerificationResult |
| \family default |
| . |
| \layout Standard |
| |
| All class files are fetched from the BCEL's class file repository, i.e., the |
| class |
| \family typewriter |
| Re\SpecialChar \- |
| po\SpecialChar \- |
| si\SpecialChar \- |
| to\SpecialChar \- |
| ry |
| \family default |
| . |
| The class files stored there are either put there by the user or they are |
| read from the file system. |
| For a bytecode engineer who uses the BCEL this is convenient, because one |
| does not have to save the dynamically created class file first in order |
| to load it into JustIce. |
| \layout Standard |
| |
| Pass 1 and pass 2 are related to the |
| \family typewriter |
| ClassFile |
| \family default |
| structure as such; passes 3a and 3b verify the bytecode of a method. |
| If a class file was created using the BCEL, the BCEL user already knows |
| how the |
| \family typewriter |
| JavaClass |
| \family default |
| object looks like |
| \begin_float footnote |
| \layout Standard |
| |
| A |
| \family typewriter |
| JavaClass |
| \family default |
| object represents a class file in the BCEL. |
| \end_float |
| . |
| The number of methods is known and the order of the methods in the class |
| file is known. |
| \layout Standard |
| |
| However, if this is not the case, one usually does not know the number of |
| methods in a class file or the order of these methods. |
| To carefully extract this information from an untrusted class file, one |
| should first let a pass-2-verification run on this file. |
| Afterwards, the information can be read from the |
| \family typewriter |
| JavaClass |
| \family default |
| object the BCEL offers. |
| \layout Standard |
| |
| Finally, one is able to supply the |
| \begin_inset Quotes eld |
| \end_inset |
| |
| method index |
| \begin_inset Quotes erd |
| \end_inset |
| |
| needed by verification passes 3a and 3b. |
| \layout Standard |
| |
| Basically, after pass 2 has been run successfully on a class file, one can |
| safely use the methods in the BCEL's |
| \emph on |
| classfile |
| \emph default |
| package |
| \emph on |
| |
| \emph default |
| on that class file. |
| After pass 3a has been run successfully on a method, one can safely work |
| on that method using the BCEL's |
| \emph on |
| generic |
| \emph default |
| package. |
| After pass 3b has been run successfully on all methods in a class file, |
| this class file will not be rejected by other verifiers. |
| \layout Standard |
| |
| Often, the run of a verification pass implies recursively verifying other |
| class files as well (because they are somehow referenced). |
| Therefore, |
| \emph on |
| Verifier |
| \emph default |
| instances for these referenced classes are created transparently. |
| To be notified when such an event occurs, one can implement the |
| \emph on |
| VerifierFactoryObserver |
| \emph default |
| interface and let the |
| \emph on |
| VerifierFactory |
| \emph default |
| register your implementation. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 863 |
| file VerificationAPI.eps |
| width 3 100 |
| angle 90 |
| flags 1 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| UML class diagram of the Verification API |
| \end_float |
| \layout Standard |
| |
| A Verifier creates instances of PassVerifiers. |
| A PassVerifier instance in charge of performing some later verification |
| pass transparently creates PassVerifier instances for the preceding passes. |
| Therefore, users of the Verification API do not have to care about the |
| order of verification passes; i.e., earlier passes are run always before |
| later passes. |
| All verification results are cached; this way an unsual order of calls |
| to the |
| \emph on |
| doPassX() |
| \emph default |
| methods of the |
| \emph on |
| Verifier |
| \emph default |
| class does not even waste computing time. |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 631 |
| file V_API_SD.eps |
| width 3 100 |
| height 3 75 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| Informal UML sequence diagram showing the dependency of verification pass |
| two on verification pass one. |
| \end_float |
| \layout Section |
| |
| Some Example Code |
| \layout Standard |
| |
| The code below shows an example of how to use the API provided by JustIce. |
| It will verify the transitive hull of all referenced class files. |
| Normally, while verifying a class, referenced classes are recursively verified |
| performing |
| \emph on |
| earlier |
| \emph default |
| passes. |
| Verifiers that are using pass 1 on their class will not load in any other |
| classes (see section |
| \begin_inset LatexCommand \ref{SpecPasses} |
| |
| \end_inset |
| |
| ). |
| Therefore, normally the transitive hull is |
| \emph on |
| not |
| \emph default |
| verified completely (it usually does not make sense to verify it, though |
| -- it's done here only to give an example of what can be done). |
| \family typewriter |
| \size small |
| |
| \newline |
| |
| \newline |
| 01\SpecialChar ~ |
| package de.fub.bytecode.verifier; |
| \newline |
| 02\SpecialChar ~ |
| import de.fub.bytecode.verifier.*; |
| \newline |
| 03\SpecialChar ~ |
| import de.fub.bytecode.classfile.*; |
| \newline |
| 04\SpecialChar ~ |
| import de.fub.bytecode.*; |
| \newline |
| 05\SpecialChar ~ |
| /** |
| \newline |
| 06\SpecialChar ~ |
| \SpecialChar ~ |
| * This class has a main method implementing a demonstration program |
| \newline |
| 07\SpecialChar ~ |
| \SpecialChar ~ |
| * of how to use the VerifierFactoryObserver. |
| It transitively verifies |
| \newline |
| 08\SpecialChar ~ |
| \SpecialChar ~ |
| * all class files encountered; this may take up a lot of time and, |
| \newline |
| 09\SpecialChar ~ |
| \SpecialChar ~ |
| * more notably, memory. |
| |
| \newline |
| 10\SpecialChar ~ |
| \SpecialChar ~ |
| * |
| \newline |
| 11\SpecialChar ~ |
| \SpecialChar ~ |
| * @author Enver Haase |
| \newline |
| 12\SpecialChar ~ |
| \SpecialChar ~ |
| */ |
| \newline |
| 13\SpecialChar ~ |
| public class TransitiveHull implements VerifierFactoryObserver{ |
| \newline |
| 14\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| /** Used for indentation. |
| */ |
| \newline |
| 15\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| private int indent = 0; |
| \newline |
| 16\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| /** Not publicly instantiable. |
| */ |
| \newline |
| 17\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| private TransitiveHull(){ } |
| \newline |
| 18 |
| \newline |
| 19\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| /* Implementing VerifierFactoryObserver. |
| */ |
| \newline |
| 20\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| public void update(String classname){ |
| \newline |
| 21\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| for (int i=0; i<indent; i++) { |
| \newline |
| 22\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.print(" "); |
| \newline |
| 23\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 24\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println(classname); |
| \newline |
| 25\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| indent += 1; |
| \newline |
| 26\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Verifier v = VerifierFactory.getVerifier(classname); |
| \newline |
| 27\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| VerificationResult vr; |
| \newline |
| 28\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| vr = v.doPass1(); |
| \newline |
| 29\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (vr != VerificationResult.VR_OK) |
| \newline |
| 30\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println("Pass 1: |
| \backslash |
| n"+vr); |
| \newline |
| 31\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| vr = v.doPass2(); |
| \newline |
| 32\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (vr != VerificationResult.VR_OK) |
| \newline |
| 33\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println("Pass 2: |
| \backslash |
| n"+vr); |
| \newline |
| 34\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (vr == VerificationResult.VR_OK){ |
| \newline |
| 35\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| JavaClass jc = Repository.lookupClass(v.getClassName()); |
| \newline |
| 36\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| for (int i=0; i<jc.getMethods().length; i++){ |
| \newline |
| 37\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| vr = v.doPass3a(i); |
| \newline |
| 38\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (vr != VerificationResult.VR_OK) |
| \newline |
| 39\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println(v.getClassName()+", Pass 3a, method "+ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| i+" ['"+jc.getMethods()[i]+"']: |
| \backslash |
| n"+vr); |
| \newline |
| 40\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| vr = v.doPass3b(i); |
| \newline |
| 41\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (vr != VerificationResult.VR_OK) |
| \newline |
| 42\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println(v.getClassName()+", Pass 3b, method "+ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| i+" ['"+jc.getMethods()[i]+"']: |
| \backslash |
| n"+vr); |
| \newline |
| 43\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 44\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 45\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| indent -= 1; |
| \newline |
| 46\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 47 |
| \newline |
| 48\SpecialChar ~ |
| \SpecialChar ~ |
| /** |
| \newline |
| 49\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| * This method implements a demonstration program |
| \newline |
| 50\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| * of how to use the VerifierFactoryObserver. |
| It transitively |
| \newline |
| 51\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| * verifies all class files encountered; this may take up a |
| \newline |
| 52\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| * lot of time and, more notably, memory. |
| |
| \newline |
| 53\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| */ |
| \newline |
| 54\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| public static void main(String[] args){ |
| \newline |
| 55\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (args.length != 1){ |
| \newline |
| 56\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.out.println("Need exactly one argument: The root class |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| to verify."); |
| \newline |
| 57\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| System.exit(1); |
| \newline |
| 58\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 59\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int dotclasspos = args[0].lastIndexOf(".class"); |
| \newline |
| 60\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (dotclasspos != -1) |
| \newline |
| 61\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| args[0] = args[0].substring(0,dotclasspos); args[0] = |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| args[0].replace('/', '.'); |
| \newline |
| 62\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| TransitiveHull th = new TransitiveHull(); |
| \newline |
| 63\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| VerifierFactory.attach(th); |
| \newline |
| 64\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| VerifierFactory.getVerifier(args[0]); // the observer is called |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| back and does the actual trick. |
| \newline |
| 65\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| VerifierFactory.detach(th); |
| \newline |
| 66\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| 67\SpecialChar ~ |
| } |
| \newline |
| |
| \layout Standard |
| |
| |
| \size small |
| First, an instance of the |
| \emph on |
| TransitiveHull |
| \emph default |
| class is created in line 62. |
| Note that this class implements the |
| \emph on |
| VerifierFactoryObserver |
| \emph default |
| interface. |
| \layout Standard |
| |
| |
| \size small |
| A reference to the newly created instance is then passed to the |
| \emph on |
| VerifierFactory |
| \emph default |
| in line 63 by invoking its |
| \emph on |
| attach(VerifierFactoryObserver) |
| \emph default |
| method. |
| After registering the new observer, the |
| \emph on |
| VerifierFactory |
| \emph default |
| will call the instance's |
| \emph on |
| update(String) |
| \emph default |
| method (defined in lines 20-46) whenever a new |
| \emph on |
| Verifier |
| \emph default |
| instance is created. |
| \layout Standard |
| |
| |
| \size small |
| To trigger the verification, a first |
| \emph on |
| Verifier |
| \emph default |
| instance is fetched from the |
| \emph on |
| VerifierFactory |
| \emph default |
| . |
| Because it is the very first |
| \emph on |
| Verifier |
| \emph default |
| instance that is fetched, we know that it has to be newly created. |
| This is done in line 64. |
| This instance is not used in the |
| \emph on |
| main(String[]) |
| \emph default |
| method; but its creation leads to a invocation of the |
| \emph on |
| update(String) |
| \emph default |
| method which is defined in lines 20-46. |
| \layout Standard |
| |
| There, the name of the class to verify is printed (lines 21-25, line 45) |
| and the four verification passes provided by JustIce are run. |
| Note that one has to be careful not to try to verify a method that does |
| not exist. |
| JustIce would in this case throw an |
| \emph on |
| InvalidMethodException |
| \emph default |
| . |
| Therefore, after successfully verifying that the structure of the class |
| file to verify is well-formed (verification up to and including pass two, |
| lines 26-31), the number of methods is fetched from the corresponding JavaClass |
| object. |
| (It is necessary to perform verification pass two on a class file to safely |
| find out how many methods are defined in this class file.) |
| \layout Standard |
| |
| After determining the number of methods, these methods are verified performing |
| passes 3a and 3b on them (lines 32-44). |
| \layout Standard |
| |
| By applying all verification passes on some class file |
| \emph on |
| C |
| \emph default |
| , all class files referenced by |
| \emph on |
| C |
| \emph default |
| are found. |
| Therefore, new |
| \emph on |
| Verifier |
| \emph default |
| instances are created which are responsible for them. |
| Because of that, the |
| \emph on |
| update(String) |
| \emph default |
| method described above is called for every referenced class. |
| This is a recursive loop; the program terminates when there is no referenced |
| class left to be verified. |
| \layout Standard |
| |
| The example above is simple yet powerful. |
| Admittedly, it is of limited use to verify classes provided by the JVM |
| vendor; therefore one would not normally verify all the transitive hull |
| of referenced class files. |
| However, a common use is verifying all classes of a project. |
| Inserting a new line between line 20 and 21 like |
| \layout Standard |
| |
| |
| \family typewriter |
| if (!(classname.startsWith( |
| \begin_inset Quotes eld |
| \end_inset |
| |
| de.fub.bytecode.verifier |
| \begin_inset Quotes erd |
| \end_inset |
| |
| )) return; |
| \newline |
| |
| \family default |
| would easily accomplish this goal if JustIce itself is the project to verify |
| and all the project's class files are referenced by another class file |
| in the project. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{GUI_APP} |
| |
| \end_inset |
| |
| An Application Prototype |
| \layout Standard |
| |
| The API of JustIce is used to offer bytecode engineers an opportunity to |
| create their own application programs. |
| However, this dimension of configurability is often not needed. |
| \layout Standard |
| |
| JustIce comes with an application prototype which provides an easy-to-use |
| user interface. |
| Figures |
| \begin_inset LatexCommand \ref{GUI1fig} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{GUI2fig} |
| |
| \end_inset |
| |
| show screen shots of this prototype built on the JustIce verifier. |
| The boxes to the right contain verification information. |
| From the top to the bottom the boxes represent the verification passes |
| one, two, 3a and 3b and the warning messages, respectively. |
| \layout Standard |
| |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 757 |
| file GUI1.eps |
| width 3 100 |
| height 3 90 |
| angle 90 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{GUI1fig} |
| |
| \end_inset |
| |
| Verification of the Mini.MiniParser class file. |
| Verification is passed, but JustIce suggests to remove unnecessary (debug |
| information) attributes. |
| \end_float |
| \begin_float fig |
| \layout Standard |
| \align center |
| |
| \begin_inset Figure size 595 757 |
| file GUI2.eps |
| width 3 100 |
| height 3 90 |
| angle 90 |
| flags 9 |
| |
| \end_inset |
| |
| |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{GUI2fig} |
| |
| \end_inset |
| |
| Verification of the java.io.ObjectInputStream class file. |
| Verification is not passed because of an unsatisfied constraint related |
| to subroutines. |
| \end_float |
| \layout Chapter |
| |
| Conclusion |
| \layout Section |
| |
| What Was Achieved |
| \layout Standard |
| |
| About a third of the development time of JustIce was spent examining the |
| various issues in connection with subroutines, i.e., issues concerning the |
| bytecode instructions |
| \latex latex |
| |
| \backslash |
| texttt{jsr} |
| \latex default |
| , |
| \latex latex |
| |
| \backslash |
| texttt{jsr |
| \backslash |
| _w} |
| \latex default |
| and |
| \latex latex |
| |
| \backslash |
| texttt{ret} |
| \latex default |
| . |
| This led to a new definition of the term |
| \emph on |
| subroutine |
| \emph default |
| (section |
| \begin_inset LatexCommand \ref{SpecSubroutines} |
| |
| \end_inset |
| |
| ) |
| \begin_float footnote |
| \layout Standard |
| |
| A request for clarification of the subroutine issue, sent to the electronic |
| mail address |
| \family typewriter |
| jvm@java.sun.com |
| \family default |
| was not answered. |
| \end_float |
| , a new implementation of this verification area (section |
| \begin_inset LatexCommand \ref{SubroutineImpl} |
| |
| \end_inset |
| |
| ) and a discussion on the arising incompatibilities (sections |
| \begin_inset LatexCommand \ref{ComparisonSubroutines} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{StaerkJreject} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| Only a few different verifier implementations exist at all, and most of |
| them are incomplete. |
| JustIce is a complete class file verifier implementation including a bytecode |
| verifier. |
| \layout Standard |
| |
| The development of JustIce also led to improvements of the Byte Code Engineering |
| Library |
| \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} |
| |
| \end_inset |
| |
| . |
| For instance, the |
| \family typewriter |
| returnaddress |
| \family default |
| data type was introduced there. |
| It was modeled as a parameterized type. |
| Also, a programming error was repaired that led to inconsistent treatment |
| of exception handlers in the BCEL. |
| \layout Standard |
| |
| The control flow graph used by JustIce can also be used in other projects; |
| the Verification API provides access to this data structure |
| \begin_float footnote |
| \layout Standard |
| |
| A |
| \family typewriter |
| Control\SpecialChar \- |
| Flow\SpecialChar \- |
| Graph |
| \family default |
| instance can be created by invoking the |
| \emph on |
| Control\SpecialChar \- |
| Flow\SpecialChar \- |
| Graph(Method\SpecialChar \- |
| Gen) |
| \emph default |
| constructor. |
| A |
| \family typewriter |
| Method\SpecialChar \- |
| Gen |
| \family default |
| is the BCEL's representation of a method. |
| \end_float |
| . |
| Only because of the clarification of the subroutine issues could such a |
| data structure be defined statically. |
| \layout Standard |
| |
| As an Open Source project, JustIce provides algorithms which may be re-used |
| in own projects. |
| For example, every compiler targeting the JVM has to calculate the maximum |
| amount of stack memory used by a method. |
| This is also done by JustIce. |
| \layout Standard |
| |
| Finally, the need for a discussion on the meaning of |
| \emph on |
| Java security |
| \emph default |
| was identified (see section |
| \begin_inset LatexCommand \ref{LinePrincipleInfoHidingAndSecurity} |
| |
| \end_inset |
| |
| ). |
| \layout Section |
| |
| What Could Not Be Achieved |
| \layout Subsection |
| |
| A Constraint Database |
| \layout Standard |
| |
| Efforts have been made to make JustIce verifier highly configurable. |
| Unfortunately, this could not be accomplished by the author. |
| For instance, it was planned to build a constraint database which would |
| make it possible to turn on or off single checks during verification. |
| \layout Standard |
| |
| While this might be possible in some cases, in general the constraints of |
| the class file verifier are highly intertwined. |
| For instance, without a well-formed constant pool one could not run the |
| data flow analyzer in a sane way. |
| As another example, if a user preferred not to care about stack underflow |
| the verification algorithm would require complicated user interaction; |
| i.e., the user would have to decide what type to put onto the simulated operand |
| stack just before it is read. |
| \layout Standard |
| |
| One could model the interdependencies of the various constraints and allow |
| only groups of checks to be turned on or off together. |
| However, the author doubts this could be done in a way that is not prone |
| to errors and that can be validated easily. |
| \layout Standard |
| |
| This is also the reason why only one error is reported if verification fails. |
| Trying to continue verification and find more constraint violations leads |
| only to consequential verification errors. |
| \layout Standard |
| |
| JustIce implements caching of verification results. |
| If a bytecode engineer works on a class file and needs to run JustIce several |
| times against it, JustIce will cache the verification results of the recursivel |
| y referenced class files. |
| Because of this, JustIce will be fast every subsequent time it is used |
| to verify the class. |
| This minimizes the impact of the above shortcomings. |
| \layout Subsection |
| |
| A Perfect Verifier |
| \layout Standard |
| |
| JustIce does not implement a perfect verifier. |
| Some class files with code that is safe to execute are rejected. |
| Unfortunately, there has to be some degree of uncertainty concerning which |
| class files to reject. |
| \layout Standard |
| |
| The JVM performs |
| \emph on |
| initialization |
| \emph default |
| of class files after loading and verifying them without error. |
| This includes running the code in the special class initialization method |
| called |
| \emph on |
| <clinit> |
| \emph default |
| if it exists (see |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 53). |
| For the correct operation of the JVM it is important that this method does |
| not contain an infinite loop. |
| Verifying if this constraint is true is similar to the Halting Problem |
| and therefore not generally computable |
| \begin_inset LatexCommand \cite{Unknowable} |
| |
| \end_inset |
| |
| . |
| A verifier has to omit the check and pass potentially unsafe class files. |
| \layout Standard |
| |
| For another example, consider algorithm |
| \begin_inset LatexCommand \ref{StackOverflowAlgo} |
| |
| \end_inset |
| |
| below. |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{StackOverflowAlgo} |
| |
| \end_inset |
| |
| Rejected class |
| \layout Standard |
| |
| |
| \family typewriter |
| public static int always_true() |
| \layout Standard |
| |
| |
| \family typewriter |
| Code(max_stack = 1, max_locals = 1, code_length = 2) |
| \layout Standard |
| |
| |
| \family typewriter |
| 0: iconst_1\SpecialChar ~ |
| \SpecialChar ~ |
| ; push constant 1 onto stack |
| \layout Standard |
| |
| |
| \family typewriter |
| 1: ireturn\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; return constant 1 ( |
| \begin_inset Quotes eld |
| \end_inset |
| |
| true |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ) |
| \newline |
| |
| \layout Standard |
| |
| |
| \family typewriter |
| public static void good_method() |
| \layout Standard |
| |
| |
| \family typewriter |
| 0: invokestatic NewClass0.always_true ()I (18) |
| \layout Standard |
| |
| |
| \family typewriter |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Push |
| \begin_inset Quotes eld |
| \end_inset |
| |
| true |
| \begin_inset Quotes erd |
| \end_inset |
| |
| on stack |
| \layout Standard |
| |
| |
| \family typewriter |
| 3: ifne #10\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; If |
| \begin_inset Quotes eld |
| \end_inset |
| |
| true |
| \begin_inset Quotes erd |
| \end_inset |
| |
| is on stack jump to 10 |
| \layout Standard |
| |
| |
| \family typewriter |
| 6: pop \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; Pop a value off the stack |
| \layout Standard |
| |
| |
| \family typewriter |
| 7: goto #6 \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; jump to 6 |
| \layout Standard |
| |
| |
| \family typewriter |
| 10:return\SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| ; complete method |
| \end_float |
| This code is harmless, because lines 6 and 7 can never be executed (it would |
| underflow the operand stack in an infinite loop). |
| A class file with this code is rejected by JustIce and other verifiers, |
| because the endless loop seems to be a malicious threat to the integrity |
| of the JVM. |
| \layout Standard |
| |
| We conclude that there cannot be a perfect verifier. |
| All that could be done is reduce the degree of uncertainty. |
| For practical purposes, i.e., to be compatible with Sun's implementation, |
| one should not even do that. |
| \layout Standard |
| |
| There is also a simple proof showing a perfect verifier does not exist in |
| |
| \begin_inset LatexCommand \cite{JNS} |
| |
| \end_inset |
| |
| , chapter 6. |
| It uses a diagonalization argument. |
| \layout Section |
| |
| Future Work |
| \layout Standard |
| |
| Class file verification is an integral component of Java security; and applicati |
| on programs running on the Java Virtual Machine are often used in security |
| critical areas. |
| Several security holes and flaws have been found both in implementations |
| and the specification of the Java class file verifier since it was introduced. |
| \layout Standard |
| |
| Recently, the area has experienced a leap as a theoretically founded, sound |
| and complete Java environment was defined in |
| \begin_inset LatexCommand \cite{JBook} |
| |
| \end_inset |
| |
| . |
| Possibly Sun's engineers will use this work to improve Java and the Java |
| verifier. |
| JustIce will have to change to always keep close to the industry standard. |
| |
| \layout Standard |
| |
| But JustIce itself can also be improved concerning practicability, and new |
| software can be developed on top of the Verification API. |
| \layout Subsection |
| |
| Improvements to JustIce |
| \layout Subsubsection |
| |
| Introduction of Unique Identifers for Verification Results and Warning Messages |
| \layout Standard |
| |
| Currently, warning messages and verification results are conceptually text-based. |
| Only |
| \emph on |
| VerificationResult |
| \emph default |
| objects include a numeric value which programs can use to decide if some |
| class verification failed or not. |
| A program like the prototype introduced in section |
| \begin_inset LatexCommand \ref{GUI_APP} |
| |
| \end_inset |
| |
| can currently not hide specific messages from the user without parsing |
| text. |
| This limitation should be removed in the future by using unique message |
| numbers. |
| This would also make translation of the messages into other languages easier. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{NewVerificationStrategy} |
| |
| \end_inset |
| |
| A New Verification Strategy |
| \layout Standard |
| |
| The core verification algorithm cited in section |
| \begin_inset LatexCommand \ref{SunCoreAlgo} |
| |
| \end_inset |
| |
| works by generalizing the knowledge about an object type along the inheritance |
| hierarchy. |
| \layout Standard |
| |
| For instance, let there be an object of type |
| \family typewriter |
| java.util.Ab\SpecialChar \- |
| stract\SpecialChar \- |
| List |
| \family default |
| on the simulated stack of some modeled instruction. |
| Let there be a loop so that the algorithm has to visit that same instruction |
| again, this time with an object of type |
| \family typewriter |
| java.util.Ab\SpecialChar \- |
| stract\SpecialChar \- |
| Set |
| \family default |
| in that same stack slot. |
| The verifier will compute the meet of the two types and record that there |
| is some object of type |
| \family typewriter |
| java.util.Ab\SpecialChar \- |
| stract\SpecialChar \- |
| Collection |
| \family default |
| in that stack slot. |
| \layout Standard |
| |
| Remember that the instruction will be marked with a |
| \emph on |
| changed |
| \emph default |
| bit until no such re-typing change occurs any more (JustIce will actually |
| put it into a queue). |
| \layout Standard |
| |
| This approach does not work very well when it comes to interface types instead |
| of class files. |
| For example, the meet of a |
| \family typewriter |
| java.lang.In\SpecialChar \- |
| teger |
| \family default |
| and a |
| \family typewriter |
| java.lang.Doub\SpecialChar \- |
| le |
| \family default |
| is a |
| \family typewriter |
| java.lang.Num\SpecialChar \- |
| ber |
| \family default |
| because |
| \family typewriter |
| java.lang.Num\SpecialChar \- |
| ber |
| \family default |
| \emph on |
| |
| \emph default |
| is the first common super class. |
| Both classes also implement the |
| \family typewriter |
| java.lang.Com\SpecialChar \- |
| parable |
| \family default |
| interface, but |
| \family typewriter |
| java.lang.Num\SpecialChar \- |
| ber |
| \family default |
| does not. |
| This information is lost when replacing the type information. |
| However, current verifiers do not reject the class files but make additional |
| run-time checks necessary. |
| \layout Standard |
| |
| Fong noticed that this could be the reason for the |
| \latex latex |
| |
| \backslash |
| texttt{invoke\SpecialChar \- |
| interface} |
| \latex default |
| opcode to be underspecified |
| \begin_inset LatexCommand \cite{Fong2-WWW} |
| |
| \end_inset |
| |
| (also see section |
| \begin_inset LatexCommand \ref{InvokeInterfaceDescFONG} |
| |
| \end_inset |
| |
| ). |
| \layout Standard |
| |
| Stärk et al. |
| suggest the use of |
| \emph on |
| sets |
| \emph default |
| of reference types instead ( |
| \begin_inset LatexCommand \cite{JBook} |
| |
| \end_inset |
| |
| , pages 229-231). |
| This could also be implemented in JustIce. |
| \layout Subsubsection |
| |
| Keeping up with Specification Clarifications |
| \layout Standard |
| |
| As a clean-room implementation, JustIce depends on the clearness of the |
| specification. |
| Ambiguities could lead to programming errors. |
| \layout Standard |
| |
| Here we give one example: methods can be inherited in Java (for example, |
| the method |
| \emph on |
| clone() |
| \emph default |
| is declared in the |
| \family typewriter |
| java.lang.Ob\SpecialChar \- |
| ject |
| \family default |
| class and therefore inherited by every other class). |
| \layout Standard |
| |
| Let a class |
| \family typewriter |
| A |
| \family default |
| be a subclass of |
| \family typewriter |
| java.lang.Ob\SpecialChar \- |
| ject |
| \family default |
| and let class |
| \family typewriter |
| B |
| \family default |
| be a subclass of |
| \family typewriter |
| A |
| \family default |
| . |
| Also, let class |
| \family typewriter |
| B |
| \family default |
| override the definition of |
| \emph on |
| clone() |
| \emph default |
| with an own implementation. |
| \layout Standard |
| |
| If |
| \emph on |
| javac |
| \emph default |
| compiles a Java program that invokes this method, it is either referenced |
| as |
| \emph on |
| java.lang.Ob\SpecialChar \- |
| ject::clone() |
| \emph default |
| or as |
| \emph on |
| B::clone() |
| \emph default |
| . |
| However, because |
| \family typewriter |
| A |
| \family default |
| inherits this method, the reference |
| \emph on |
| A::clone() |
| \emph default |
| is legal, too. |
| \layout Standard |
| |
| In The Java Virtual Machine Specification, Second Edition ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 291) it is said that the reference must be a |
| \begin_inset Quotes eld |
| \end_inset |
| |
| symbolic reference to the class in which the method is to be found |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| Statically, the method |
| \emph on |
| clone() |
| \emph default |
| can of course not be found in class |
| \family typewriter |
| A |
| \family default |
| . |
| One could therefore think the reference |
| \emph on |
| A::clone() |
| \emph default |
| was not legal. |
| \layout Standard |
| |
| In the meanwhile, Sun's engineer Gilad Bracha clarified this issue: |
| \begin_inset Quotes eld |
| \end_inset |
| |
| Of course. |
| This is discussed in JVMS 5.4.3.4, which describes interface method resolution. |
| I don't see the text on page 280 as contradicting that. |
| The symbolic reference does give an interface in which the required method |
| can be found, albeit as an inherited member. |
| We could try and reword it in a more precise way, to eliminate any misunderstan |
| dings. |
| \begin_inset Quotes erd |
| \end_inset |
| |
| |
| \layout Standard |
| |
| Keeping up with clarifications like this is an inevitable and on-going part |
| of the development of JustIce. |
| \layout Subsubsection |
| |
| Keeping up with Java Extensions |
| \layout Standard |
| |
| Recently, Sun Microsystems introduced a new attribute: the |
| \family typewriter |
| StackMap |
| \family default |
| attribute which is an attribute local to the |
| \family typewriter |
| Code |
| \family default |
| attribute (see section |
| \emph on |
| |
| \begin_inset LatexCommand \ref{CodeAttribute} |
| |
| \end_inset |
| |
| |
| \emph default |
| ). |
| It was specified in |
| \begin_inset LatexCommand \cite{J2ME-CLDCS} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| It is there to provide |
| \begin_inset Quotes eld |
| \end_inset |
| |
| limited devices |
| \begin_inset Quotes erd |
| \end_inset |
| |
| that perform a one-pass verification with type information that would normally |
| have to be inferred by the verifier. |
| \layout Standard |
| |
| It is not used by the verification algorithm of JustIce now: it's currently |
| an |
| \emph on |
| unknown attribute |
| \emph default |
| to JustIce. |
| \layout Subsubsection |
| |
| Detecting Local Variable Accesses out of Scope |
| \layout Standard |
| |
| The |
| \family typewriter |
| LocalVariableTable |
| \family default |
| attribute is a debug information attribute. |
| Basically, it gives debuggers information about the original (source code) |
| name and type of a given local variable. |
| \layout Standard |
| |
| JustIce builds data structures to warn if it detects contradicting and overlappi |
| ng areas; e.g., if some local variable is anounced to carry an |
| \family typewriter |
| int |
| \family default |
| value and a |
| \family typewriter |
| float |
| \family default |
| value at the same time. |
| \layout Standard |
| |
| It could also be interesting to warn if a local variable is accessed for |
| which no debug information exists. |
| This is currently not implemented. |
| \layout Subsubsection |
| |
| Extending the Verification API |
| \layout Standard |
| |
| JustIce can easily be extended to run certain analyses related to symbolic |
| bytecode execution. |
| \layout Standard |
| |
| This includes the computation of the maximum number of used operand stack |
| slots in a method or the computation of unused local variables in a method. |
| \layout Standard |
| |
| These analyses are normally costly to implement |
| \begin_float footnote |
| \layout Standard |
| |
| Often, heuristics are used such as the method MethodGen.getMaxStack() in |
| the BCEL |
| \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} |
| |
| \end_inset |
| |
| . |
| \end_float |
| , but they are a waste product of the verifier's core algorithm. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{VerifierValidationSuite} |
| |
| \end_inset |
| |
| A Verifier Validation Suite |
| \layout Standard |
| |
| The Kimera project |
| \begin_inset LatexCommand \cite{Kimera-WWW} |
| |
| \end_inset |
| |
| was the first known project to implement a stand-alone Java verifier. |
| The people behind the project had to test the behaviour of their verifier |
| against the behaviour of the previous implementations. |
| Tests have been run in order to validate the Kimera verifier. |
| These tests range from simply introducing random one-byte errors into class |
| files and automatically running Kimera against other verifiers to elaborate |
| research work |
| \begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| Currently, JustIce comes only with a very limited possibility of running |
| test cases against the native verifier of the host machine's JVM. |
| The pioneering work of the Kimera project could be used to implement a |
| validation suite for JustIce. |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{Firewall} |
| |
| \end_inset |
| |
| A Verifier Protecting an Intranet |
| \layout Standard |
| |
| Often, Java Virtual Machines are built into software used to browse the |
| World Wide Web such as the KDE project's |
| \emph on |
| Konqueror |
| \begin_inset LatexCommand \cite{KDE} |
| |
| \end_inset |
| |
| |
| \emph default |
| or Mozilla.org's |
| \emph on |
| Mozilla |
| \emph default |
| |
| \begin_inset LatexCommand \cite{Mozilla} |
| |
| \end_inset |
| |
| products. |
| Such Internet technology is also often used in corporate networks. |
| Corporate networks based on internet technology are called |
| \emph on |
| intranets |
| \emph default |
| ; these networks are normally protected from the Internet by a so-called |
| |
| \emph on |
| firewall |
| \emph default |
| computer. |
| |
| \layout Standard |
| |
| This computer's task is to provide access to the internet only to privileged |
| employees and --even more important-- it blocks access from unauthorized |
| persons outside the intranet. |
| The firewall machine is a single, bi-directional point of access. |
| \layout Standard |
| |
| However, normally web-browsing is considered harmless, so that the employees |
| can unrestrictedly gather information, possibly visiting Java-enabled web |
| sites. |
| The JVMs built into the browser software run software downloaded from the |
| World Wide Web; while the the built-in verifiers make sure that no dangerous |
| code can be executed. |
| \layout Standard |
| |
| Let us assume someone discovered a security hole in the verifier implementation |
| or implementations that are used on the corporate network's workstations; |
| let us also assume a patch exists that would fix the problem. |
| |
| \layout Standard |
| |
| A system administrator would have to spent a lot of time to repair every |
| single verifier. |
| A cheaper solution would be a verifier built into the firewall machine; |
| such a verifier can easily be implemented using JustIce and its Verification |
| API. |
| \layout Subsection |
| |
| A Java Virtual Machine Implementation Using JustIce |
| \layout Standard |
| |
| The Java verifier is originally a part of the Java Virtual Machine. |
| JustIce could also be part of a Java Virtual Machine. |
| JustIce's class files (the program code JustIce consists of) could simply |
| be integrated into the core Java class files. |
| The execution engine would then run JustIce without actually verifying |
| JustIce's class files themselves. |
| |
| \layout Standard |
| |
| For scientific purposes one could also implement a JVM in the Java programming |
| language. |
| Such an implementation could, for example, serve as a debugger. |
| \layout Subsection |
| |
| |
| \begin_inset LatexCommand \label{LinePrincipleInfoHidingAndSecurity} |
| |
| \end_inset |
| |
| Drawing a Clear Line Between the Principle of Information Hiding and Security |
| \layout Standard |
| |
| The principle of information hiding has been (and still is!) a practice |
| of experienced programmers for many years. |
| It is there to reduce programming errors. |
| \layout Standard |
| |
| In the Modula-2 programming language |
| \begin_inset LatexCommand \cite{M2} |
| |
| \end_inset |
| |
| this is achieved by explicitely dividing the program code in definition |
| modules and implementation modules. |
| In older programming languages, such as in the C programming language |
| \begin_inset LatexCommand \cite{C} |
| |
| \end_inset |
| |
| , this principle is implicitely used, too. |
| Basically this is achieved by defining interfaces that only describe what |
| the code of a program module does. |
| These interface |
| \begin_inset Quotes eld |
| \end_inset |
| |
| headers |
| \begin_inset Quotes erd |
| \end_inset |
| |
| are included into user code instead of simply including the code itself. |
| |
| \layout Standard |
| |
| In object-oriented programming languages such as in Delphi |
| \begin_inset LatexCommand \cite{D3} |
| |
| \end_inset |
| |
| , C++ |
| \begin_inset LatexCommand \cite{CPP-D,CPP-E} |
| |
| \end_inset |
| |
| or Java |
| \begin_inset LatexCommand \cite{langspec2} |
| |
| \end_inset |
| |
| , this principle is refined to what is called object encapsulation. |
| When a class is defined, certain key words such as |
| \family typewriter |
| private |
| \family default |
| , |
| \family typewriter |
| protected |
| \family default |
| , |
| \family typewriter |
| friend |
| \family default |
| , |
| \family typewriter |
| public |
| \family default |
| , |
| \family typewriter |
| published |
| \family default |
| set the access rules for the members |
| \begin_float footnote |
| \layout Standard |
| |
| The members of a class are its components: methods (program code) and fields |
| (also called attributes or variables). |
| \end_float |
| of an object of the given class. |
| \layout Standard |
| |
| Still, this refined technique does not have anything to do with security. |
| It is only there to aid programmers create a reasonable design. |
| If every piece of code could manipulate every data structure, one would |
| not know where to look for a programming error in the program source code. |
| On the other hand, if some field is private in C++, one could (with some |
| knowledge about the compiler used) still reference and modify this field |
| by pointer manipulation. |
| In addition to that, a second program like a debugger could watch even |
| the data of private fields. |
| \layout Standard |
| |
| However, when a Java program is compiled into the language of the JVM, the |
| information about the access rights of the fields and methods is included. |
| This is where the principle of information hiding is exploited to provide |
| security. |
| For example, the verifier of the JVM has to make sure private fields are |
| never accessed from a foreign piece of code. |
| But there are many implementations of the JVM which have security flaws |
| such as not honouring the access rights. |
| There are debuggers for JVM bytecodes, too. |
| \layout Standard |
| |
| When one thinks about security, one has to think of some enemy who could |
| try to harm the computer or information stored on that computer. |
| From a JVM user's point of view, the JVM is relatively secure. |
| Even running untrusted code cannot do much harm. |
| Because the security flaws in different JVM implementations differ, they |
| are probably not exploited most times. |
| \layout Standard |
| |
| From a Java programmer's point of view, the JVM is not secure. |
| Untrusted users can do much harm. |
| For example, an online banking application storing important data in Java |
| fields (such as access information to the bank's database management system) |
| is a threat to both the bank and its customers. |
| This information could easily be extracted by a malicious user. |
| \layout Standard |
| |
| Another problem for Java programmers is the amount of symbolical information |
| stored in class files. |
| Today, it is easy to de-compile a Java class file back to Java language |
| source code |
| \begin_inset LatexCommand \cite{JODE-WWW} |
| |
| \end_inset |
| |
| . |
| This source code can then be read and analyzed by the user. |
| Facing this problem, the |
| \begin_inset Quotes eld |
| \end_inset |
| |
| only safe course of action is to assume that ALL Java code will at some |
| point be decompiled |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ( |
| \begin_inset LatexCommand \cite{JNS} |
| |
| \end_inset |
| |
| , page 68). |
| \layout Standard |
| |
| We conclude that the principle of information hiding is not enough to provide |
| a degree of security that both --users and programmers-- could accept. |
| Programmers should not believe a good design makes a program |
| \emph on |
| secure |
| \emph default |
| . |
| |
| \layout Chapter |
| |
| Appendix |
| \layout Section |
| |
| History of JustIce |
| \layout Standard |
| |
| The author of JustIce once started to implement a class file decompiler |
| like Jode |
| \begin_inset LatexCommand \cite{JODE-WWW} |
| |
| \end_inset |
| |
| . |
| It soon became clear that to successfully implement it, one should exploit |
| the |
| \begin_inset Quotes eld |
| \end_inset |
| |
| well-behaved |
| \begin_inset Quotes erd |
| \end_inset |
| |
| property of class files (which essentially means that they pass a verifier, |
| especially pass three) |
| \begin_inset LatexCommand \cite{Krakatoa-WWW} |
| |
| \end_inset |
| |
| . |
| |
| \layout Standard |
| |
| JustIce was then developed to understand the |
| \begin_inset Quotes eld |
| \end_inset |
| |
| well-behaved |
| \begin_inset Quotes erd |
| \end_inset |
| |
| property of usual class files. |
| It took much longer to complete than estimated because of the many inherent |
| bugs and ambiguities in The Java Virtual Machine Specification, Second |
| Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| Its name starts with a |
| \emph on |
| J |
| \emph default |
| like Java does, referring to the tradition of giving Java-related software |
| such names. |
| The second part of the name, |
| \emph on |
| ICE |
| \emph default |
| , was inspired by a novel by William Gibson |
| \begin_inset LatexCommand \cite{Neuromancer} |
| |
| \end_inset |
| |
| . |
| It is an acronym for |
| \emph on |
| Intrusion Countermeasures Electronics |
| \emph default |
| , something that is very much like today's firewall systems (see section |
| |
| \begin_inset LatexCommand \ref{Firewall} |
| |
| \end_inset |
| |
| ). |
| He credits the invention of |
| \emph on |
| ICE |
| \emph default |
| to Tom Maddox. |
| The missing three letters were inserted to create a word that makes sense; |
| in fact, choosing the three-letter combination |
| \emph on |
| ust |
| \emph default |
| resulted in the creation of a word with a double sense via bi-capitalization. |
| \layout Standard |
| |
| JustIce was written using and extending the excellent Byte Code Engineering |
| Library |
| \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} |
| |
| \end_inset |
| |
| by Markus Dahm. |
| It really helped a lot and sped up development time. |
| \layout Standard |
| |
| It was also --last but not least-- written to earn its author a German |
| \emph on |
| Dipl.-Inform. |
| |
| \emph default |
| degree which one may compare to a |
| \emph on |
| master |
| \emph default |
| degree. |
| \layout Section |
| |
| Flaws and Ambiguities Encountered |
| \layout Standard |
| |
| While designing, implementing and testing JustIce, a lot of interesting |
| flaws and ambiguities were found in the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , the Java compiler |
| \emph on |
| javac |
| \emph default |
| and the JVM |
| \emph on |
| java |
| \emph default |
| . |
| \layout Subsection |
| |
| Flaws in the Java Virtual Machine Specification |
| \layout Standard |
| |
| The Java Virtual Machine Specification, Second Edition was derived from |
| an in-house document describing the as-is implementation of Sun's genuine |
| Java Virtual Machine ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page xiv). |
| This sometimes leads to problems as there are still a few points left where |
| Sun's engineers forgot to describe specification details to the public, |
| in error assuming they would be implementation details. |
| Another source of mistakes are ambiguities, inherent to natural languages |
| auch as English. |
| \layout Subsubsection |
| |
| A Code Length Maximum of 65535 Bytes per Method |
| \layout Standard |
| |
| On page 152, The Java Virtual Machine Specification, Second Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| says that code arrays may at most have a length of 65536 bytes because |
| certain indices that point into the code are only 16 bits of width. |
| Page 134 states the code must have |
| \begin_inset Quotes gld |
| \end_inset |
| |
| less than |
| \begin_inset Quotes grd |
| \end_inset |
| |
| 65536 bytes. |
| Therefore, the limitation stated on page 152 is not helpful, but only confusing. |
| \layout Subsubsection |
| |
| Subroutines |
| \layout Standard |
| |
| The implementation of a provably correct verifier is not possible because |
| of the ambiguities in the specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| To reach this goal, various efforts have been made to describe the verifier |
| and the JVM formally |
| \begin_inset LatexCommand \cite{Qian,StataAbadi,FreundMitchell,JBook,JPaper} |
| |
| \end_inset |
| |
| . |
| By restricting the code |
| \emph on |
| javac |
| \emph default |
| produces or by redefining the verifier's behaviour, however, they are never |
| one-to-one with the behaviour of the existing JVMs. |
| \layout Standard |
| |
| Sun's specification does not define the term |
| \emph on |
| subroutine |
| \emph default |
| although it is used. |
| Instead, it is explained what bytecode the Java |
| \emph on |
| compiler |
| \emph default |
| generates when a |
| \family typewriter |
| finally |
| \family default |
| clause appears in the Java |
| \emph on |
| language |
| \emph default |
| source code -- this definitely does not belong there, because a verifier |
| must never assume the code it verifies was created by Sun's |
| \emph on |
| javac |
| \emph default |
| compiler. |
| \layout Standard |
| |
| Clarifying this issue could lead to an |
| \emph on |
| official |
| \emph default |
| formal specification. |
| \layout Subsubsection |
| |
| The Specification Sometimes Satisfies the Verifier |
| \layout Standard |
| |
| |
| \begin_inset LatexCommand \label{InvokeInterfaceDescFONG} |
| |
| \end_inset |
| |
| Fong |
| \begin_inset LatexCommand \cite{Fong2-WWW} |
| |
| \end_inset |
| |
| found in 1997 that the |
| \family typewriter |
| invokeinterface |
| \family default |
| opcode was underspecified in the first edition of the Java Virtual Machine |
| Specification. |
| He managed to create a class file that did not implement a specific interface |
| but nevertheless used |
| \family typewriter |
| invokeinterface |
| \family default |
| to invoke a method. |
| This class file passed the verifier (up to pass three), but the JVM found |
| the problem during run-time (pass four). |
| Fong concluded that the omission in the specification was done on purpose |
| because the implementation of the data flow analyzer does not allow to |
| check this constraint (please see section |
| \begin_inset LatexCommand \ref{NewVerificationStrategy} |
| |
| \end_inset |
| |
| for a description of how this limitation could be overcome). |
| However, in The Java Virtual Machine Specification, Second Edition |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , the specification of |
| \family typewriter |
| invokeinterface |
| \family default |
| is corrected. |
| \layout Standard |
| |
| Still, there is another case where one would suspect the specification describes |
| the behaviour of the verifier: on pages 147 and 148 of the specification |
| |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , verification of instance initialization methods and newly created objects |
| is explained. |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| A valid instruction sequence must not have an uninitialized object on the |
| operand stack or in a local variable during a backwards branch, or in a |
| local variable in code protected by an exception handler or a |
| \family typewriter |
| finally |
| \family default |
| clause |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| Note that the Java language keyword |
| \family typewriter |
| finally |
| \family default |
| does not really belong here (Sun should speak of |
| \emph on |
| subroutines |
| \emph default |
| ), but more important is that this specification is made to satisfy the |
| verification algorithm: |
| \begin_inset Quotes eld |
| \end_inset |
| |
| Otherwise, a devious piece of code might fool the verifier |
| \begin_inset Quotes erd |
| \end_inset |
| |
| . |
| |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{InnerBug} |
| |
| \end_inset |
| |
| The '$' Character as a Valid Part of a Java Name |
| \layout Standard |
| |
| Because the |
| \emph on |
| javac |
| \emph default |
| compiler may create class files with a '$' character in their names as |
| a result of Java source files defining inner classes, this character should |
| no longer be a valid part of a Java name to avoid problems. |
| I.e., the method invocation |
| \emph on |
| ja\SpecialChar \- |
| va.lang.Cha\SpecialChar \- |
| rac\SpecialChar \- |
| ter.is\SpecialChar \- |
| Ja\SpecialChar \- |
| va\SpecialChar \- |
| Iden\SpecialChar \- |
| tifier\SpecialChar \- |
| Part('$'); |
| \emph default |
| should return the value |
| \family typewriter |
| false |
| \family default |
| . |
| \layout Subsection |
| |
| Flaws in the Implementation of the |
| \emph on |
| Java Platform |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{javacRejected} |
| |
| \end_inset |
| |
| Sun's Verifier Rejects Code Produced by Sun's Compiler |
| \layout Standard |
| |
| Surprisingly, there are a number of examples in which such a thing happens. |
| \layout Paragraph |
| |
| |
| \begin_inset LatexCommand \label{StaerkJreject} |
| |
| \end_inset |
| |
| Another Problem With Subroutines |
| \layout Standard |
| |
| In |
| \begin_inset LatexCommand \cite{JPaper} |
| |
| \end_inset |
| |
| , Stärk and Schmid give a few code examples which are compiled correctly |
| by the |
| \emph on |
| javac |
| \emph default |
| compiler but the resulting code is rejected by the traditional verifiers. |
| Algorithms |
| \begin_inset LatexCommand \ref{StaerkJLang} |
| |
| \end_inset |
| |
| and |
| \begin_inset LatexCommand \ref{StaerkJByteCode} |
| |
| \end_inset |
| |
| show one of their examples given in the Java programming language and the |
| resulting output of the |
| \emph on |
| javac |
| \emph default |
| compiler. |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{StaerkJLang} |
| |
| \end_inset |
| |
| Stärk and Schmid's Rejected Class, Java Language Version |
| \layout Standard |
| |
| |
| \family typewriter |
| class Test1{ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int test(boolean b){ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| int i; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| try{ |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (b) return 1; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| i=2; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| finally { |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| if (b) i = 3; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| return i; |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \newline |
| \SpecialChar ~ |
| \SpecialChar ~ |
| \SpecialChar ~ |
| } |
| \end_float |
| \layout Standard |
| |
| \begin_float alg |
| \layout Caption |
| |
| |
| \begin_inset LatexCommand \label{StaerkJByteCode} |
| |
| \end_inset |
| |
| Stärk and Schmid's Rejected Class, JVM Bytecode Version |
| \layout Standard |
| |
| |
| \family typewriter |
| int test(boolean arg1) |
| \layout Standard |
| |
| |
| \family typewriter |
| Code(max_stack = 1, max_locals = 6, code_length = 39) |
| \layout Standard |
| |
| |
| \family typewriter |
| 0: iload_1 |
| \layout Standard |
| |
| |
| \family typewriter |
| 1: ifeq #11 |
| \layout Standard |
| |
| |
| \family typewriter |
| 4: iconst_1 |
| \layout Standard |
| |
| |
| \family typewriter |
| 5: istore_3 |
| \layout Standard |
| |
| |
| \family typewriter |
| 6: jsr #27 |
| \layout Standard |
| |
| |
| \family typewriter |
| 9: iload_3 |
| \layout Standard |
| |
| |
| \family typewriter |
| 10: ireturn |
| \layout Standard |
| |
| |
| \family typewriter |
| 11: iconst_2 |
| \layout Standard |
| |
| |
| \family typewriter |
| 12: istore_2 |
| \layout Standard |
| |
| |
| \family typewriter |
| 13: jsr #27 |
| \layout Standard |
| |
| |
| \family typewriter |
| 16: goto #37 |
| \layout Standard |
| |
| |
| \family typewriter |
| 19: astore %4 |
| \layout Standard |
| |
| |
| \family typewriter |
| 21: jsr #27 |
| \layout Standard |
| |
| |
| \family typewriter |
| 24: aload %4 |
| \layout Standard |
| |
| |
| \family typewriter |
| 26: athrow |
| \layout Standard |
| |
| |
| \family typewriter |
| 27: astore %5 |
| \layout Standard |
| |
| |
| \family typewriter |
| 29: iload_1 |
| \layout Standard |
| |
| |
| \family typewriter |
| 30: ifeq #35 |
| \layout Standard |
| |
| |
| \family typewriter |
| 33: iconst_3 |
| \layout Standard |
| |
| |
| \family typewriter |
| 34: istore_2 |
| \layout Standard |
| |
| |
| \family typewriter |
| 35: ret %5 |
| \layout Standard |
| |
| |
| \family typewriter |
| 37: iload_2 |
| \layout Standard |
| |
| |
| \family typewriter |
| 38: ireturn |
| \end_float |
| If one tries to run this bytecode using a JVM by IBM Corporation, the code |
| is rejected |
| \begin_float footnote |
| \layout Standard |
| |
| It is also rejected by Sun's JVMs and the Kimera verifier |
| \begin_inset LatexCommand \cite{Kimera-WWW} |
| |
| \end_inset |
| |
| . |
| \end_float |
| : |
| \newline |
| |
| \family typewriter |
| ehaase@haneman:/home/ehaase > java Test1 |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Exception in thread "main" java.lang.VerifyError: |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| (class: Test1, method: test signature: (Z)I) |
| \newline |
| \SpecialChar \- |
| \SpecialChar ~ |
| \SpecialChar ~ |
| Localvariable 2 contains wrong type |
| \newline |
| |
| \newline |
| |
| \family default |
| In his lectures, Stärk explains that the problem lies in the polymorphic |
| nature of JVM subroutines |
| \begin_inset LatexCommand \cite{JLectures} |
| |
| \end_inset |
| |
| . |
| Consider algorithm |
| \begin_inset LatexCommand \ref{StaerkJByteCode} |
| |
| \end_inset |
| |
| . |
| In line 12, an |
| \family typewriter |
| int |
| \family default |
| is put into local variable number 2. |
| The subroutine starting at line 27 is then called from line number 13. |
| Note that this subroutine accesses the local variable number 2. |
| Finally, line 16 transfers control to line 37 where the verification problem |
| occurs. |
| An |
| \family typewriter |
| int |
| \family default |
| should be read from local variable number 2, but this is marked |
| \family typewriter |
| unusable |
| \family default |
| , because it was accessed in the subroutine. |
| \layout Standard |
| |
| However, the specification ( |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| , page 151) states: |
| \layout Itemize |
| |
| For any local variable that [\SpecialChar \ldots{} |
| ] has been accessed or modified by the subroutine, |
| use the type of the local variable at the time of the |
| \family typewriter |
| ret |
| \family default |
| . |
| \layout Itemize |
| |
| For any other local variables, use the type of the local variable before |
| the |
| \family typewriter |
| jsr |
| \family default |
| instruction. |
| \layout Standard |
| |
| As one can see, in the above example local variable number 2 holds an |
| \family typewriter |
| int |
| \family default |
| data type in both cases; there is no need to mark it |
| \family typewriter |
| unusable |
| \family default |
| . |
| This is the reason why JustIce does not reject the above bytecode, thus |
| being slightly incompatible with the behaviour of other verifiers. |
| \layout Paragraph |
| |
| The Maximum Method Length May Be Exceeded |
| \layout Standard |
| |
| The |
| \emph on |
| javac |
| \emph default |
| compiler Sun included in the Java Development Kit version 1.3.0_01 does not |
| check for the maximum method length of the |
| \family typewriter |
| code |
| \family default |
| array in a |
| \family typewriter |
| Code |
| \family default |
| attribute (see section |
| \begin_inset LatexCommand \ref{CodeAttribute} |
| |
| \end_inset |
| |
| ). |
| A test file containing 65000 lines like |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \family typewriter |
| Sys\SpecialChar \- |
| tem.out.println( |
| \begin_inset Quotes eld |
| \end_inset |
| |
| Test |
| \begin_inset Quotes erd |
| \end_inset |
| |
| ); |
| \family default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| was compiled, but the resulting class file was rejected by the verifier. |
| \layout Standard |
| |
| IBM Corporation's |
| \emph on |
| jikes |
| \emph default |
| compiler does not even generate code, but it locks up while compiling the |
| test file. |
| \layout Subsubsection |
| |
| A Compiler Issue Related to Inner Classes |
| \layout Standard |
| |
| The |
| \emph on |
| javac |
| \emph default |
| compiler has to name class files, even those of so-called anonymous classes |
| |
| \begin_inset LatexCommand \cite{InnerSpec} |
| |
| \end_inset |
| |
| . |
| \layout Standard |
| |
| This can cause problems: an inner class |
| \emph on |
| I |
| \emph default |
| defined in a class |
| \emph on |
| A |
| \emph default |
| will be compiled into a class file called |
| \emph on |
| A$I.class |
| \emph default |
| . |
| A Java class named |
| \emph on |
| A$I |
| \emph default |
| will also be compiled into a class file named |
| \emph on |
| A$I.class |
| \emph default |
| overwriting the former class file. |
| Because Sun did not forbid the ' |
| \emph on |
| $ |
| \emph default |
| ' character as a legal part of a Java identifier, the |
| \emph on |
| javac |
| \emph default |
| compiler should use a more sophisticated naming scheme. |
| \layout Subsubsection |
| |
| |
| \begin_inset LatexCommand \label{PassFourBug} |
| |
| \end_inset |
| |
| Pass Four is Only Partially Implemented |
| \layout Standard |
| |
| Pass four defines run-time tests for constraints that could also be verified |
| in pass three; it is only for performance reasons that these tests are |
| delayed. |
| Instead of having all the tests in one place, they are unnecessarily spread |
| |
| \begin_inset Quotes eld |
| \end_inset |
| |
| making the validation of the verification algorithm itself extremely difficult |
| \begin_inset Quotes erd |
| \end_inset |
| |
| |
| \begin_inset LatexCommand \cite{Fong-WWW} |
| |
| \end_inset |
| |
| . |
| Risking security for better performance is often regarded as a bad decision. |
| For instance, in the |
| \layout Standard |
| |
| |
| \family typewriter |
| java version "1.3.0_01" |
| \layout Standard |
| |
| |
| \family typewriter |
| Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0_01) |
| \layout Standard |
| |
| |
| \family typewriter |
| Java HotSpot(TM) Client VM (build 1.3.0_01, mixed mode) |
| \layout Standard |
| |
| Java Virtual Machine, the pass four check for access rights was unintentionally |
| omitted. |
| Sadly, other vendors license Sun's code and base their own implementations |
| on that code. |
| Therefore, mistakes are often inherited throughout the JVM vendors. |
| The |
| \layout Standard |
| |
| |
| \family typewriter |
| java version "1.3.0" |
| \layout Standard |
| |
| |
| \family typewriter |
| Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0) |
| \layout Standard |
| |
| |
| \family typewriter |
| Classic VM (build 1.3.0, J2RE 1.3.0 IBM build cx130-20010626 (JIT enabled: jitc)) |
| \layout Standard |
| |
| Java Virtual Machine by IBM Corporation, for example, exposes the same mistake. |
| \layout Section |
| |
| Related Work |
| \layout Subsection |
| |
| The Kimera Project |
| \layout Standard |
| |
| It is a misfortune that the Kimera |
| \begin_inset LatexCommand \cite{Kimera-WWW} |
| |
| \end_inset |
| |
| project closed the World Wide Web presence and that the source code of |
| the Kimera verifier was never released -- it would have been quite interesting |
| to see how that respected verifier implementation deals with the problems |
| arising concerning subroutine verification. |
| \layout Standard |
| |
| However, Kimera is the single other stand-alone verifier besides JustIce |
| the author knows of. |
| The people behind the project found important security breaches in JVM |
| implementations of various World Wide Web browsers. |
| \layout Standard |
| |
| Also, they validated their verifier implementation and published several |
| papers on JVM implementation verification |
| \begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} |
| |
| \end_inset |
| |
| . |
| \layout Subsection |
| |
| The Verifier by Stärk, Schmid and Börger |
| \layout Standard |
| |
| In |
| \begin_inset LatexCommand \cite{JBook} |
| |
| \end_inset |
| |
| , the authors define the Java programming language and the Java virtual |
| machine formally using |
| \emph on |
| Abstract State Machines |
| \emph default |
| (ASM). |
| This also includes the verifier; its specifications have also been implemented |
| in the functional programming language AsmGofer |
| \begin_inset LatexCommand \cite{AsmGofer} |
| |
| \end_inset |
| |
| . |
| This implementation is included on the CD-ROM that accompanies the book. |
| \layout Standard |
| |
| The |
| \begin_inset Quotes eld |
| \end_inset |
| |
| |
| \emph on |
| JBook verifier |
| \emph default |
| |
| \begin_inset Quotes erd |
| \end_inset |
| |
| does not implement a complete class file verifier. |
| It currently only implements the bytecode verification. |
| Its input files are not class files itself, but a textual representation |
| of class files in so-called Jasmin format |
| \begin_inset LatexCommand \cite{JVM} |
| |
| \end_inset |
| |
| . |
| Therefore, this implementation is merely of theoretical interest. |
| \layout Standard |
| |
| It does, however, implement a bytecode verifier that is founded on a |
| \emph on |
| solid |
| \emph default |
| theory. |
| This theory could become the standard for the interpretation of the JVM |
| specification |
| \begin_inset LatexCommand \cite{vmspec2} |
| |
| \end_inset |
| |
| . |
| It could even change the specification to remove its ambiguities. |
| \layout Standard |
| |
| There is also an unreleased version of this verifier implemented in the |
| Java programming language using the BCEL. |
| This implementation, if it should ever be released, promises a lot as it |
| could combine usability and a solid theory. |
| \layout Section |
| |
| |
| \begin_inset LatexCommand \label{GPL} |
| |
| \end_inset |
| |
| The GNU General Public License |
| \layout Standard |
| |
| |
| \emph on |
| GNU GENERAL PUBLIC LICENSE |
| \layout Standard |
| |
| Version 2, June 1991 |
| \layout Standard |
| |
| Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
| \layout Standard |
| |
| 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| \layout Standard |
| |
| Everyone is permitted to copy and distribute verbatim copies of this license |
| document, but changing it is not allowed. |
| \layout Standard |
| |
| |
| \emph on |
| Preamble |
| \layout Standard |
| |
| The licenses for most software are designed to take away your freedom to |
| share and change it. |
| By contrast, the GNU General Public License is intended to guarantee your |
| freedom to share and change free software--to make sure the software is |
| free for all its users. |
| This General Public License applies to most of the Free Software Foundation's |
| software and to any other program whose authors commit to using it. |
| (Some other Free Software Foundation software is covered by the GNU Library |
| General Public License instead.) You can apply it to your programs, too.When |
| we speak of free software, we are referring to freedom, not price. |
| Our General Public Licenses are designed to make sure that you have the |
| freedom to distribute copies of free software (and charge for this service |
| if you wish), that you receive source code or can get it if you want it, |
| that you can change the software or use pieces of it in new free programs; |
| and that you know you can do these things. |
| \layout Standard |
| |
| To protect your rights, we need to make restrictions that forbid anyone |
| to deny you these rights or to ask you to surrender the rights. |
| \layout Standard |
| |
| These restrictions translate to certain responsibilities for you if you |
| distribute copies of the software, or if you modify it. |
| For example, if you distribute copies of such a program, whether gratis |
| or for a fee, you must give the recipients all the rights that you have. |
| You must make sure that they, too, receive or can get the source code. |
| And you must show them these terms so they know their rights. |
| \layout Standard |
| |
| We protect your rights with two steps: |
| \layout Standard |
| |
| (1) copyright the software, and |
| \layout Standard |
| |
| (2) offer you this license which gives you legal permission to copy, distribute |
| and/or modify the software. |
| \layout Standard |
| |
| Also, for each author's protection and ours, we want to make certain that |
| everyone understands that there is no warranty for this free software. |
| If the software is modified by someone else and passed on, we want its |
| recipients to know that what they have is not the original, so that any |
| problems introduced by others will not reflect on the original authors' |
| reputations. |
| \layout Standard |
| |
| Finally, any free program is threatened constantly by software patents. |
| We wish to avoid the danger that redistributors of a free program will |
| individually obtain patent licenses, in effect making the program proprietary. |
| To prevent this, we have made it clear that any patent must be licensed |
| for everyone's free use or not licensed at all. |
| \layout Standard |
| |
| The precise terms and conditions for copying, distribution and modification |
| follow. |
| \layout Standard |
| |
| |
| \emph on |
| GNU GENERAL PUBLIC LICENSE |
| \layout Standard |
| |
| |
| \emph on |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
| \layout Standard |
| |
| 0. |
| This License applies to any program or other work which contains a notice |
| placed by the copyright holder saying it may be distributed under the terms |
| of this General Public License. |
| The "Program", below, refers to any such program or work, and a "work based |
| on the Program" means either the Program or any derivative work under copyright |
| law: that is to say, a work containing the Program or a portion of it, |
| either verbatim or with modifications and/or translated into another language. |
| (Hereinafter, translation is included without limitation in the term "modificat |
| ion".) Each licensee is addressed as "you". |
| Activities other than copying, distribution and modification are not covered |
| by this License; they are outside its scope. |
| The act of running the Program is not restricted, and the output from the |
| Program is covered only if its contents constitute a work based on the |
| Program (independent of having been made by running the Program). |
| Whether that is true depends on what the Program does. |
| \layout Standard |
| |
| 1. |
| You may copy and distribute verbatim copies of the Program's source code |
| as you receive it, in any medium, provided that you conspicuously and appropria |
| tely publish on each copy an appropriate copyright notice and disclaimer |
| of warranty; keep intact all the notices that refer to this License and |
| to the absence of any warranty; and give any other recipients of the Program |
| a copy of this License along with the Program. |
| You may charge a fee for the physical act of transferring a copy, and you |
| may at your option offer warranty protection in exchange for a fee. |
| \layout Standard |
| |
| 2. |
| You may modify your copy or copies of the Program or any portion of it, |
| thus forming a work based on the Program, and copy and distribute such |
| modifications or work under the terms of Section 1 above, provided that |
| you also meet all of these conditions: |
| \layout Standard |
| |
| a) You must cause the modified files to carry prominent notices stating |
| that you changed the files and the date of any change. |
| \layout Standard |
| |
| b) You must cause any work that you distribute or publish, that in whole |
| or in part contains or is derived from the Program or any part thereof, |
| to be licensed as a whole at no charge to all third parties under the terms |
| of this License. |
| \layout Standard |
| |
| c) If the modified program normally reads commands interactively when run, |
| you must cause it, when started running for such interactive use in the |
| most ordinary way, to print or display an announcement including an appropriate |
| copyright notice and a notice that there is no warranty (or else, saying |
| that you provide a warranty) and that users may redistribute the program |
| under these conditions, and telling the user how to view a copy of this |
| License. |
| (Exception: if the Program itself is interactive but does not normally |
| print such an announcement, your work based on the Program is not required |
| to print an announcement.) These requirements apply to the modified work |
| as a whole. |
| If identifiable sections of that work are not derived from the Program, |
| and can be reasonably considered independent and separate works in themselves, |
| then this License, and its terms, do not apply to those sections when you |
| distribute them as separate works. |
| But when you distribute the same sections as part of a whole which is a |
| work based on the Program, the distribution of the whole must be on the |
| terms of this License, whose permissions for other licensees extend to |
| the entire whole, and thus to each and every part regardless of who wrote |
| it. |
| Thus, it is not the intent of this section to claim rights or contest your |
| rights to work written entirely by you; rather, the intent is to exercise |
| the right to control the distribution of derivative or collective works |
| based on the Program. |
| In addition, mere aggregation of another work not based on the Program |
| with the Program (or with a work based on the Program) on a volume of a |
| storage or distribution medium does not bring the other work under the |
| scope of this License. |
| \layout Standard |
| |
| 3. |
| You may copy and distribute the Program (or a work based on it, under Section |
| 2) in object code or executable form under the terms of Sections 1 and |
| 2 above provided that you also do one of the following: |
| \layout Standard |
| |
| a) Accompany it with the complete corresponding machine-readable source |
| code, which must be distributed under the terms of Sections 1 and 2 above |
| on a medium customarily used for software interchange; or, |
| \layout Standard |
| |
| b) Accompany it with a written offer, valid for at least three years, to |
| give any third party, for a charge no more than your cost of physically |
| performing source distribution, a complete machine-readable copy of the |
| corresponding source code, to be distributed under the terms of Sections |
| 1 and 2 above on a medium customarily used for software interchange; or, |
| \layout Standard |
| |
| c) Accompany it with the information you received as to the offer to distribute |
| corresponding source code. |
| (This alternative is allowed only for noncommercial distribution and only |
| if you received the program in object code or executable form with such |
| an offer, in accord with Subsection b above.) The source code for a work |
| means the preferred form of the work for making modifications to it. |
| For an executable work, complete source code means all the source code |
| for all modules it contains, plus any associated interface definition files, |
| plus the scripts used to control compilation and installation of the executable. |
| However, as a special exception, the source code distributed need not include |
| anything that is normally distributed (in either source or binary form) |
| with the major components (compiler, kernel, and so on) of the operating |
| system on which the executable runs, unless that component itself accompanies |
| the executable. |
| If distribution of executable or object code is made by offering access |
| to copy from a designated place, then offering equivalent access to copy |
| the source code from the same place counts as distribution of the source |
| code, even though third parties are not compelled to copy the source along |
| with the object code. |
| \layout Standard |
| |
| 4. |
| You may not copy, modify, sublicense, or distribute the Program except |
| as expressly provided under this License. |
| Any attempt otherwise to copy, modify, sublicense or distribute the Program |
| is void, and will automatically terminate your rights under this License. |
| However, parties who have received copies, or rights, from you under this |
| License will not have their licenses terminated so long as such parties |
| remain in full compliance. |
| \layout Standard |
| |
| 5. |
| You are not required to accept this License, since you have not signed |
| it. |
| However, nothing else grants you permission to modify or distribute the |
| Program or its derivative works. |
| These actions are prohibited by law if you do not accept this License. |
| Therefore, by modifying or distributing the Program (or any work based |
| on the Program), you indicate your acceptance of this License to do so, |
| and all its terms and conditions for copying, distributing or modifying |
| the Program or works based on it. |
| \layout Standard |
| |
| 6. |
| Each time you redistribute the Program (or any work based on the Program), |
| the recipient automatically receives a license from the original licensor |
| to copy, distribute or modify the Program subject to these terms and conditions. |
| You may not impose any further restrictions on the recipients' exercise |
| of the rights granted herein. |
| You are not responsible for enforcing compliance by third parties to this |
| License. |
| \layout Standard |
| |
| 7. |
| If, as a consequence of a court judgment or allegation of patent infringement |
| or for any other reason (not limited to patent issues), conditions are |
| imposed on you (whether by court order, agreement or otherwise) that contradict |
| the conditions of this License, they do not excuse you from the conditions |
| of this License. |
| If you cannot distribute so as to satisfy simultaneously your obligations |
| under this License and any other pertinent obligations, then as a consequence |
| you may not distribute the Program at all. |
| For example, if a patent license would not permit royalty-free redistribution |
| of the Program by all those who receive copies directly or indirectly through |
| you, then the only way you could satisfy both it and this License would |
| be to refrain entirely from distribution of the Program. |
| If any portion of this section is held invalid or unenforceable under any |
| particular circumstance, the balance of the section is intended to apply |
| and the section as a whole is intended to apply in other circumstances. |
| It is not the purpose of this section to induce you to infringe any patents |
| or other property right claims or to contest validity of any such claims; |
| this section has the sole purpose of protecting the integrity of the free |
| software distribution system, which is implemented by public license practices. |
| Many people have made generous contributions to the wide range of software |
| distributed through that system in reliance on consistent application of |
| that system; it is up to the author/donor to decide if he or she is willing |
| to distribute software through any other system and a licensee cannot impose |
| that choice. |
| This section is intended to make thoroughly clear what is believed to be |
| a consequence of the rest of this License. |
| \layout Standard |
| |
| 8. |
| If the distribution and/or use of the Program is restricted in certain |
| countries either by patents or by copyrighted interfaces, the original |
| copyright holder who places the Program under this License may add an explicit |
| geographical distribution limitation excluding those countries, so that |
| distribution is permitted only in or among countries not thus excluded. |
| In such case, this License incorporates the limitation as if written in |
| the body of this License. |
| \layout Standard |
| |
| 9. |
| The Free Software Foundation may publish revised and/or new versions of |
| the General Public License from time to time. |
| Such new versions will be similar in spirit to the present version, but |
| may differ in detail to address new problems or concerns. |
| Each version is given a distinguishing version number. |
| If the Program specifies a version number of this License which applies |
| to it and "any later version", you have the option of following the terms |
| and conditions either of that version or of any later version published |
| by the Free Software Foundation. |
| If the Program does not specify a version number of this License, you may |
| choose any version ever published by the Free Software Foundation. |
| \layout Standard |
| |
| 10. |
| If you wish to incorporate parts of the Program into other free programs |
| whose distribution conditions are different, write to the author to ask |
| for permission. |
| For software which is copyrighted by the Free Software Foundation, write |
| to the Free Software Foundation; we sometimes make exceptions for this. |
| Our decision will be guided by the two goals of preserving the free status |
| of all derivatives of our free software and of promoting the sharing and |
| reuse of software generally. |
| \layout Standard |
| |
| |
| \emph on |
| NO WARRANTY |
| \layout Standard |
| |
| 11. |
| BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR |
| THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. |
| EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER |
| PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER |
| EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH |
| YOU. |
| SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY |
| SERVICING, REPAIR OR CORRECTION. |
| \layout Standard |
| |
| 12. |
| IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL |
| ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE |
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING |
| ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF |
| THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS |
| OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR |
| THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY |
| OF SUCH DAMAGES. |
| \layout Standard |
| |
| |
| \emph on |
| END OF TERMS AND CONDITIONS |
| \layout Addchap |
| |
| Glossary |
| \layout Description |
| |
| Access\SpecialChar ~ |
| modifiers In the Java programming language, the use of the keywords |
| |
| \family typewriter |
| private |
| \family default |
| , |
| \family typewriter |
| protected |
| \family default |
| , |
| \family typewriter |
| public |
| \family default |
| (or the use of no keyword) defines the access rights for data or program |
| code (also called visibility). |
| This information is also used by the JVM: it is part of the class files. |
| The most important modifier is |
| \family typewriter |
| private |
| \family default |
| which is used to globally deny access to a field or method. |
| \layout Description |
| |
| Access\SpecialChar ~ |
| rights Access rights are granted or denied by the use of |
| \latex latex |
| |
| \backslash |
| ( |
| \backslash |
| triangleright |
| \backslash |
| ) |
| \latex default |
| access modifiers. |
| \layout Description |
| |
| API Applications Programming Interface. |
| Such an interface is used to include functionality of foreign program modules |
| (often |
| \latex latex |
| |
| \latex default |
| Java |
| \latex latex |
| |
| \backslash |
| ( |
| \backslash |
| triangleright |
| \backslash |
| ) |
| \latex default |
| packages) into own programs. |
| \layout Description |
| |
| Debugger A program used to investigate the behaviour of another program. |
| Often used to find and remove programming errors, so-called bugs. |
| \layout Description |
| |
| Descriptor A symbolic description of type information. |
| In the JVM's class files, strings in UTF-8 format |
| \begin_inset LatexCommand \cite{Unicode} |
| |
| \end_inset |
| |
| are used to describe type information. |
| \layout Description |
| |
| Field A member of a Java object or class, also called variable or attribute. |
| \layout Description |
| |
| Method A member of a Java object or class. |
| Methods include program code or they are abstract representatives for program |
| code. |
| A method can be compared to a |
| \emph on |
| function |
| \emph default |
| in programming languages like C or Pascal. |
| \layout Description |
| |
| Opcode Operation Code. |
| This denotes an instruction in an assembly-like computer language; to some |
| people it means its binary representation. |
| \layout Description |
| |
| Package A package is an entity used in both the Java programming language |
| and the Java Virtual Machine definition. |
| It is used to group classes that in the eyes of the programmer belong together. |
| Package definitions have impact on |
| \latex latex |
| |
| \backslash |
| ( |
| \backslash |
| triangleright |
| \backslash |
| ) |
| \latex default |
| access rights granted to other classes. |
| \layout Description |
| |
| Signature A method has a (possibly empty) set of arguments it expects, and |
| it has a return type (possibly the |
| \family typewriter |
| void |
| \family default |
| type). |
| The type information of the arguments and the return type together is called |
| signature. |
| A signature can be expressed in terms of a |
| \latex latex |
| |
| \backslash |
| ( |
| \backslash |
| triangleright |
| \backslash |
| ) |
| \latex default |
| descriptor. |
| \layout Description |
| |
| Type A field or a method argument has a type such as |
| \family typewriter |
| int |
| \family default |
| or |
| \family typewriter |
| String |
| \family default |
| . |
| In the JVM's context, all values are typed. |
| Types can be expressed in terms of a |
| \latex latex |
| |
| \backslash |
| ( |
| \backslash |
| triangleright |
| \backslash |
| ) |
| \latex default |
| descriptor. |
| \layout Standard |
| |
| |
| \begin_inset LatexCommand \listoffigures{} |
| |
| \end_inset |
| |
| |
| \layout Standard |
| |
| |
| \latex latex |
| |
| \backslash |
| addcontentsline{toc}{chapter}{List Of Figures} |
| \layout Standard |
| |
| |
| \begin_inset LatexCommand \listofalgorithms{} |
| |
| \end_inset |
| |
| |
| \layout Standard |
| |
| |
| \latex latex |
| |
| \backslash |
| addcontentsline{toc}{chapter}{List Of Algorithms} |
| \layout Bibliography |
| \bibitem [AppMag-WWW]{AppMag-WWW} |
| |
| |
| \latex latex |
| |
| \backslash |
| addcontentsline{toc}{chapter}{Bibliography} |
| \latex default |
| AverStar's AppletMagic(tm): Ada for the Java Virtual Machine. |
| \newline |
| |
| \emph on |
| http://www.appletmagic.com |
| \layout Bibliography |
| \bibitem [AsmGofer]{AsmGofer} |
| |
| Joachim Schmid: AsmGofer. |
| \newline |
| |
| \emph on |
| http://www.tydo.org |
| \layout Bibliography |
| \bibitem [BCEL98]{BCEL98} |
| |
| Markus Dahm: Byte Code Engineering with the BCEL API. |
| Freie Universität Berlin, Institut für Informatik. |
| Technical Report B-17-98. |
| \layout Bibliography |
| \bibitem [BCEL-WWW]{BCEL-WWW} |
| |
| Markus Dahm: Byte Code Engineering Library. |
| \emph on |
| |
| \newline |
| http://bcel.sourceforge.net |
| \layout Bibliography |
| \bibitem [BCV-Soundness]{BCV-Soundness} |
| |
| Cornelia Pusch: Proving the Soundness of a Java Bytecode Verifier Specification |
| in Isabelle/HOL. |
| Technische Universität München, Institut für Informatik. |
| |
| \newline |
| |
| \emph on |
| http://www.in.tum.de/~pusch/ |
| \layout Bibliography |
| \bibitem [C]{C} |
| |
| Brian W. |
| Kerninghan, Dennis M. |
| Ritchie: The C Programming Language, Second Edition, ANSI C. |
| Prentice-Hall 1998, ISBN 0131103628. |
| \layout Bibliography |
| \bibitem [CPP-D]{CPP-D} |
| |
| Bjarne Stroustrup: Die C++ Programmiersprache. |
| Addison-Wesly-Longman, 1998, ISBN 3-8273-1296-5. |
| \layout Bibliography |
| \bibitem [CPP-E]{CPP-E} |
| |
| Bjarne Stroustrup: The C++-Programming Language, Third Edition. |
| Addison-Wesley 1997, ISBN 0-201-88954-4. |
| \layout Bibliography |
| \bibitem [D3]{D3} |
| |
| Guido Lang, Andreas Bohne: Delphi 3.0 lernen. |
| Addison-Wesley-Longman 1997, ISBN 3-8273-1190-x. |
| \layout Bibliography |
| \bibitem [DesignPatterns]{DesignPatterns} |
| |
| Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns |
| Elements of Reusable Object-Oriented Software. |
| Addison-Wesley 1995, ISBN: 0201633612. |
| \layout Bibliography |
| \bibitem [DragonBook]{DragonBook} |
| |
| Alfred V. |
| Aho, Ravi Sethi, Jeffrey D. |
| Ullman: Compilers: Principles, Techniques, and Tools. |
| Addison-Wesley 1985, ISBN: 0201100886. |
| \layout Bibliography |
| \bibitem [EF]{EF} |
| |
| ElectricalFire. |
| \emph on |
| |
| \newline |
| http://www.mozilla.org/projects/ef/ |
| \layout Bibliography |
| \bibitem [f2j]{f2j} |
| |
| Keith Seymour: f2j - Fortran-to-Java Compiler. |
| \newline |
| |
| \emph on |
| http://cs.utk.edu/f2j/ |
| \layout Bibliography |
| \bibitem [Fong-WWW]{Fong-WWW} |
| |
| Philip W. |
| L. |
| Fong: The mysterious Pass One, first draft, September 2, 1997. |
| |
| \newline |
| |
| \emph on |
| http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/pass1/ |
| \layout Bibliography |
| \bibitem [Fong2-WWW]{Fong2-WWW} |
| |
| Philip W. |
| L. |
| Fong: A Flaw with the Specification of the Invokeinterface Opcode. |
| |
| \newline |
| |
| \emph on |
| http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/invokeinterface/ |
| \layout Bibliography |
| \bibitem [FreundMitchell]{FreundMitchell} |
| |
| Stephen N. |
| Freund, John Mitchell: A Formal Framework for the Java Bytecode Language |
| and Verifier. |
| Department of Computer Science, Stanford University. |
| Stanford, CA 94305-9045. |
| Appeared in OOPSLA '99. |
| \layout Bibliography |
| \bibitem [GCC-WWW]{GCC-WWW} |
| |
| GCC, The GNU compiler collection. |
| \emph on |
| |
| \newline |
| http://gcc.gnu.org |
| \layout Bibliography |
| \bibitem [GJ-WWW]{GJ-WWW} |
| |
| GJ. |
| A Generic Java Language Extension. |
| \newline |
| |
| \emph on |
| http://www.cis.unisa.edu.au/~pizza/gj/ |
| \layout Bibliography |
| \bibitem [InnerSpec]{InnerSpec} |
| |
| Sun Microsystems: Inner Classes Specification. |
| \newline |
| |
| \emph on |
| http://java.sun.com/products/jdk/1.1/docs/guide/ |
| \newline |
| innerclasses/spec/innerclasses.doc.html |
| \layout Bibliography |
| \bibitem [J2ME-CLDCS]{J2ME-CLDCS} |
| |
| Sun Microsystems: J2ME |
| \latex latex |
| |
| \backslash |
| texttrademark |
| \latex default |
| \SpecialChar ~ |
| Connected Limited Device Configuration Specification. |
| \newline |
| |
| \emph on |
| http://jcp.org/aboutJava/communityprocess/final/jsr030/ |
| \layout Bibliography |
| \bibitem [JBook]{JBook} |
| |
| Robert Stärk, Joachim Schmid, Egon Börger: Java |
| \latex latex |
| |
| \backslash |
| texttrademark\SpecialChar ~ |
| |
| \latex default |
| and the Java |
| \latex latex |
| |
| \backslash |
| texttrademark\SpecialChar ~ |
| |
| \latex default |
| Virtual Machine. |
| Springer-Verlag 2001, ISBN 3-540-42088-6. |
| \newline |
| |
| \emph on |
| http://www.inf.ethz.ch/~jbook/ |
| \layout Bibliography |
| \bibitem [JPaper]{JPaper} |
| |
| Robert F. |
| Stärk, Joachim Schmid: Java bytecode verification is not possible. |
| ETH Zürich, Department of Computer Science 2000. |
| \emph on |
| |
| \newline |
| http://www.inf.ethz.ch/~staerk/pdf/jbv00.pdf |
| \layout Bibliography |
| \bibitem [JLectures]{JLectures} |
| |
| Robert F. |
| Stärk: Java and the JVM: Definition and Verification (37-474). |
| \newline |
| |
| \emph on |
| http://www.inf.ethz.ch/~jbook/eth37474/ |
| \newline |
| http://www.inf.ethz.ch/~jbook/eth37474/javaBV.pdf |
| \layout Bibliography |
| \bibitem [JNS]{JNS} |
| |
| Robert Macgregor, Dave Durbin, John Owlett, Andrew Yeomans: JAVA |
| \latex latex |
| |
| \backslash |
| texttrademark |
| \latex default |
| \SpecialChar ~ |
| Network Security. |
| Prentice Hall 1998, ISBN 0137615299. |
| \layout Bibliography |
| \bibitem [JODE-WWW]{JODE-WWW} |
| |
| JODE is a java package containing a decompiler and an optimizer for java. |
| \newline |
| |
| \emph on |
| http://jode.sourceforge.net |
| \layout Bibliography |
| \bibitem [JustIce]{JustIce} |
| |
| Enver Haase: JustIce. |
| A Free Class File Verifier for Java |
| \latex latex |
| |
| \backslash |
| texttrademark |
| \latex default |
| \SpecialChar ~ |
| .Freie Universität Berlin, Takustraße 9, D-14195 Berlin; September 2001. |
| \newline |
| |
| \emph on |
| http://bcel.sourceforge.net/ |
| \newline |
| http://bcel.sourceforge.net/justice |
| \layout Bibliography |
| \bibitem [JVM]{JVM} |
| |
| Jon Meyer, Troy Downing: JAVA Virtual Machine. |
| O'Reilly 1997, ISBN 1-56592-194-1. |
| \layout Bibliography |
| \bibitem [Kaffe-WWW]{Kaffe-WWW} |
| |
| Kaffe. |
| Kaffe is a cleanroom, open source implementation of a Java virtual machine |
| and class libraries. |
| \emph on |
| |
| \newline |
| http://www.kaffe.org |
| \layout Bibliography |
| \bibitem [KAWA-WWW]{KAWA-WWW} |
| |
| Kawa, the Java-based Scheme system. |
| \emph on |
| |
| \newline |
| http://http://www.gnu.org/software/kawa/ |
| \layout Bibliography |
| \bibitem [KDE]{KDE} |
| |
| KDE, the K desktop environment. |
| \newline |
| |
| \emph on |
| http://www.kde.org |
| \layout Bibliography |
| \bibitem [Kimera-WWW]{Kimera-WWW} |
| |
| The Kimera Verifier. |
| |
| \emph on |
| |
| \emph default |
| |
| \newline |
| Currently off-line because of a World Wide Web presentation rework. |
| \emph on |
| |
| \newline |
| http://kimera.cs.washington.edu/verifier.html |
| \newline |
| http://www-kimera.cs.washington.edu |
| \layout Bibliography |
| \bibitem [Kimera-TestingJVM]{Kimera-TestingJVM} |
| |
| Emin Gün Sirer: Testing Java Virtual Machines. |
| An Experience Report on Automatically Testing Java Virtual Machines. |
| University of Washington, Dept. |
| of Computer Science and Engineering. |
| \newline |
| |
| \emph on |
| http://kimera.cs.washington.edu |
| \layout Bibliography |
| \bibitem [Kimera-ProdGram]{Kimera-ProdGram} |
| |
| Emin Gün Sirer, Brian N. |
| Bershad: Using Production Grammars in Software Testing. |
| University of Washington, Department of Computer Science. |
| \newline |
| |
| \emph on |
| http://kimera.cs.washington.edu |
| \layout Bibliography |
| \bibitem [kissme-WWW]{kissme-WWW} |
| |
| kissme. |
| A free Java Virtual Machine. |
| \emph on |
| |
| \newline |
| http://kissme.sourceforge.net |
| \layout Bibliography |
| \bibitem [Krakatoa-WWW]{Krakatoa-WWW} |
| |
| Todd A. |
| Proebsting, Scott A. |
| Watterson: Krakatoa: Decompilation in Java (Does Bytecode Reveal Source?). |
| The University of Arizona, Department of Computer Science. |
| \newline |
| |
| \emph on |
| http://www.cs.arizona.edu/people/saw/papers/Krakatoa-COOTS97.ps.Z |
| \layout Bibliography |
| \bibitem [langspec2]{langspec2} |
| |
| James Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specificati |
| on, Second Edition. |
| Addison-Wesley 2000, ISBN 0201310082. |
| \layout Bibliography |
| \bibitem [M2]{M2} |
| |
| Niklaus Wirth: Programming in Modula-2, Fourth Edition. |
| Springer-Verlag 1988, ISBN 3-540-50150-9. |
| \layout Bibliography |
| \bibitem [Mozilla]{Mozilla} |
| |
| Mozilla.org (The Mozilla Origanization): Mozilla. |
| \newline |
| |
| \emph on |
| http://www.mozilla.org |
| \layout Bibliography |
| \bibitem [Neuromancer]{Neuromancer} |
| |
| William Gibson: Neuromancer. |
| Ace Books 1994, ISBN 0441000681. |
| \layout Bibliography |
| \bibitem [ORP-WWW]{ORP-WWW} |
| |
| Open Runtime Platform. |
| A Platform For Bytecode System Research. |
| \newline |
| |
| \emph on |
| http://www.intel.com/research/mrl/orp/index.htm |
| \layout Bibliography |
| \bibitem [PL4JVM]{PL4JVM} |
| |
| Robert Tolksdorf: Programming Languages for the Java Virtual Machine. |
| \newline |
| |
| \emph on |
| http://www.robert-tolksdorf.de/vmlanguages.html |
| \layout Bibliography |
| \bibitem [PMG-WWW]{PMG-WWW} |
| |
| PMG. |
| Poor Man's Genericity for Java. |
| |
| \newline |
| |
| \emph on |
| |
| \layout Bibliography |
| \bibitem [Qian]{Qian} |
| |
| Zhenyu Qian: A Formal Specification of Java |
| \latex latex |
| |
| \backslash |
| texttrademark |
| \latex default |
| \SpecialChar ~ |
| Virtual Machine Instructions for Objects, Methods and Subroutines. |
| Bremen Institute for Safe Systems (BISS), FB3 Informatik, Universität Bremen, |
| D-28334 Bremen, Germany. |
| \layout Bibliography |
| \bibitem [SableVM-WWW]{SableVM-WWW} |
| |
| SableVM. |
| A Bytecode Interpreter. |
| \emph on |
| |
| \newline |
| http://www.sablevm.org |
| \layout Bibliography |
| \bibitem [StataAbadi]{StataAbadi} |
| |
| Raymie Stata and Martin Abadi: A Type System for Java Bytecode Subroutines. |
| In: ACM Transactions on Programming Languages and Systems, Vol. |
| 21, No. |
| 1, January 1999, Pages 90-137. |
| \layout Bibliography |
| \bibitem [Unknowable]{Unknowable} |
| |
| G.J. |
| Chaitin: The Unknowable. |
| Springer-Verlag 1999, ISBN 981-4021-72-5. |
| \newline |
| |
| \emph on |
| http://www.umcs.maine.edu/~chaitin/unknowable/ |
| \layout Bibliography |
| \bibitem [Unicode]{Unicode} |
| |
| The Unicode Consortium: The Unicode Standard, Version 2.0. |
| Niso Press 1996, ISBN 0-201-48345-9. |
| \newline |
| |
| \emph on |
| http://www.unicode.org |
| \layout Bibliography |
| \bibitem [Yellin-WWW]{Yellin-WWW} |
| |
| Frank Yellin: Low Level Security in Java. |
| \emph on |
| |
| \newline |
| http://java.sun.com/sfaq/verifier.html |
| \layout Bibliography |
| \bibitem [VMSPEC2]{vmspec2} |
| |
| Tim Lindholm, Frank Yellin: The Java |
| \latex latex |
| |
| \backslash |
| texttrademark\SpecialChar ~ |
| |
| \latex default |
| Virtual Machine Specification, Second Edition. |
| Addison-Wesley 1999, ISBN 0-201-43294-4. |
| \the_end |