1*0c56280aSSorin Basca# LyX 1.1 created this file. For more info see http://www.lyx.org/ 2*0c56280aSSorin Basca# 3*0c56280aSSorin Basca# Licensed to the Apache Software Foundation (ASF) under one or more 4*0c56280aSSorin Basca# contributor license agreements. See the NOTICE file distributed with 5*0c56280aSSorin Basca# this work for additional information regarding copyright ownership. 6*0c56280aSSorin Basca# The ASF licenses this file to You under the Apache License, Version 2.0 7*0c56280aSSorin Basca# (the "License"); you may not use this file except in compliance with 8*0c56280aSSorin Basca# the License. You may obtain a copy of the License at 9*0c56280aSSorin Basca# 10*0c56280aSSorin Basca# http://www.apache.org/licenses/LICENSE-2.0 11*0c56280aSSorin Basca# 12*0c56280aSSorin Basca# Unless required by applicable law or agreed to in writing, software 13*0c56280aSSorin Basca# distributed under the License is distributed on an "AS IS" BASIS, 14*0c56280aSSorin Basca# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*0c56280aSSorin Basca# See the License for the specific language governing permissions and 16*0c56280aSSorin Basca# limitations under the License. 17*0c56280aSSorin Basca 18*0c56280aSSorin Basca\lyxformat 218 19*0c56280aSSorin Basca\textclass scrbook 20*0c56280aSSorin Basca\begin_preamble 21*0c56280aSSorin Basca 22*0c56280aSSorin Basca\end_preamble 23*0c56280aSSorin Basca\language english 24*0c56280aSSorin Basca\inputencoding latin1 25*0c56280aSSorin Basca\fontscheme default 26*0c56280aSSorin Basca\graphics default 27*0c56280aSSorin Basca\float_placement !htp 28*0c56280aSSorin Basca\paperfontsize default 29*0c56280aSSorin Basca\spacing single 30*0c56280aSSorin Basca\papersize Default 31*0c56280aSSorin Basca\paperpackage a4wide 32*0c56280aSSorin Basca\use_geometry 0 33*0c56280aSSorin Basca\use_amsmath 0 34*0c56280aSSorin Basca\paperorientation portrait 35*0c56280aSSorin Basca\secnumdepth 2 36*0c56280aSSorin Basca\tocdepth 2 37*0c56280aSSorin Basca\paragraph_separation indent 38*0c56280aSSorin Basca\defskip medskip 39*0c56280aSSorin Basca\quotes_language english 40*0c56280aSSorin Basca\quotes_times 2 41*0c56280aSSorin Basca\papercolumns 1 42*0c56280aSSorin Basca\papersides 2 43*0c56280aSSorin Basca\paperpagestyle default 44*0c56280aSSorin Basca 45*0c56280aSSorin Basca\layout Subject 46*0c56280aSSorin Basca 47*0c56280aSSorin Basca 48*0c56280aSSorin Basca\emph on 49*0c56280aSSorin BascaDiplomarbeit 50*0c56280aSSorin Basca\layout Title 51*0c56280aSSorin Basca 52*0c56280aSSorin BascaJustIce 53*0c56280aSSorin Basca\newline 54*0c56280aSSorin Basca 55*0c56280aSSorin Basca\size small 56*0c56280aSSorin BascaA Free Class File Verifier for Java 57*0c56280aSSorin Basca\latex latex 58*0c56280aSSorin Basca 59*0c56280aSSorin Basca\backslash 60*0c56280aSSorin Bascatexttrademark\SpecialChar ~ 61*0c56280aSSorin Basca 62*0c56280aSSorin Basca\layout Author 63*0c56280aSSorin Basca 64*0c56280aSSorin BascaEnver Haase 65*0c56280aSSorin Basca\newline 66*0c56280aSSorin Basca 67*0c56280aSSorin Basca\size tiny 68*0c56280aSSorin Basca<[email protected]> 69*0c56280aSSorin Basca\layout Date 70*0c56280aSSorin Basca 71*0c56280aSSorin BascaSeptember 2001 72*0c56280aSSorin Basca\layout Publishers 73*0c56280aSSorin Basca 74*0c56280aSSorin BascaFreie Universit�t Berlin 75*0c56280aSSorin Basca\newline 76*0c56280aSSorin BascaInstitut f�r Informatik 77*0c56280aSSorin Basca\newline 78*0c56280aSSorin BascaTakustra�e 9 79*0c56280aSSorin Basca\newline 80*0c56280aSSorin BascaD-14195 Berlin 81*0c56280aSSorin Basca\layout Lowertitleback 82*0c56280aSSorin Basca 83*0c56280aSSorin Basca 84*0c56280aSSorin Basca\series bold 85*0c56280aSSorin Basca\size scriptsize 86*0c56280aSSorin BascaRevision 87*0c56280aSSorin Basca\series default 88*0c56280aSSorin Basca 89*0c56280aSSorin Basca\series bold 90*0c56280aSSorin Basca\shape smallcaps 91*0c56280aSSorin Basca$Id$ 92*0c56280aSSorin Basca\layout Minisec 93*0c56280aSSorin Basca 94*0c56280aSSorin BascaErkl�rung 95*0c56280aSSorin Basca\begin_float footnote 96*0c56280aSSorin Basca\layout Standard 97*0c56280aSSorin Basca 98*0c56280aSSorin BascaI declare that I wrote this 99*0c56280aSSorin Basca\emph on 100*0c56280aSSorin BascaDiplomarbeit 101*0c56280aSSorin Basca\emph default 102*0c56280aSSorin Basca completely on my own and without the help of persons not listed. 103*0c56280aSSorin Basca All sources of information are listed in the Bibliography section. 104*0c56280aSSorin Basca\end_float 105*0c56280aSSorin Basca\layout Standard 106*0c56280aSSorin Basca 107*0c56280aSSorin BascaHiermit versichere ich, die vorliegende Diplomarbeit selbst�ndig und ohne 108*0c56280aSSorin Basca fremde Hilfe verfa�t zu haben. 109*0c56280aSSorin Basca Es wurden nur die in der Bibliographie angegebenen Quellen benutzt. 110*0c56280aSSorin Basca\layout Minisec 111*0c56280aSSorin Basca 112*0c56280aSSorin BascaDanksagung 113*0c56280aSSorin Basca\begin_float footnote 114*0c56280aSSorin Basca\layout Standard 115*0c56280aSSorin Basca 116*0c56280aSSorin BascaThe creation of this 117*0c56280aSSorin Basca\emph on 118*0c56280aSSorin BascaDiplomarbeit 119*0c56280aSSorin Basca\emph default 120*0c56280aSSorin Basca paper was supported and supervised by Prof. 121*0c56280aSSorin Basca Dr. 122*0c56280aSSorin Basca Elfriede Fehr and Dipl.-Inform. 123*0c56280aSSorin Basca Markus Dahm. 124*0c56280aSSorin Basca Keith Seymour suggested a lot of language-related improvements. 125*0c56280aSSorin Basca Thank you. 126*0c56280aSSorin Basca\end_float 127*0c56280aSSorin Basca\layout Standard 128*0c56280aSSorin Basca 129*0c56280aSSorin BascaW�hrend der Anfertigung dieser Diplomarbeit wurde ich von Prof. 130*0c56280aSSorin Basca Dr. 131*0c56280aSSorin Basca Elfriede Fehr und Dipl.-Inform. 132*0c56280aSSorin Basca Markus Dahm betreut, wof�r ich mich an dieser Stelle herzlich bedanke. 133*0c56280aSSorin Basca\layout Standard 134*0c56280aSSorin Basca 135*0c56280aSSorin BascaDesweiteren bedanke ich mich bei Keith Seymour, der mir eine Reihe sprachspezifi 136*0c56280aSSorin Bascascher Verbesserungsvorschl�ge sandte. 137*0c56280aSSorin Basca\layout Minisec 138*0c56280aSSorin Basca 139*0c56280aSSorin BascaAutor 140*0c56280aSSorin Basca\begin_float footnote 141*0c56280aSSorin Basca\layout Standard 142*0c56280aSSorin Basca 143*0c56280aSSorin BascaAuthor 144*0c56280aSSorin Basca\end_float 145*0c56280aSSorin Basca\layout Standard 146*0c56280aSSorin Basca 147*0c56280aSSorin BascaEnver Haase 148*0c56280aSSorin Basca\newline 149*0c56280aSSorin BascaGubener Stra�e 18 150*0c56280aSSorin Basca\newline 151*0c56280aSSorin BascaD-10243 Berlin 152*0c56280aSSorin Basca\newline 153*0c56280aSSorin Basca 154*0c56280aSSorin Basca\layout Standard 155*0c56280aSSorin Basca 156*0c56280aSSorin Basca 157*0c56280aSSorin Basca\begin_inset LatexCommand \tableofcontents{} 158*0c56280aSSorin Basca 159*0c56280aSSorin Basca\end_inset 160*0c56280aSSorin Basca 161*0c56280aSSorin Basca 162*0c56280aSSorin Basca\layout Addchap 163*0c56280aSSorin Basca 164*0c56280aSSorin BascaAbstract 165*0c56280aSSorin Basca\layout Standard 166*0c56280aSSorin Basca 167*0c56280aSSorin BascaWhen Sun Microsystems developed their 168*0c56280aSSorin Basca\emph on 169*0c56280aSSorin BascaJava Platform 170*0c56280aSSorin Basca\emph default 171*0c56280aSSorin Basca in the early 1990s, it was originally designed for use in networked and 172*0c56280aSSorin Basca embedded consumer-electronics applications. 173*0c56280aSSorin Basca But when they introduced it around 1995, it quickly became used in World 174*0c56280aSSorin Basca Wide Web browser software. 175*0c56280aSSorin Basca This was a way to bring interactive content to demanding World Wide Web 176*0c56280aSSorin Basca users. 177*0c56280aSSorin Basca Sun took great care for the robustness of the platform: they planned to 178*0c56280aSSorin Basca connect embedded devices and let them share data and code over a network. 179*0c56280aSSorin Basca Defective devices transmitting bad data or unreliable network connections 180*0c56280aSSorin Basca should not cause other devices to crash. 181*0c56280aSSorin Basca This property made Java a good choice for the code-executing engine in 182*0c56280aSSorin Basca World Wide Web browsers: defective server software or transmission errors 183*0c56280aSSorin Basca would not cause the 184*0c56280aSSorin Basca\emph on 185*0c56280aSSorin BascaJava Platform 186*0c56280aSSorin Basca\emph default 187*0c56280aSSorin Basca to crash; this is also true for purposely malicious code hidden on the 188*0c56280aSSorin Basca Web. 189*0c56280aSSorin Basca The code-executing part of the 190*0c56280aSSorin Basca\emph on 191*0c56280aSSorin BascaJava Platform 192*0c56280aSSorin Basca\emph default 193*0c56280aSSorin Basca is called 194*0c56280aSSorin Basca\emph on 195*0c56280aSSorin BascaThe Java Virtual Machine 196*0c56280aSSorin Basca\emph default 197*0c56280aSSorin Basca (the 198*0c56280aSSorin Basca\emph on 199*0c56280aSSorin BascaJVM 200*0c56280aSSorin Basca\emph default 201*0c56280aSSorin Basca, for short). 202*0c56280aSSorin Basca This execution engine has to assure that the code to be executed is well-behave 203*0c56280aSSorin Bascad; it has to 204*0c56280aSSorin Basca\emph on 205*0c56280aSSorin Bascaverify 206*0c56280aSSorin Basca\emph default 207*0c56280aSSorin Basca the code. 208*0c56280aSSorin Basca Therefore, the 209*0c56280aSSorin Basca\emph on 210*0c56280aSSorin Bascaverifier 211*0c56280aSSorin Basca\emph default 212*0c56280aSSorin Basca is an integral part of every JVM, but JustIce implements a verifier that 213*0c56280aSSorin Basca is not integrated in a JVM. 214*0c56280aSSorin Basca It was implemented using a software library called the 215*0c56280aSSorin Basca\emph on 216*0c56280aSSorin BascaByte Code Engineering Library 217*0c56280aSSorin Basca\emph default 218*0c56280aSSorin Basca (the 219*0c56280aSSorin Basca\emph on 220*0c56280aSSorin BascaBCEL 221*0c56280aSSorin Basca\emph default 222*0c56280aSSorin Basca, for short) by Markus Dahm 223*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL98,BCEL-WWW} 224*0c56280aSSorin Basca 225*0c56280aSSorin Basca\end_inset 226*0c56280aSSorin Basca 227*0c56280aSSorin Basca. 228*0c56280aSSorin Basca\layout Standard 229*0c56280aSSorin Basca 230*0c56280aSSorin BascaThe BCEL is intended to give users a convenient mechanism to analyze, create 231*0c56280aSSorin Basca and manipulate (binary) Java class files. 232*0c56280aSSorin Basca It offers an object-oriented view of otherwise raw data, including program 233*0c56280aSSorin Basca code. 234*0c56280aSSorin Basca This library is, therefore, well-respected especially in the compiler-writer 235*0c56280aSSorin Basca community whenever the JVM is chosen as the target machine of the compiler. 236*0c56280aSSorin Basca Compiler back-ends use the BCEL to produce code for the JVM; and as new 237*0c56280aSSorin Basca compilers may be faulty, they may produce bad code. 238*0c56280aSSorin Basca Testing these compilers often is a difficult task. 239*0c56280aSSorin Basca The generated code should not only be semantically correct, but it also 240*0c56280aSSorin Basca has to pass the verifiers of all existing JVM implementations. 241*0c56280aSSorin Basca Normally, a lot of human interaction is required to run test cases. 242*0c56280aSSorin Basca If the code is rejected by a verifier, one often does not know why. 243*0c56280aSSorin Basca Most verifiers emit error messages which do not identify the offending 244*0c56280aSSorin Basca instruction. 245*0c56280aSSorin Basca\layout Standard 246*0c56280aSSorin Basca 247*0c56280aSSorin BascaJustIce presents an Application Programming Interface (API) that may be 248*0c56280aSSorin Basca used to automate the procedure sketched above. 249*0c56280aSSorin Basca The constraints imposed on class files are designed to be strict, therefore 250*0c56280aSSorin Basca eleminating the need to run several verifiers on the generated code. 251*0c56280aSSorin Basca If code passes the JustIce verifier, it should pass all other verifiers. 252*0c56280aSSorin Basca JustIce was also designed to output human-understandable messages if the 253*0c56280aSSorin Basca verification of some code fails. 254*0c56280aSSorin Basca\layout Standard 255*0c56280aSSorin Basca 256*0c56280aSSorin BascaThe application range of JustIce is not limited to compiler back-ends, in 257*0c56280aSSorin Basca the same sense as the BCEL is not only useful in this area. 258*0c56280aSSorin Basca Transformations of existing code and even generation of hand-crafted code 259*0c56280aSSorin Basca fall into its scope, too. 260*0c56280aSSorin Basca As a side effect, JustIce exports some data structures such as a control 261*0c56280aSSorin Basca flow graph; so its API may also be used for applications targeting other 262*0c56280aSSorin Basca problem areas such as static analyses of program code. 263*0c56280aSSorin Basca\layout Chapter 264*0c56280aSSorin Basca 265*0c56280aSSorin BascaIntroduction 266*0c56280aSSorin Basca\layout Section 267*0c56280aSSorin Basca 268*0c56280aSSorin BascaLow Level Security as a Part of a Many-Tiered Strategy 269*0c56280aSSorin Basca\layout Standard 270*0c56280aSSorin Basca 271*0c56280aSSorin BascaThe Java programming language is well-known for its inherent security facilities 272*0c56280aSSorin Basca such as the lack of pointer arithmetic or the need for memory allocation 273*0c56280aSSorin Basca and deallocation. 274*0c56280aSSorin Basca Lesser known is that this is only the top of an iceberg; the 275*0c56280aSSorin Basca\emph on 276*0c56280aSSorin BascaJava Platform 277*0c56280aSSorin Basca\emph default 278*0c56280aSSorin Basca implements a many-tiered security strategy 279*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Yellin-WWW} 280*0c56280aSSorin Basca 281*0c56280aSSorin Basca\end_inset 282*0c56280aSSorin Basca 283*0c56280aSSorin Basca. 284*0c56280aSSorin Basca It was designed to run even untrusted code -- code that possibly was not 285*0c56280aSSorin Basca produced by a compiler for the Java programming language, code that may 286*0c56280aSSorin Basca be corrupt or code that may have malicious intent (such as stealing credit 287*0c56280aSSorin Basca card number information from a hard disk drive). 288*0c56280aSSorin Basca Three considerations were made: 289*0c56280aSSorin Basca\layout Itemize 290*0c56280aSSorin Basca 291*0c56280aSSorin BascaUntrusted code could damage hardware, software, or information on the host 292*0c56280aSSorin Basca machine. 293*0c56280aSSorin Basca\layout Itemize 294*0c56280aSSorin Basca 295*0c56280aSSorin BascaIt could pass unauthorized information to anyone. 296*0c56280aSSorin Basca\layout Itemize 297*0c56280aSSorin Basca 298*0c56280aSSorin BascaIt could cause the host machine to become unusable through resource depletion. 299*0c56280aSSorin Basca\layout Standard 300*0c56280aSSorin Basca 301*0c56280aSSorin BascaWhile some security features such as type-safety or the already-mentioned 302*0c56280aSSorin Basca lack of pointer arithmetic of the Java programming language are a convenient 303*0c56280aSSorin Basca help for programmers, they can only help to reduce programming errors. 304*0c56280aSSorin Basca Of course these features do not help targeting the above problems. 305*0c56280aSSorin Basca At a lower level, however, the 306*0c56280aSSorin Basca\emph on 307*0c56280aSSorin BascaJava Plat\SpecialChar \- 308*0c56280aSSorin Bascaform 309*0c56280aSSorin Basca\emph default 310*0c56280aSSorin Basca implements a so-called sandbox: an area where code can be executed but 311*0c56280aSSorin Basca that has well-defined boundaries shielding the rest of the system. 312*0c56280aSSorin Basca This is achieved by means of a 313*0c56280aSSorin Basca\emph on 314*0c56280aSSorin BascaJava Virtual Machine 315*0c56280aSSorin Basca\emph default 316*0c56280aSSorin Basca (JVM) emulation; the host platform does not directly run untrusted code, 317*0c56280aSSorin Basca but a 318*0c56280aSSorin Basca\emph on 319*0c56280aSSorin Bascarun-time system 320*0c56280aSSorin Basca\emph default 321*0c56280aSSorin Basca which in turn runs the code, restricting its access to system resources. 322*0c56280aSSorin Basca\layout Standard 323*0c56280aSSorin Basca 324*0c56280aSSorin BascaA run-time system cannot safely assume that untrusted code is well-behaved. 325*0c56280aSSorin Basca Code could cause stack overflows, stack underruns, or otherwise erroneous 326*0c56280aSSorin Basca behaviour that may bring the run-time system into an undefined state -- 327*0c56280aSSorin Basca possibly allowing access to protected memory areas. 328*0c56280aSSorin Basca One could protect the run-time system by letting it predict the effects 329*0c56280aSSorin Basca of every single instruction just in time while actually executing it -- 330*0c56280aSSorin Basca but that would be too time-consuming to be applicable in practice. 331*0c56280aSSorin Basca\layout Standard 332*0c56280aSSorin Basca 333*0c56280aSSorin BascaTherefore, good behaviour of program code has to be enforced 334*0c56280aSSorin Basca\emph on 335*0c56280aSSorin Bascabefore 336*0c56280aSSorin Basca\emph default 337*0c56280aSSorin Basca it is actually executed -- at least as far as this is possible. 338*0c56280aSSorin Basca This is the lowest level of Java security; there has to be an integral 339*0c56280aSSorin Basca component in every JVM implementation doing so ( 340*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 341*0c56280aSSorin Basca 342*0c56280aSSorin Basca\end_inset 343*0c56280aSSorin Basca 344*0c56280aSSorin Basca, page 420). 345*0c56280aSSorin Basca This part of the JVM is called the 346*0c56280aSSorin Basca\emph on 347*0c56280aSSorin Bascaclass file verifier 348*0c56280aSSorin Basca\emph default 349*0c56280aSSorin Basca, yet better known as the 350*0c56280aSSorin Basca\emph on 351*0c56280aSSorin Bascabytecode verifier. 352*0c56280aSSorin Basca 353*0c56280aSSorin Basca\emph default 354*0c56280aSSorin BascaTechnically speaking, bytecode verification is only a part of class file 355*0c56280aSSorin Basca verification so 356*0c56280aSSorin Basca\emph on 357*0c56280aSSorin Bascaclass file verifier 358*0c56280aSSorin Basca\emph default 359*0c56280aSSorin Basca is a more embracing term. 360*0c56280aSSorin Basca JustIce implements a whole class file verifier. 361*0c56280aSSorin Basca\layout Standard 362*0c56280aSSorin Basca 363*0c56280aSSorin Basca\begin_float fig 364*0c56280aSSorin Basca\layout Standard 365*0c56280aSSorin Basca\align center 366*0c56280aSSorin Basca 367*0c56280aSSorin Basca\begin_inset Figure size 595 396 368*0c56280aSSorin Bascafile chap1.eps 369*0c56280aSSorin Bascawidth 3 100 370*0c56280aSSorin Bascaflags 9 371*0c56280aSSorin Basca 372*0c56280aSSorin Basca\end_inset 373*0c56280aSSorin Basca 374*0c56280aSSorin Basca 375*0c56280aSSorin Basca\layout Caption 376*0c56280aSSorin Basca 377*0c56280aSSorin BascaConcept of Class File Verification 378*0c56280aSSorin Basca\end_float 379*0c56280aSSorin Basca\layout Section 380*0c56280aSSorin Basca 381*0c56280aSSorin BascaWhy Another Verifier? 382*0c56280aSSorin Basca\layout Standard 383*0c56280aSSorin Basca 384*0c56280aSSorin BascaAs said before, every JVM implementation must contain a class file verifier, 385*0c56280aSSorin Basca so it is reasonable to ask for the motivation behind creating just another 386*0c56280aSSorin Basca class file verifier -- especially one that is 387*0c56280aSSorin Basca\emph on 388*0c56280aSSorin Bascanot 389*0c56280aSSorin Basca\emph default 390*0c56280aSSorin Basca part of a JVM implementation. 391*0c56280aSSorin Basca\layout Subsection 392*0c56280aSSorin Basca 393*0c56280aSSorin BascaBytecode Engineers Need JustIce 394*0c56280aSSorin Basca\layout Standard 395*0c56280aSSorin Basca 396*0c56280aSSorin BascaShortly after the 397*0c56280aSSorin Basca\emph on 398*0c56280aSSorin BascaJava Platform 399*0c56280aSSorin Basca\emph default 400*0c56280aSSorin Basca was introduced, it was adopted with pleasure because of its inherent independen 401*0c56280aSSorin Bascace from operating systems and concrete hardware. 402*0c56280aSSorin Basca Industry and educational institutions with heterogenous networked computers 403*0c56280aSSorin Basca could now run the same software program on different host machines. 404*0c56280aSSorin Basca Soon, many efforts were put into research and development of compilers 405*0c56280aSSorin Basca for programming languages other than the Java programming language that 406*0c56280aSSorin Basca use the JVM bytecode as target. 407*0c56280aSSorin Basca\layout Standard 408*0c56280aSSorin Basca 409*0c56280aSSorin BascaNowadays, many other programming languages do have the JVM as its target 410*0c56280aSSorin Basca platform; e.g. 411*0c56280aSSorin Basca Fortran 412*0c56280aSSorin Basca\begin_inset LatexCommand \cite{f2j} 413*0c56280aSSorin Basca 414*0c56280aSSorin Basca\end_inset 415*0c56280aSSorin Basca 416*0c56280aSSorin Basca, Ada 417*0c56280aSSorin Basca\begin_inset LatexCommand \cite{AppMag-WWW} 418*0c56280aSSorin Basca 419*0c56280aSSorin Basca\end_inset 420*0c56280aSSorin Basca 421*0c56280aSSorin Basca, Scheme 422*0c56280aSSorin Basca\begin_inset LatexCommand \cite{KAWA-WWW} 423*0c56280aSSorin Basca 424*0c56280aSSorin Basca\end_inset 425*0c56280aSSorin Basca 426*0c56280aSSorin Basca or modified Java language versions 427*0c56280aSSorin Basca\begin_inset LatexCommand \cite{GJ-WWW,PMG-WWW} 428*0c56280aSSorin Basca 429*0c56280aSSorin Basca\end_inset 430*0c56280aSSorin Basca 431*0c56280aSSorin Basca. 432*0c56280aSSorin Basca A vast collection of programming languages targeting the JVM can be found 433*0c56280aSSorin Basca on the World Wide Web 434*0c56280aSSorin Basca\begin_inset LatexCommand \cite{PL4JVM} 435*0c56280aSSorin Basca 436*0c56280aSSorin Basca\end_inset 437*0c56280aSSorin Basca 438*0c56280aSSorin Basca. 439*0c56280aSSorin Basca\layout Standard 440*0c56280aSSorin Basca 441*0c56280aSSorin BascaAll these compilers emit code for the JVM -- and so all these compilers 442*0c56280aSSorin Basca have to pass the JVM's verifier. 443*0c56280aSSorin Basca Implementors of such compilers have to consider the security related constraint 444*0c56280aSSorin Bascas the JVM poses on the generated code. 445*0c56280aSSorin Basca It is difficult to test if the emitted code works on all JVM implementations, 446*0c56280aSSorin Basca passing all JVM verifier implementations. 447*0c56280aSSorin Basca This is especially problematic if not all of the project's class files 448*0c56280aSSorin Basca are loaded into the JVM during a test run, because then they will not be 449*0c56280aSSorin Basca verified. 450*0c56280aSSorin Basca\layout Standard 451*0c56280aSSorin Basca 452*0c56280aSSorin BascaHaving an opportunity to verify the transitive hull of referenced class 453*0c56280aSSorin Basca files (starting with some main class file) would be of help; JustIce offers 454*0c56280aSSorin Basca it. 455*0c56280aSSorin Basca\layout Standard 456*0c56280aSSorin Basca 457*0c56280aSSorin BascaThe Bytecode Engineering Library by Markus Dahm is often used as a compiler 458*0c56280aSSorin Basca back-end to emit code, but it is also used to hand-craft code or to implement 459*0c56280aSSorin Basca bytecode transformations. 460*0c56280aSSorin Basca Because JustIce works closely together with the BCEL, users of the BCEL 461*0c56280aSSorin Basca do not even have to leave their development environment to run the JustIce 462*0c56280aSSorin Basca verifier. 463*0c56280aSSorin Basca\layout Standard 464*0c56280aSSorin Basca 465*0c56280aSSorin BascaTo our knowledge, JustIce is the only implementation of a Java class file 466*0c56280aSSorin Basca verifier that was written in the Java programming language 467*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 468*0c56280aSSorin Basca 469*0c56280aSSorin Basca\end_inset 470*0c56280aSSorin Basca 471*0c56280aSSorin Basca itself 472*0c56280aSSorin Basca\begin_float footnote 473*0c56280aSSorin Basca\layout Standard 474*0c56280aSSorin Basca 475*0c56280aSSorin BascaIn a personal communication, Robert St�rk told the author that there was 476*0c56280aSSorin Basca a Java implementation of the verifier discussed in 477*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JBook} 478*0c56280aSSorin Basca 479*0c56280aSSorin Basca\end_inset 480*0c56280aSSorin Basca 481*0c56280aSSorin Basca, written by Joachim Schmid using the BCEL. 482*0c56280aSSorin Basca However, it is not released for public use yet. 483*0c56280aSSorin Basca\end_float 484*0c56280aSSorin Basca. 485*0c56280aSSorin Basca Because of its 486*0c56280aSSorin Basca\emph on 487*0c56280aSSorin BascaVerification API 488*0c56280aSSorin Basca\emph default 489*0c56280aSSorin Basca, it can be included in other software projects written in Java with more 490*0c56280aSSorin Basca ease than any other verifier implementation in a different programming 491*0c56280aSSorin Basca language could provide. 492*0c56280aSSorin Basca\layout Subsection 493*0c56280aSSorin Basca 494*0c56280aSSorin BascaJustIce is Verbose 495*0c56280aSSorin Basca\layout Standard 496*0c56280aSSorin Basca 497*0c56280aSSorin BascaUsually, when classes pass the verifier, it is mute. 498*0c56280aSSorin Basca JustIce, in contrast, distinguishes between verification results and messages. 499*0c56280aSSorin Basca Messages are often warnings, but the reason for emitting such a warning 500*0c56280aSSorin Basca instead of a negative verification result is because the class file does 501*0c56280aSSorin Basca not pose a threat to the integrity of the JVM and thus does not have to 502*0c56280aSSorin Basca be rejected. 503*0c56280aSSorin Basca\layout Standard 504*0c56280aSSorin Basca 505*0c56280aSSorin BascaWhen a verification error occurs and the class file is rejected, even the 506*0c56280aSSorin Basca built-in verifiers usually produce some output saying so. 507*0c56280aSSorin Basca As an example, consider the following verifier run: 508*0c56280aSSorin Basca\newline 509*0c56280aSSorin Basca 510*0c56280aSSorin Basca\newline 511*0c56280aSSorin Basca 512*0c56280aSSorin Basca\family typewriter 513*0c56280aSSorin Bascaehaase@haneman:/home/ehaase > java Cc 514*0c56280aSSorin Basca\newline 515*0c56280aSSorin BascaException in thread "main" java.lang.VerifyError: 516*0c56280aSSorin Basca\newline 517*0c56280aSSorin Basca(class: Cc, method: ttt signature: ()V) 518*0c56280aSSorin Basca\newline 519*0c56280aSSorin BascaRecursive call to jsr entry 520*0c56280aSSorin Basca\family default 521*0c56280aSSorin Basca 522*0c56280aSSorin Basca\newline 523*0c56280aSSorin Basca 524*0c56280aSSorin Basca\latex latex 525*0c56280aSSorin Basca 526*0c56280aSSorin Basca\newline 527*0c56280aSSorin Basca 528*0c56280aSSorin Basca\layout Standard 529*0c56280aSSorin Basca 530*0c56280aSSorin BascaOne might ask 531*0c56280aSSorin Basca\emph on 532*0c56280aSSorin Bascawhich 533*0c56280aSSorin Basca\emph default 534*0c56280aSSorin Basca 535*0c56280aSSorin Basca\begin_inset Quotes eld 536*0c56280aSSorin Basca\end_inset 537*0c56280aSSorin Basca 538*0c56280aSSorin Bascajsr entry 539*0c56280aSSorin Basca\begin_inset Quotes erd 540*0c56280aSSorin Basca\end_inset 541*0c56280aSSorin Basca 542*0c56280aSSorin Basca (a branch target of a 543*0c56280aSSorin Basca\latex latex 544*0c56280aSSorin Basca 545*0c56280aSSorin Basca\backslash 546*0c56280aSSorin Bascatexttt{jsr} 547*0c56280aSSorin Basca\latex default 548*0c56280aSSorin Basca or a 549*0c56280aSSorin Basca\latex latex 550*0c56280aSSorin Basca 551*0c56280aSSorin Basca\backslash 552*0c56280aSSorin Bascatexttt{jsr 553*0c56280aSSorin Basca\backslash 554*0c56280aSSorin Basca_w} 555*0c56280aSSorin Basca\latex default 556*0c56280aSSorin Basca instruction) is called recursively and which instructions may be responsible 557*0c56280aSSorin Basca for this. 558*0c56280aSSorin Basca Compare this to JustIce's output: 559*0c56280aSSorin Basca\newline 560*0c56280aSSorin Basca 561*0c56280aSSorin Basca\newline 562*0c56280aSSorin Basca[...] 563*0c56280aSSorin Basca\layout Standard 564*0c56280aSSorin Basca 565*0c56280aSSorin Basca 566*0c56280aSSorin Basca\family typewriter 567*0c56280aSSorin BascaPass 3b, method number 0 ['public static void ttt()']: 568*0c56280aSSorin Basca\layout Standard 569*0c56280aSSorin Basca 570*0c56280aSSorin Basca 571*0c56280aSSorin Basca\family typewriter 572*0c56280aSSorin BascaVERIFIED_REJECTED 573*0c56280aSSorin Basca\layout Standard 574*0c56280aSSorin Basca 575*0c56280aSSorin Basca 576*0c56280aSSorin Basca\family typewriter 577*0c56280aSSorin BascaConstraint violated in method 'public static void ttt()': 578*0c56280aSSorin Basca\layout Standard 579*0c56280aSSorin Basca 580*0c56280aSSorin Basca 581*0c56280aSSorin Basca\family typewriter 582*0c56280aSSorin BascaSubroutine with local variable '1', JSRs '[ 36: jsr[168](3) -> astore_1, 583*0c56280aSSorin Basca 8: jsr[168](3) -> astore_1, 30: jsr[168](3) -> astore_1, 23: jsr[168](3) 584*0c56280aSSorin Basca -> astore_1]', RET ' 62: ret[169](2) 1' is called by a subroutine which 585*0c56280aSSorin Basca uses the same local variable index as itself; maybe even a recursive call? 586*0c56280aSSorin Basca JustIce's clean definition of a subroutine forbids both. 587*0c56280aSSorin Basca\newline 588*0c56280aSSorin Basca 589*0c56280aSSorin Basca\family default 590*0c56280aSSorin Basca[...] 591*0c56280aSSorin Basca\layout Standard 592*0c56280aSSorin Basca 593*0c56280aSSorin Basca 594*0c56280aSSorin Basca\family typewriter 595*0c56280aSSorin BascaWarnings: 596*0c56280aSSorin Basca\layout Standard 597*0c56280aSSorin Basca 598*0c56280aSSorin Basca 599*0c56280aSSorin Basca\family typewriter 600*0c56280aSSorin BascaPass 2: Attribute 'LineNumber(0, 4), LineNumber(0, 5), LineNumber(15, 8), 601*0c56280aSSorin Basca LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 13), LineNumber(64, 602*0c56280aSSorin Basca 15)' as an attribute of Code attribute '<CODE>' (method 'public static 603*0c56280aSSorin Basca void ttt()') will effectively be ignored and is only useful for debuggers 604*0c56280aSSorin Basca and such. 605*0c56280aSSorin Basca\layout Standard 606*0c56280aSSorin Basca 607*0c56280aSSorin Basca 608*0c56280aSSorin Basca\family typewriter 609*0c56280aSSorin BascaPass 2: Attribute 'LineNumber(0, 1), LineNumber(4, 1)' as an attribute of 610*0c56280aSSorin Basca Code attribute '<CODE>' (method 'public void <init>()') will effectively 611*0c56280aSSorin Basca be ignored and is only useful for debuggers and such. 612*0c56280aSSorin Basca\layout Standard 613*0c56280aSSorin Basca 614*0c56280aSSorin Basca 615*0c56280aSSorin Basca\family typewriter 616*0c56280aSSorin BascaPass 3a: LineNumberTable attribute 'LineNumber(0, 4), LineNumber(0, 5), 617*0c56280aSSorin Basca LineNumber(15, 8), LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 618*0c56280aSSorin Basca 13), LineNumber(64, 15)' refers to the same code offset ('0') more than 619*0c56280aSSorin Basca once which is violating the semantics [but is sometimes produced by IBM's 620*0c56280aSSorin Basca 'jikes' compiler]. 621*0c56280aSSorin Basca\newline 622*0c56280aSSorin Basca 623*0c56280aSSorin Basca\layout Standard 624*0c56280aSSorin Basca 625*0c56280aSSorin BascaThis output obviously has an answer to the above question; it shows the 626*0c56280aSSorin Basca only 627*0c56280aSSorin Basca\latex latex 628*0c56280aSSorin Basca 629*0c56280aSSorin Basca\backslash 630*0c56280aSSorin Bascatexttt{jsr} 631*0c56280aSSorin Basca\latex default 632*0c56280aSSorin Basca or 633*0c56280aSSorin Basca\latex latex 634*0c56280aSSorin Basca 635*0c56280aSSorin Basca\backslash 636*0c56280aSSorin Bascatexttt{jsr 637*0c56280aSSorin Basca\backslash 638*0c56280aSSorin Basca_w} 639*0c56280aSSorin Basca\latex default 640*0c56280aSSorin Basca instructions possibly responsible for a recursive call (which is not allowed 641*0c56280aSSorin Basca by the specification of the JVM). 642*0c56280aSSorin Basca For the special --but clean-- definition of subroutines JustIce uses, please 643*0c56280aSSorin Basca see section 644*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Subroutines_Def} 645*0c56280aSSorin Basca 646*0c56280aSSorin Basca\end_inset 647*0c56280aSSorin Basca 648*0c56280aSSorin Basca. 649*0c56280aSSorin Basca\layout Standard 650*0c56280aSSorin Basca 651*0c56280aSSorin BascaNote also the warning messages. 652*0c56280aSSorin Basca Class files that were not generated by Sun's 653*0c56280aSSorin Basca\emph on 654*0c56280aSSorin Bascajavac 655*0c56280aSSorin Basca\emph default 656*0c56280aSSorin Basca compiler have a tendency to look a little different in some corner cases. 657*0c56280aSSorin Basca IBM's 658*0c56280aSSorin Basca\emph on 659*0c56280aSSorin Bascajikes 660*0c56280aSSorin Basca\emph default 661*0c56280aSSorin Basca compiler, for instance, produces LineNumberTable attributes (see 662*0c56280aSSorin Basca\begin_inset LatexCommand \ref{LineNumberTableAttribute} 663*0c56280aSSorin Basca 664*0c56280aSSorin Basca\end_inset 665*0c56280aSSorin Basca 666*0c56280aSSorin Basca) which look different from those created by 667*0c56280aSSorin Basca\emph on 668*0c56280aSSorin Bascajavac 669*0c56280aSSorin Basca\emph default 670*0c56280aSSorin Basca. 671*0c56280aSSorin Basca Detecting such differences is desirable because future JVMs will have stricter 672*0c56280aSSorin Basca verification checks 673*0c56280aSSorin Basca\begin_float footnote 674*0c56280aSSorin Basca\layout Standard 675*0c56280aSSorin Basca 676*0c56280aSSorin BascaThe Solaris port of Sun's JVM, version 1.3.0_01, already has (some of) the 677*0c56280aSSorin Basca stricter checks built in. 678*0c56280aSSorin Basca You may enable them using the command-line option '-Xfuture'. 679*0c56280aSSorin Basca Nothing about this issue is mentioned in the specification 680*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 681*0c56280aSSorin Basca 682*0c56280aSSorin Basca\end_inset 683*0c56280aSSorin Basca 684*0c56280aSSorin Basca. 685*0c56280aSSorin Basca\end_float 686*0c56280aSSorin Basca (which most old 687*0c56280aSSorin Basca\emph on 688*0c56280aSSorin Bascajavac 689*0c56280aSSorin Basca\emph default 690*0c56280aSSorin Basca-compiled class files will probably still pass). 691*0c56280aSSorin Basca JustIce guides bytecode engineers to create class files that are indistinguisha 692*0c56280aSSorin Bascable from those created by 693*0c56280aSSorin Basca\emph on 694*0c56280aSSorin Bascajavac 695*0c56280aSSorin Basca\emph default 696*0c56280aSSorin Basca to retain compatibility with Sun's future JVM implementations. 697*0c56280aSSorin Basca Figure 698*0c56280aSSorin Basca\begin_inset LatexCommand \ref{FigVenn} 699*0c56280aSSorin Basca 700*0c56280aSSorin Basca\end_inset 701*0c56280aSSorin Basca 702*0c56280aSSorin Basca graphically shows the relationship between class files and the verifier 703*0c56280aSSorin Basca\begin_float footnote 704*0c56280aSSorin Basca\layout Standard 705*0c56280aSSorin Basca 706*0c56280aSSorin BascaThis is a simplicistic figure; unfortunately, there are class files produced 707*0c56280aSSorin Basca by the 708*0c56280aSSorin Basca\emph on 709*0c56280aSSorin Bascajavac 710*0c56280aSSorin Basca\emph default 711*0c56280aSSorin Basca compiler that do not pass the verifier. 712*0c56280aSSorin Basca Please see section 713*0c56280aSSorin Basca\begin_inset LatexCommand \ref{javacRejected} 714*0c56280aSSorin Basca 715*0c56280aSSorin Basca\end_inset 716*0c56280aSSorin Basca 717*0c56280aSSorin Basca for more details. 718*0c56280aSSorin Basca\end_float 719*0c56280aSSorin Basca. 720*0c56280aSSorin Basca\begin_float fig 721*0c56280aSSorin Basca\layout Standard 722*0c56280aSSorin Basca\align center 723*0c56280aSSorin Basca 724*0c56280aSSorin Basca\begin_inset Figure size 595 378 725*0c56280aSSorin Bascafile VennDiag.eps 726*0c56280aSSorin Bascawidth 3 100 727*0c56280aSSorin Bascaheight 3 45 728*0c56280aSSorin Bascaflags 9 729*0c56280aSSorin Basca 730*0c56280aSSorin Basca\end_inset 731*0c56280aSSorin Basca 732*0c56280aSSorin Basca 733*0c56280aSSorin Basca\layout Caption 734*0c56280aSSorin Basca 735*0c56280aSSorin Basca 736*0c56280aSSorin Basca\begin_inset LatexCommand \label{FigVenn} 737*0c56280aSSorin Basca 738*0c56280aSSorin Basca\end_inset 739*0c56280aSSorin Basca 740*0c56280aSSorin BascaVenn diagram showing the operating domain of the Java verifier. 741*0c56280aSSorin Basca\end_float 742*0c56280aSSorin Basca\layout Subsection 743*0c56280aSSorin Basca 744*0c56280aSSorin BascaJustIce is Free 745*0c56280aSSorin Basca\layout Standard 746*0c56280aSSorin Basca 747*0c56280aSSorin BascaCurrently, there is no other free and complete open source verifier available 748*0c56280aSSorin Basca known to the author. 749*0c56280aSSorin Basca You may have a look at the JVM's source code by Sun Microsystems but you 750*0c56280aSSorin Basca are not allowed to use the knowledge from that inspection for your own 751*0c56280aSSorin Basca projects or even use their code. 752*0c56280aSSorin Basca JustIce is a clean-room implementation: the author wrote JustIce by only 753*0c56280aSSorin Basca reading the Java 754*0c56280aSSorin Basca\latex latex 755*0c56280aSSorin Basca 756*0c56280aSSorin Basca\backslash 757*0c56280aSSorin Bascatexttrademark 758*0c56280aSSorin Basca\latex default 759*0c56280aSSorin Basca\SpecialChar ~ 760*0c56280aSSorin Basca Virtual Machine Specification, Second Edition 761*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 762*0c56280aSSorin Basca 763*0c56280aSSorin Basca\end_inset 764*0c56280aSSorin Basca 765*0c56280aSSorin Basca and comparing the behaviour of JustIce with the behaviour of commercial 766*0c56280aSSorin Basca implementations of Sun Microsystems and IBM Corporation. 767*0c56280aSSorin Basca\layout Standard 768*0c56280aSSorin Basca 769*0c56280aSSorin BascaThe open source JVM implementation 770*0c56280aSSorin Basca\emph on 771*0c56280aSSorin BascaKaffe 772*0c56280aSSorin Basca\emph default 773*0c56280aSSorin Basca 774*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kaffe-WWW} 775*0c56280aSSorin Basca 776*0c56280aSSorin Basca\end_inset 777*0c56280aSSorin Basca 778*0c56280aSSorin Basca, for example 779*0c56280aSSorin Basca\emph on 780*0c56280aSSorin Basca, 781*0c56280aSSorin Basca\emph default 782*0c56280aSSorin Basca does not have a 783*0c56280aSSorin Basca\emph on 784*0c56280aSSorin Bascacomplete 785*0c56280aSSorin Basca\emph default 786*0c56280aSSorin Basca verifier built in (although mandated by the JVM specification). 787*0c56280aSSorin Basca\layout Standard 788*0c56280aSSorin Basca 789*0c56280aSSorin Basca 790*0c56280aSSorin Basca\emph on 791*0c56280aSSorin BascaKissme 792*0c56280aSSorin Basca\emph default 793*0c56280aSSorin Basca 794*0c56280aSSorin Basca\begin_inset LatexCommand \cite{kissme-WWW} 795*0c56280aSSorin Basca 796*0c56280aSSorin Basca\end_inset 797*0c56280aSSorin Basca 798*0c56280aSSorin Basca, another open source JVM implementation, currently does not include any 799*0c56280aSSorin Basca verifier at all. 800*0c56280aSSorin Basca 801*0c56280aSSorin Basca\layout Standard 802*0c56280aSSorin Basca 803*0c56280aSSorin BascaThe JVM implementations 804*0c56280aSSorin Basca\emph on 805*0c56280aSSorin Basca SableVM 806*0c56280aSSorin Basca\emph default 807*0c56280aSSorin Basca 808*0c56280aSSorin Basca\begin_inset LatexCommand \cite{SableVM-WWW} 809*0c56280aSSorin Basca 810*0c56280aSSorin Basca\end_inset 811*0c56280aSSorin Basca 812*0c56280aSSorin Basca and Intel Corporation's 813*0c56280aSSorin Basca\emph on 814*0c56280aSSorin BascaOpen Runtime Platform 815*0c56280aSSorin Basca\emph default 816*0c56280aSSorin Basca 817*0c56280aSSorin Basca\begin_inset LatexCommand \cite{ORP-WWW} 818*0c56280aSSorin Basca 819*0c56280aSSorin Basca\end_inset 820*0c56280aSSorin Basca 821*0c56280aSSorin Basca are platforms to experiment with performance-enhancements. 822*0c56280aSSorin Basca They are not intended to work as general-purpose JVMs so they do not need 823*0c56280aSSorin Basca to implement verifiers. 824*0c56280aSSorin Basca\layout Standard 825*0c56280aSSorin Basca 826*0c56280aSSorin BascaOther open source projects that could make use of a free verifier include 827*0c56280aSSorin Basca the Java compiler 828*0c56280aSSorin Basca\emph on 829*0c56280aSSorin Bascagcj 830*0c56280aSSorin Basca\emph default 831*0c56280aSSorin Basca which is part of the GNU compiler collection 832*0c56280aSSorin Basca\begin_inset LatexCommand \cite{GCC-WWW} 833*0c56280aSSorin Basca 834*0c56280aSSorin Basca\end_inset 835*0c56280aSSorin Basca 836*0c56280aSSorin Basca. 837*0c56280aSSorin Basca\layout Standard 838*0c56280aSSorin Basca 839*0c56280aSSorin BascaJustIce is covered by the well-known and respected software license 840*0c56280aSSorin Basca\emph on 841*0c56280aSSorin BascaGNU General Public License 842*0c56280aSSorin Basca\emph default 843*0c56280aSSorin Basca (GPL); see section 844*0c56280aSSorin Basca\begin_inset LatexCommand \ref{GPL} 845*0c56280aSSorin Basca 846*0c56280aSSorin Basca\end_inset 847*0c56280aSSorin Basca 848*0c56280aSSorin Basca. 849*0c56280aSSorin Basca The author hopes other free software will benefit from it; from the JustIce 850*0c56280aSSorin Basca software 851*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JustIce} 852*0c56280aSSorin Basca 853*0c56280aSSorin Basca\end_inset 854*0c56280aSSorin Basca 855*0c56280aSSorin Basca as well as from this paper describing some of the inner workings of JustIce. 856*0c56280aSSorin Basca\layout Chapter 857*0c56280aSSorin Basca 858*0c56280aSSorin BascaThe Java Virtual Machine 859*0c56280aSSorin Basca\layout Standard 860*0c56280aSSorin Basca 861*0c56280aSSorin BascaThe Java Virtual Machine (JVM) is an abstract machine specified in 862*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 863*0c56280aSSorin Basca 864*0c56280aSSorin Basca\end_inset 865*0c56280aSSorin Basca 866*0c56280aSSorin Basca. 867*0c56280aSSorin Basca It has no knowledge about the Java programming language; but only of a 868*0c56280aSSorin Basca certain binary file format: the class file format. 869*0c56280aSSorin Basca A class file contains machine instructions for the JVM (called 870*0c56280aSSorin Basca\emph on 871*0c56280aSSorin Bascabytecodes 872*0c56280aSSorin Basca\emph default 873*0c56280aSSorin Basca), a symbol table (called 874*0c56280aSSorin Basca\emph on 875*0c56280aSSorin Bascaconstant pool 876*0c56280aSSorin Basca\emph default 877*0c56280aSSorin Basca) and some other ancillary information. 878*0c56280aSSorin Basca\layout Standard 879*0c56280aSSorin Basca 880*0c56280aSSorin BascaOn method invocation, a local stack frame is set up called the 881*0c56280aSSorin Basca\emph on 882*0c56280aSSorin Bascaexecution frame 883*0c56280aSSorin Basca\emph default 884*0c56280aSSorin Basca. 885*0c56280aSSorin Basca It consists of an 886*0c56280aSSorin Basca\emph on 887*0c56280aSSorin Bascaoperand stack 888*0c56280aSSorin Basca\emph default 889*0c56280aSSorin Basca and 890*0c56280aSSorin Basca\emph on 891*0c56280aSSorin Bascalocal variables 892*0c56280aSSorin Basca\emph default 893*0c56280aSSorin Basca (which may be compared to registers of traditional machines). 894*0c56280aSSorin Basca\layout Standard 895*0c56280aSSorin Basca 896*0c56280aSSorin BascaThe instructions in the code arrays of class files are interpreted by the 897*0c56280aSSorin Basca JVM. 898*0c56280aSSorin Basca There are 212 legal instructions; they have read-access to the class file's 899*0c56280aSSorin Basca constant pool and they can modify the operand stack and the local variables 900*0c56280aSSorin Basca in their execution frame. 901*0c56280aSSorin Basca An invoked method reads its arguments from the local variables. 902*0c56280aSSorin Basca Certain instructions pass a return value to the invoking method. 903*0c56280aSSorin Basca\layout Section 904*0c56280aSSorin Basca 905*0c56280aSSorin Basca 906*0c56280aSSorin Basca\begin_inset LatexCommand \label{Classfile Structure} 907*0c56280aSSorin Basca 908*0c56280aSSorin Basca\end_inset 909*0c56280aSSorin Basca 910*0c56280aSSorin BascaThe ClassFile Structure 911*0c56280aSSorin Basca\layout Standard 912*0c56280aSSorin Basca 913*0c56280aSSorin BascaTraditionally, the JVM loads its programs from files stored on file systems 914*0c56280aSSorin Basca of host machines; these files have names that end with 915*0c56280aSSorin Basca\emph on 916*0c56280aSSorin Basca 917*0c56280aSSorin Basca\begin_inset Quotes eld 918*0c56280aSSorin Basca\end_inset 919*0c56280aSSorin Basca 920*0c56280aSSorin Basca.class 921*0c56280aSSorin Basca\begin_inset Quotes erd 922*0c56280aSSorin Basca\end_inset 923*0c56280aSSorin Basca 924*0c56280aSSorin Basca 925*0c56280aSSorin Basca\emph default 926*0c56280aSSorin Basca. 927*0c56280aSSorin Basca It is possible to store the files in various other ways; a so-called 928*0c56280aSSorin Basca\emph on 929*0c56280aSSorin Bascaclass loader 930*0c56280aSSorin Basca\emph default 931*0c56280aSSorin Basca is then used to transform the files internally to the desired, basic class 932*0c56280aSSorin Basca file format. 933*0c56280aSSorin Basca Therefore, it suffices to explain the structure of traditional class files. 934*0c56280aSSorin Basca Every class file consists of a single 935*0c56280aSSorin Basca\family typewriter 936*0c56280aSSorin BascaClassFile 937*0c56280aSSorin Basca\family default 938*0c56280aSSorin Basca structure as defined below. 939*0c56280aSSorin Basca It defines a single class as known from the Java Programming Language 940*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 941*0c56280aSSorin Basca 942*0c56280aSSorin Basca\end_inset 943*0c56280aSSorin Basca 944*0c56280aSSorin Basca. 945*0c56280aSSorin Basca The terms 946*0c56280aSSorin Basca\emph on 947*0c56280aSSorin Bascaclass 948*0c56280aSSorin Basca\emph default 949*0c56280aSSorin Basca and 950*0c56280aSSorin Basca\emph on 951*0c56280aSSorin Bascaclass file 952*0c56280aSSorin Basca\emph default 953*0c56280aSSorin Basca may therefore be used interchangeably. 954*0c56280aSSorin Basca\begin_float fig 955*0c56280aSSorin Basca\layout Standard 956*0c56280aSSorin Basca\align center 957*0c56280aSSorin Basca 958*0c56280aSSorin Basca\begin_inset Figure size 595 526 959*0c56280aSSorin Bascafile classfile.eps 960*0c56280aSSorin Bascawidth 3 100 961*0c56280aSSorin Bascaflags 9 962*0c56280aSSorin Basca 963*0c56280aSSorin Basca\end_inset 964*0c56280aSSorin Basca 965*0c56280aSSorin Basca 966*0c56280aSSorin Basca\layout Standard 967*0c56280aSSorin Basca 968*0c56280aSSorin BascaA class file consists of constants, fields, methods, attributes and some 969*0c56280aSSorin Basca ancillary information. 970*0c56280aSSorin Basca This figure was taken from 971*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL98} 972*0c56280aSSorin Basca 973*0c56280aSSorin Basca\end_inset 974*0c56280aSSorin Basca 975*0c56280aSSorin Basca, used with permission of the author. 976*0c56280aSSorin Basca\layout Caption 977*0c56280aSSorin Basca 978*0c56280aSSorin BascaA Class File 979*0c56280aSSorin Basca\end_float 980*0c56280aSSorin Basca\layout Standard 981*0c56280aSSorin Basca 982*0c56280aSSorin BascaAs we will see, the 983*0c56280aSSorin Basca\family typewriter 984*0c56280aSSorin BascaClassFile 985*0c56280aSSorin Basca\family default 986*0c56280aSSorin Basca structure and its sub-structures are defined for upwards compatibility, 987*0c56280aSSorin Basca i.e., new structure definitions can be added to the specification easily 988*0c56280aSSorin Basca at a later time. 989*0c56280aSSorin Basca\newline 990*0c56280aSSorin Basca 991*0c56280aSSorin Basca\newline 992*0c56280aSSorin Basca 993*0c56280aSSorin Basca\family typewriter 994*0c56280aSSorin BascaClassFile { 995*0c56280aSSorin Basca\newline 996*0c56280aSSorin Basca\SpecialChar \- 997*0c56280aSSorin Basca\SpecialChar ~ 998*0c56280aSSorin Basca\SpecialChar ~ 999*0c56280aSSorin Bascau4 magic; 1000*0c56280aSSorin Basca\newline 1001*0c56280aSSorin Basca\SpecialChar \- 1002*0c56280aSSorin Basca\SpecialChar ~ 1003*0c56280aSSorin Basca\SpecialChar ~ 1004*0c56280aSSorin Bascau2 minor_version; 1005*0c56280aSSorin Basca\newline 1006*0c56280aSSorin Basca\SpecialChar \- 1007*0c56280aSSorin Basca\SpecialChar ~ 1008*0c56280aSSorin Basca\SpecialChar ~ 1009*0c56280aSSorin Bascau2 major_version; 1010*0c56280aSSorin Basca\newline 1011*0c56280aSSorin Basca\SpecialChar \- 1012*0c56280aSSorin Basca\SpecialChar ~ 1013*0c56280aSSorin Basca\SpecialChar ~ 1014*0c56280aSSorin Bascau2 constant_pool_count; 1015*0c56280aSSorin Basca\newline 1016*0c56280aSSorin Basca\SpecialChar \- 1017*0c56280aSSorin Basca\SpecialChar ~ 1018*0c56280aSSorin Basca\SpecialChar ~ 1019*0c56280aSSorin Bascacp_info constant_pool[constant_pool_count-1]; 1020*0c56280aSSorin Basca\newline 1021*0c56280aSSorin Basca\SpecialChar \- 1022*0c56280aSSorin Basca\SpecialChar ~ 1023*0c56280aSSorin Basca\SpecialChar ~ 1024*0c56280aSSorin Bascau2 access_flags; 1025*0c56280aSSorin Basca\newline 1026*0c56280aSSorin Basca\SpecialChar \- 1027*0c56280aSSorin Basca\SpecialChar ~ 1028*0c56280aSSorin Basca\SpecialChar ~ 1029*0c56280aSSorin Bascau2 this_class; 1030*0c56280aSSorin Basca\newline 1031*0c56280aSSorin Basca\SpecialChar \- 1032*0c56280aSSorin Basca\SpecialChar ~ 1033*0c56280aSSorin Basca\SpecialChar ~ 1034*0c56280aSSorin Bascau2 super_class; 1035*0c56280aSSorin Basca\newline 1036*0c56280aSSorin Basca\SpecialChar \- 1037*0c56280aSSorin Basca\SpecialChar ~ 1038*0c56280aSSorin Basca\SpecialChar ~ 1039*0c56280aSSorin Bascau2 interfaces_count; 1040*0c56280aSSorin Basca\newline 1041*0c56280aSSorin Basca\SpecialChar \- 1042*0c56280aSSorin Basca\SpecialChar ~ 1043*0c56280aSSorin Basca\SpecialChar ~ 1044*0c56280aSSorin Bascau2 interfaces[interfaces_count]; 1045*0c56280aSSorin Basca\newline 1046*0c56280aSSorin Basca\SpecialChar \- 1047*0c56280aSSorin Basca\SpecialChar ~ 1048*0c56280aSSorin Basca\SpecialChar ~ 1049*0c56280aSSorin Bascau2 fields_count; 1050*0c56280aSSorin Basca\newline 1051*0c56280aSSorin Basca\SpecialChar \- 1052*0c56280aSSorin Basca\SpecialChar ~ 1053*0c56280aSSorin Basca\SpecialChar ~ 1054*0c56280aSSorin Bascafield_info fields[fields_count]; 1055*0c56280aSSorin Basca\newline 1056*0c56280aSSorin Basca\SpecialChar \- 1057*0c56280aSSorin Basca\SpecialChar ~ 1058*0c56280aSSorin Basca\SpecialChar ~ 1059*0c56280aSSorin Bascau2 methods_count; 1060*0c56280aSSorin Basca\newline 1061*0c56280aSSorin Basca\SpecialChar \- 1062*0c56280aSSorin Basca\SpecialChar ~ 1063*0c56280aSSorin Basca\SpecialChar ~ 1064*0c56280aSSorin Bascamethod_info methods[methods_count]; 1065*0c56280aSSorin Basca\newline 1066*0c56280aSSorin Basca\SpecialChar \- 1067*0c56280aSSorin Basca\SpecialChar ~ 1068*0c56280aSSorin Basca\SpecialChar ~ 1069*0c56280aSSorin Bascau2 attributes_count; 1070*0c56280aSSorin Basca\newline 1071*0c56280aSSorin Basca\SpecialChar \- 1072*0c56280aSSorin Basca\SpecialChar ~ 1073*0c56280aSSorin Basca\SpecialChar ~ 1074*0c56280aSSorin Bascaattribute_info attributes[attributes_count]; 1075*0c56280aSSorin Basca\newline 1076*0c56280aSSorin Basca} 1077*0c56280aSSorin Basca\newline 1078*0c56280aSSorin Basca 1079*0c56280aSSorin Basca\newline 1080*0c56280aSSorin Basca 1081*0c56280aSSorin Basca\family default 1082*0c56280aSSorin BascaYou may read an ' 1083*0c56280aSSorin Basca\family typewriter 1084*0c56280aSSorin Bascau 1085*0c56280aSSorin Basca\family default 1086*0c56280aSSorin Basca' as 'byte times'; e.g., ' 1087*0c56280aSSorin Basca\family typewriter 1088*0c56280aSSorin Bascau2 1089*0c56280aSSorin Basca\family default 1090*0c56280aSSorin Basca' means 'two bytes in size'. 1091*0c56280aSSorin Basca We will not delve into too much detail here; the exact specification of 1092*0c56280aSSorin Basca the entries are published by Sun 1093*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 1094*0c56280aSSorin Basca 1095*0c56280aSSorin Basca\end_inset 1096*0c56280aSSorin Basca 1097*0c56280aSSorin Basca. 1098*0c56280aSSorin Basca But one should note that besides some other information, a class file basically 1099*0c56280aSSorin Basca defines 1100*0c56280aSSorin Basca\emph on 1101*0c56280aSSorin Bascaattributes 1102*0c56280aSSorin Basca\emph default 1103*0c56280aSSorin Basca, 1104*0c56280aSSorin Basca\emph on 1105*0c56280aSSorin Basca constants 1106*0c56280aSSorin Basca\emph default 1107*0c56280aSSorin Basca, 1108*0c56280aSSorin Basca\emph on 1109*0c56280aSSorin Bascafields 1110*0c56280aSSorin Basca\emph default 1111*0c56280aSSorin Basca and 1112*0c56280aSSorin Basca\emph on 1113*0c56280aSSorin Bascamethods 1114*0c56280aSSorin Basca\emph default 1115*0c56280aSSorin Basca. 1116*0c56280aSSorin Basca Also, there are strong structural constraints imposed on class files. 1117*0c56280aSSorin Basca It is a verifier's task to validate them. 1118*0c56280aSSorin Basca\layout Subsection 1119*0c56280aSSorin Basca 1120*0c56280aSSorin BascaAttributes 1121*0c56280aSSorin Basca\layout Standard 1122*0c56280aSSorin Basca 1123*0c56280aSSorin BascaThe general format of an attribute is defined below. 1124*0c56280aSSorin Basca\newline 1125*0c56280aSSorin Basca 1126*0c56280aSSorin Basca\newline 1127*0c56280aSSorin Basca 1128*0c56280aSSorin Basca\family typewriter 1129*0c56280aSSorin Bascaattribute_info { 1130*0c56280aSSorin Basca\newline 1131*0c56280aSSorin Basca\SpecialChar \- 1132*0c56280aSSorin Basca\SpecialChar ~ 1133*0c56280aSSorin Basca\SpecialChar ~ 1134*0c56280aSSorin Bascau2 attribute_name_index; 1135*0c56280aSSorin Basca\newline 1136*0c56280aSSorin Basca\SpecialChar \- 1137*0c56280aSSorin Basca\SpecialChar ~ 1138*0c56280aSSorin Basca\SpecialChar ~ 1139*0c56280aSSorin Bascau4 attribute_length; 1140*0c56280aSSorin Basca\newline 1141*0c56280aSSorin Basca\SpecialChar \- 1142*0c56280aSSorin Basca\SpecialChar ~ 1143*0c56280aSSorin Basca\SpecialChar ~ 1144*0c56280aSSorin Bascau1 info[attribute_length]; 1145*0c56280aSSorin Basca\newline 1146*0c56280aSSorin Basca} 1147*0c56280aSSorin Basca\family default 1148*0c56280aSSorin Basca 1149*0c56280aSSorin Basca\newline 1150*0c56280aSSorin Basca 1151*0c56280aSSorin Basca\newline 1152*0c56280aSSorin BascaAn attribute is basically a typed data container; its type is determined 1153*0c56280aSSorin Basca by its name. 1154*0c56280aSSorin Basca Every JVM is required to be silent about attributes of types it does not 1155*0c56280aSSorin Basca know. 1156*0c56280aSSorin Basca On the other hand, newly defined attributes are required not to impose 1157*0c56280aSSorin Basca a semantical change on the class file. 1158*0c56280aSSorin Basca These attributes should be uniquely named; in fact, the pair (<attribute 1159*0c56280aSSorin Basca name>, <attribute length>) is required to be unique. 1160*0c56280aSSorin Basca This is guaranteed because attributes not defined by Sun Microsystems have 1161*0c56280aSSorin Basca to be named according to the package naming scheme of the Java Programming 1162*0c56280aSSorin Basca Language 1163*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 1164*0c56280aSSorin Basca 1165*0c56280aSSorin Basca\end_inset 1166*0c56280aSSorin Basca 1167*0c56280aSSorin Basca. 1168*0c56280aSSorin Basca Certain basic attributes are predefined. 1169*0c56280aSSorin Basca They are used in the 1170*0c56280aSSorin Basca\family typewriter 1171*0c56280aSSorin BascaClassFile 1172*0c56280aSSorin Basca\family default 1173*0c56280aSSorin Basca (see section 1174*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Classfile Structure} 1175*0c56280aSSorin Basca 1176*0c56280aSSorin Basca\end_inset 1177*0c56280aSSorin Basca 1178*0c56280aSSorin Basca), 1179*0c56280aSSorin Basca\family typewriter 1180*0c56280aSSorin Bascafield_info 1181*0c56280aSSorin Basca\family default 1182*0c56280aSSorin Basca (see section 1183*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Fields} 1184*0c56280aSSorin Basca 1185*0c56280aSSorin Basca\end_inset 1186*0c56280aSSorin Basca 1187*0c56280aSSorin Basca) and 1188*0c56280aSSorin Basca\family typewriter 1189*0c56280aSSorin Bascamethod_info 1190*0c56280aSSorin Basca\family default 1191*0c56280aSSorin Basca (see section 1192*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Methods} 1193*0c56280aSSorin Basca 1194*0c56280aSSorin Basca\end_inset 1195*0c56280aSSorin Basca 1196*0c56280aSSorin Basca). 1197*0c56280aSSorin Basca Also, attributes may be nested: the 1198*0c56280aSSorin Basca\family typewriter 1199*0c56280aSSorin BascaCode 1200*0c56280aSSorin Basca\family default 1201*0c56280aSSorin Basca attribute references other attributes. 1202*0c56280aSSorin Basca\layout Standard 1203*0c56280aSSorin Basca 1204*0c56280aSSorin BascaSome examples for predefined attributes are listed below. 1205*0c56280aSSorin Basca\layout Subsubsection 1206*0c56280aSSorin Basca 1207*0c56280aSSorin Basca 1208*0c56280aSSorin Basca\begin_inset LatexCommand \label{ConstantValueAttribute} 1209*0c56280aSSorin Basca 1210*0c56280aSSorin Basca\end_inset 1211*0c56280aSSorin Basca 1212*0c56280aSSorin BascaThe ConstantValue attribute 1213*0c56280aSSorin Basca\layout Standard 1214*0c56280aSSorin Basca 1215*0c56280aSSorin BascaThe ConstantValue attribute has the following format: 1216*0c56280aSSorin Basca\newline 1217*0c56280aSSorin Basca 1218*0c56280aSSorin Basca\newline 1219*0c56280aSSorin Basca 1220*0c56280aSSorin Basca\family typewriter 1221*0c56280aSSorin BascaConstantValue_attribute { 1222*0c56280aSSorin Basca\newline 1223*0c56280aSSorin Basca\SpecialChar \- 1224*0c56280aSSorin Basca\SpecialChar ~ 1225*0c56280aSSorin Basca\SpecialChar ~ 1226*0c56280aSSorin Bascau2 attribute_name_index; 1227*0c56280aSSorin Basca\newline 1228*0c56280aSSorin Basca\SpecialChar \- 1229*0c56280aSSorin Basca\SpecialChar ~ 1230*0c56280aSSorin Basca\SpecialChar ~ 1231*0c56280aSSorin Bascau4 attribute_length; 1232*0c56280aSSorin Basca\newline 1233*0c56280aSSorin Basca\SpecialChar \- 1234*0c56280aSSorin Basca\SpecialChar ~ 1235*0c56280aSSorin Basca\SpecialChar ~ 1236*0c56280aSSorin Bascau2 constantvalue_index; 1237*0c56280aSSorin Basca\newline 1238*0c56280aSSorin Basca} 1239*0c56280aSSorin Basca\family default 1240*0c56280aSSorin Basca 1241*0c56280aSSorin Basca\newline 1242*0c56280aSSorin Basca 1243*0c56280aSSorin Basca\newline 1244*0c56280aSSorin BascaThe 1245*0c56280aSSorin Basca\family typewriter 1246*0c56280aSSorin BascaConstantValue 1247*0c56280aSSorin Basca\family default 1248*0c56280aSSorin Basca attribute represents the value of a constant field. 1249*0c56280aSSorin Basca It has a fixed length: it contains only a two-byte reference into the constant 1250*0c56280aSSorin Basca pool. 1251*0c56280aSSorin Basca Only 1252*0c56280aSSorin Basca\family typewriter 1253*0c56280aSSorin Bascafield_info 1254*0c56280aSSorin Basca\family default 1255*0c56280aSSorin Basca structures (see section 1256*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Fields} 1257*0c56280aSSorin Basca 1258*0c56280aSSorin Basca\end_inset 1259*0c56280aSSorin Basca 1260*0c56280aSSorin Basca) contain this type of attribute. 1261*0c56280aSSorin Basca\layout Subsubsection 1262*0c56280aSSorin Basca 1263*0c56280aSSorin Basca 1264*0c56280aSSorin Basca\begin_inset LatexCommand \label{CodeAttribute} 1265*0c56280aSSorin Basca 1266*0c56280aSSorin Basca\end_inset 1267*0c56280aSSorin Basca 1268*0c56280aSSorin BascaThe Code Attribute 1269*0c56280aSSorin Basca\layout Standard 1270*0c56280aSSorin Basca 1271*0c56280aSSorin BascaThe 1272*0c56280aSSorin Basca\family typewriter 1273*0c56280aSSorin BascaCode 1274*0c56280aSSorin Basca\family default 1275*0c56280aSSorin Basca attribute is used in the 1276*0c56280aSSorin Basca\family typewriter 1277*0c56280aSSorin Bascamethod_info 1278*0c56280aSSorin Basca\family default 1279*0c56280aSSorin Basca (see section 1280*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Methods} 1281*0c56280aSSorin Basca 1282*0c56280aSSorin Basca\end_inset 1283*0c56280aSSorin Basca 1284*0c56280aSSorin Basca) structure. 1285*0c56280aSSorin Basca It represents the program code of a method and it is defined as follows: 1286*0c56280aSSorin Basca\newline 1287*0c56280aSSorin Basca 1288*0c56280aSSorin Basca\newline 1289*0c56280aSSorin Basca 1290*0c56280aSSorin Basca\family typewriter 1291*0c56280aSSorin BascaCode_attribute { 1292*0c56280aSSorin Basca\newline 1293*0c56280aSSorin Basca\SpecialChar \- 1294*0c56280aSSorin Basca\SpecialChar ~ 1295*0c56280aSSorin Basca\SpecialChar ~ 1296*0c56280aSSorin Bascau2 attribute_name_index; 1297*0c56280aSSorin Basca\newline 1298*0c56280aSSorin Basca\SpecialChar \- 1299*0c56280aSSorin Basca\SpecialChar ~ 1300*0c56280aSSorin Basca\SpecialChar ~ 1301*0c56280aSSorin Bascau4 attribute_length; 1302*0c56280aSSorin Basca\newline 1303*0c56280aSSorin Basca\SpecialChar \- 1304*0c56280aSSorin Basca\SpecialChar ~ 1305*0c56280aSSorin Basca\SpecialChar ~ 1306*0c56280aSSorin Bascau2 max_stack; 1307*0c56280aSSorin Basca\newline 1308*0c56280aSSorin Basca\SpecialChar \- 1309*0c56280aSSorin Basca\SpecialChar ~ 1310*0c56280aSSorin Basca\SpecialChar ~ 1311*0c56280aSSorin Bascau2 max_locals; 1312*0c56280aSSorin Basca\newline 1313*0c56280aSSorin Basca\SpecialChar \- 1314*0c56280aSSorin Basca\SpecialChar ~ 1315*0c56280aSSorin Basca\SpecialChar ~ 1316*0c56280aSSorin Bascau4 code_length; 1317*0c56280aSSorin Basca\newline 1318*0c56280aSSorin Basca\SpecialChar \- 1319*0c56280aSSorin Basca\SpecialChar ~ 1320*0c56280aSSorin Basca\SpecialChar ~ 1321*0c56280aSSorin Bascau1 code[code_length]; 1322*0c56280aSSorin Basca\newline 1323*0c56280aSSorin Basca\SpecialChar \- 1324*0c56280aSSorin Basca\SpecialChar ~ 1325*0c56280aSSorin Basca\SpecialChar ~ 1326*0c56280aSSorin Bascau2 exception_table_length; 1327*0c56280aSSorin Basca\newline 1328*0c56280aSSorin Basca\SpecialChar \- 1329*0c56280aSSorin Basca\SpecialChar ~ 1330*0c56280aSSorin Basca\SpecialChar ~ 1331*0c56280aSSorin Basca{ 1332*0c56280aSSorin Basca\newline 1333*0c56280aSSorin Basca\SpecialChar \- 1334*0c56280aSSorin Basca\SpecialChar ~ 1335*0c56280aSSorin Basca\SpecialChar ~ 1336*0c56280aSSorin Basca\SpecialChar \- 1337*0c56280aSSorin Basca\SpecialChar ~ 1338*0c56280aSSorin Basca\SpecialChar ~ 1339*0c56280aSSorin Bascau2 start_pc; 1340*0c56280aSSorin Basca\newline 1341*0c56280aSSorin Basca\SpecialChar \- 1342*0c56280aSSorin Basca\SpecialChar ~ 1343*0c56280aSSorin Basca\SpecialChar ~ 1344*0c56280aSSorin Basca\SpecialChar \- 1345*0c56280aSSorin Basca\SpecialChar ~ 1346*0c56280aSSorin Basca\SpecialChar ~ 1347*0c56280aSSorin Bascau2 end_pc; 1348*0c56280aSSorin Basca\newline 1349*0c56280aSSorin Basca\SpecialChar \- 1350*0c56280aSSorin Basca\SpecialChar ~ 1351*0c56280aSSorin Basca\SpecialChar ~ 1352*0c56280aSSorin Basca\SpecialChar \- 1353*0c56280aSSorin Basca\SpecialChar ~ 1354*0c56280aSSorin Basca\SpecialChar ~ 1355*0c56280aSSorin Bascau2 handler_pc; 1356*0c56280aSSorin Basca\newline 1357*0c56280aSSorin Basca\SpecialChar \- 1358*0c56280aSSorin Basca\SpecialChar ~ 1359*0c56280aSSorin Basca\SpecialChar ~ 1360*0c56280aSSorin Basca\SpecialChar \- 1361*0c56280aSSorin Basca\SpecialChar ~ 1362*0c56280aSSorin Basca\SpecialChar ~ 1363*0c56280aSSorin Bascau2 catch_type; 1364*0c56280aSSorin Basca\newline 1365*0c56280aSSorin Basca\SpecialChar \- 1366*0c56280aSSorin Basca\SpecialChar ~ 1367*0c56280aSSorin Basca\SpecialChar ~ 1368*0c56280aSSorin Basca} exception_table[exception_table_length]; 1369*0c56280aSSorin Basca\newline 1370*0c56280aSSorin Basca\SpecialChar \- 1371*0c56280aSSorin Basca\SpecialChar ~ 1372*0c56280aSSorin Basca\SpecialChar ~ 1373*0c56280aSSorin Bascau2 attributes_count; 1374*0c56280aSSorin Basca\newline 1375*0c56280aSSorin Basca\SpecialChar \- 1376*0c56280aSSorin Basca\SpecialChar ~ 1377*0c56280aSSorin Basca\SpecialChar ~ 1378*0c56280aSSorin Bascaattribute_info attributes[attributes_count]; 1379*0c56280aSSorin Basca\newline 1380*0c56280aSSorin Basca} 1381*0c56280aSSorin Basca\family default 1382*0c56280aSSorin Basca 1383*0c56280aSSorin Basca\newline 1384*0c56280aSSorin Basca 1385*0c56280aSSorin Basca\newline 1386*0c56280aSSorin BascaThis is the most complex of all predefined attributes. 1387*0c56280aSSorin Basca Every method that has code (i.e., every non-native, non-abstract method) 1388*0c56280aSSorin Basca must have such an attribute. 1389*0c56280aSSorin Basca Note that the maximum stack depth and the number of local variables for 1390*0c56280aSSorin Basca a method invocation are defined here. 1391*0c56280aSSorin Basca This is important for the JVM when it creates an 1392*0c56280aSSorin Basca\emph on 1393*0c56280aSSorin Bascaexecution frame 1394*0c56280aSSorin Basca\emph default 1395*0c56280aSSorin Basca (see section 1396*0c56280aSSorin Basca\begin_inset LatexCommand \ref{LV_and_OpStack} 1397*0c56280aSSorin Basca 1398*0c56280aSSorin Basca\end_inset 1399*0c56280aSSorin Basca 1400*0c56280aSSorin Basca) at the time the method is invoked. 1401*0c56280aSSorin Basca\layout Standard 1402*0c56280aSSorin Basca 1403*0c56280aSSorin BascaAlso, the exception handlers are defined here. 1404*0c56280aSSorin Basca Exception handlers prevent an executing method from an abrupt completion 1405*0c56280aSSorin Basca if an exceptional situation occurs. 1406*0c56280aSSorin Basca Code areas are said to be protected against a class of exceptional situations 1407*0c56280aSSorin Basca by an exception handler 1408*0c56280aSSorin Basca\begin_float footnote 1409*0c56280aSSorin Basca\layout Standard 1410*0c56280aSSorin Basca 1411*0c56280aSSorin BascaThe JVM closely reflects the 1412*0c56280aSSorin Basca\emph on 1413*0c56280aSSorin Bascaexception 1414*0c56280aSSorin Basca\emph default 1415*0c56280aSSorin Basca mechanism of the Java programming language 1416*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 1417*0c56280aSSorin Basca 1418*0c56280aSSorin Basca\end_inset 1419*0c56280aSSorin Basca 1420*0c56280aSSorin Basca. 1421*0c56280aSSorin Basca In the Java programming language, exceptions can be 1422*0c56280aSSorin Basca\emph on 1423*0c56280aSSorin Bascathrown 1424*0c56280aSSorin Basca\emph default 1425*0c56280aSSorin Basca, and they can be 1426*0c56280aSSorin Basca\emph on 1427*0c56280aSSorin Bascacaught 1428*0c56280aSSorin Basca\emph default 1429*0c56280aSSorin Basca explicitly. 1430*0c56280aSSorin Basca If an internal JVM error occurs, the JVM also --implicitly-- throws an 1431*0c56280aSSorin Basca exception. 1432*0c56280aSSorin Basca\end_float 1433*0c56280aSSorin Basca. 1434*0c56280aSSorin Basca Algorithm 1435*0c56280aSSorin Basca\begin_inset LatexCommand \ref{ExcHdAlgo} 1436*0c56280aSSorin Basca 1437*0c56280aSSorin Basca\end_inset 1438*0c56280aSSorin Basca 1439*0c56280aSSorin Basca shows an example for the use of exception handlers. 1440*0c56280aSSorin Basca The exact meaning of the instruction opcodes is not important here, the 1441*0c56280aSSorin Basca most common instructions are explained later in this paper. 1442*0c56280aSSorin Basca\layout Standard 1443*0c56280aSSorin Basca 1444*0c56280aSSorin Basca\begin_float alg 1445*0c56280aSSorin Basca\layout Standard 1446*0c56280aSSorin Basca 1447*0c56280aSSorin Basca[Let 1448*0c56280aSSorin Basca\family typewriter 1449*0c56280aSSorin Bascastart_pc 1450*0c56280aSSorin Basca\family default 1451*0c56280aSSorin Basca and 1452*0c56280aSSorin Basca\family typewriter 1453*0c56280aSSorin Bascaend_pc 1454*0c56280aSSorin Basca\family default 1455*0c56280aSSorin Basca protect the area A to B, inclusive. 1456*0c56280aSSorin Basca Let the 1457*0c56280aSSorin Basca\family typewriter 1458*0c56280aSSorin Bascacatch_type 1459*0c56280aSSorin Basca\family default 1460*0c56280aSSorin Basca be 1461*0c56280aSSorin Basca\begin_inset Quotes eld 1462*0c56280aSSorin Basca\end_inset 1463*0c56280aSSorin Basca 1464*0c56280aSSorin Basca 1465*0c56280aSSorin Basca\family typewriter 1466*0c56280aSSorin Bascajava.lang.NullPointerException 1467*0c56280aSSorin Basca\family default 1468*0c56280aSSorin Basca 1469*0c56280aSSorin Basca\begin_inset Quotes erd 1470*0c56280aSSorin Basca\end_inset 1471*0c56280aSSorin Basca 1472*0c56280aSSorin Basca. 1473*0c56280aSSorin Basca Let the 1474*0c56280aSSorin Basca\family typewriter 1475*0c56280aSSorin Bascahandler_pc 1476*0c56280aSSorin Basca\family default 1477*0c56280aSSorin Basca point to C.] 1478*0c56280aSSorin Basca\layout Standard 1479*0c56280aSSorin Basca 1480*0c56280aSSorin Basca 1481*0c56280aSSorin Basca\family typewriter 1482*0c56280aSSorin Basca\SpecialChar ~ 1483*0c56280aSSorin Basca\SpecialChar ~ 1484*0c56280aSSorin Basca\SpecialChar ~ 1485*0c56280aSSorin Bascaaconst_null\SpecialChar ~ 1486*0c56280aSSorin Basca\SpecialChar ~ 1487*0c56280aSSorin Basca\SpecialChar ~ 1488*0c56280aSSorin Basca\SpecialChar ~ 1489*0c56280aSSorin Basca\SpecialChar ~ 1490*0c56280aSSorin Basca\SpecialChar ~ 1491*0c56280aSSorin Basca\SpecialChar ~ 1492*0c56280aSSorin Basca\SpecialChar ~ 1493*0c56280aSSorin Basca; push a NULL onto the operand stack. 1494*0c56280aSSorin Basca\layout Standard 1495*0c56280aSSorin Basca 1496*0c56280aSSorin Basca 1497*0c56280aSSorin Basca\family typewriter 1498*0c56280aSSorin BascaA:\SpecialChar ~ 1499*0c56280aSSorin Bascanop\SpecialChar ~ 1500*0c56280aSSorin Basca\SpecialChar ~ 1501*0c56280aSSorin Basca\SpecialChar ~ 1502*0c56280aSSorin Basca\SpecialChar ~ 1503*0c56280aSSorin Basca\SpecialChar ~ 1504*0c56280aSSorin Basca\SpecialChar ~ 1505*0c56280aSSorin Basca\SpecialChar ~ 1506*0c56280aSSorin Basca\SpecialChar ~ 1507*0c56280aSSorin Basca\SpecialChar ~ 1508*0c56280aSSorin Basca\SpecialChar ~ 1509*0c56280aSSorin Basca\SpecialChar ~ 1510*0c56280aSSorin Basca\SpecialChar ~ 1511*0c56280aSSorin Basca\SpecialChar ~ 1512*0c56280aSSorin Basca\SpecialChar ~ 1513*0c56280aSSorin Basca\SpecialChar ~ 1514*0c56280aSSorin Basca\SpecialChar ~ 1515*0c56280aSSorin Basca; do nothing 1516*0c56280aSSorin Basca\layout Standard 1517*0c56280aSSorin Basca 1518*0c56280aSSorin Basca 1519*0c56280aSSorin Basca\family typewriter 1520*0c56280aSSorin BascaB:\SpecialChar ~ 1521*0c56280aSSorin Bascagetfield Foo::bar\SpecialChar ~ 1522*0c56280aSSorin Basca\SpecialChar ~ 1523*0c56280aSSorin Basca; dereference NULL, cause NullPointerExc. 1524*0c56280aSSorin Basca\layout Standard 1525*0c56280aSSorin Basca 1526*0c56280aSSorin Basca 1527*0c56280aSSorin Basca\family typewriter 1528*0c56280aSSorin Basca\SpecialChar ~ 1529*0c56280aSSorin Basca\SpecialChar ~ 1530*0c56280aSSorin Basca\SpecialChar ~ 1531*0c56280aSSorin Bascareturn\SpecialChar ~ 1532*0c56280aSSorin Basca\SpecialChar ~ 1533*0c56280aSSorin Basca\SpecialChar ~ 1534*0c56280aSSorin Basca\SpecialChar ~ 1535*0c56280aSSorin Basca\SpecialChar ~ 1536*0c56280aSSorin Basca\SpecialChar ~ 1537*0c56280aSSorin Basca\SpecialChar ~ 1538*0c56280aSSorin Basca\SpecialChar ~ 1539*0c56280aSSorin Basca\SpecialChar ~ 1540*0c56280aSSorin Basca\SpecialChar ~ 1541*0c56280aSSorin Basca\SpecialChar ~ 1542*0c56280aSSorin Basca\SpecialChar ~ 1543*0c56280aSSorin Basca\SpecialChar ~ 1544*0c56280aSSorin Basca;\SpecialChar ~ 1545*0c56280aSSorin Bascanever executed 1546*0c56280aSSorin Basca\layout Standard 1547*0c56280aSSorin Basca 1548*0c56280aSSorin Basca 1549*0c56280aSSorin Basca\family typewriter 1550*0c56280aSSorin BascaC:\SpecialChar ~ 1551*0c56280aSSorin Bascanop\SpecialChar ~ 1552*0c56280aSSorin Basca\SpecialChar ~ 1553*0c56280aSSorin Basca\SpecialChar ~ 1554*0c56280aSSorin Basca\SpecialChar ~ 1555*0c56280aSSorin Basca\SpecialChar ~ 1556*0c56280aSSorin Basca\SpecialChar ~ 1557*0c56280aSSorin Basca\SpecialChar ~ 1558*0c56280aSSorin Basca\SpecialChar ~ 1559*0c56280aSSorin Basca\SpecialChar ~ 1560*0c56280aSSorin Basca\SpecialChar ~ 1561*0c56280aSSorin Basca\SpecialChar ~ 1562*0c56280aSSorin Basca\SpecialChar ~ 1563*0c56280aSSorin Basca\SpecialChar ~ 1564*0c56280aSSorin Basca\SpecialChar ~ 1565*0c56280aSSorin Basca\SpecialChar ~ 1566*0c56280aSSorin Basca\SpecialChar ~ 1567*0c56280aSSorin Basca;\SpecialChar ~ 1568*0c56280aSSorin Bascathis is executed: we could handle 1569*0c56280aSSorin Basca\layout Standard 1570*0c56280aSSorin Basca 1571*0c56280aSSorin Basca 1572*0c56280aSSorin Basca\family typewriter 1573*0c56280aSSorin Basca\SpecialChar ~ 1574*0c56280aSSorin Basca\SpecialChar ~ 1575*0c56280aSSorin Basca\SpecialChar ~ 1576*0c56280aSSorin Bascanop\SpecialChar ~ 1577*0c56280aSSorin Basca\SpecialChar ~ 1578*0c56280aSSorin Basca\SpecialChar ~ 1579*0c56280aSSorin Basca\SpecialChar ~ 1580*0c56280aSSorin Basca\SpecialChar ~ 1581*0c56280aSSorin Basca\SpecialChar ~ 1582*0c56280aSSorin Basca\SpecialChar ~ 1583*0c56280aSSorin Basca\SpecialChar ~ 1584*0c56280aSSorin Basca\SpecialChar ~ 1585*0c56280aSSorin Basca\SpecialChar ~ 1586*0c56280aSSorin Basca\SpecialChar ~ 1587*0c56280aSSorin Basca\SpecialChar ~ 1588*0c56280aSSorin Basca\SpecialChar ~ 1589*0c56280aSSorin Basca\SpecialChar ~ 1590*0c56280aSSorin Basca\SpecialChar ~ 1591*0c56280aSSorin Basca\SpecialChar ~ 1592*0c56280aSSorin Basca;\SpecialChar ~ 1593*0c56280aSSorin Bascathe NullPointerException 1594*0c56280aSSorin Basca\layout Standard 1595*0c56280aSSorin Basca 1596*0c56280aSSorin Basca 1597*0c56280aSSorin Basca\family typewriter 1598*0c56280aSSorin Basca\SpecialChar ~ 1599*0c56280aSSorin Basca\SpecialChar ~ 1600*0c56280aSSorin Basca\SpecialChar ~ 1601*0c56280aSSorin Bascareturn\SpecialChar ~ 1602*0c56280aSSorin Basca\SpecialChar ~ 1603*0c56280aSSorin Basca\SpecialChar ~ 1604*0c56280aSSorin Basca\SpecialChar ~ 1605*0c56280aSSorin Basca\SpecialChar ~ 1606*0c56280aSSorin Basca\SpecialChar ~ 1607*0c56280aSSorin Basca\SpecialChar ~ 1608*0c56280aSSorin Basca\SpecialChar ~ 1609*0c56280aSSorin Basca\SpecialChar ~ 1610*0c56280aSSorin Basca\SpecialChar ~ 1611*0c56280aSSorin Basca\SpecialChar ~ 1612*0c56280aSSorin Basca\SpecialChar ~ 1613*0c56280aSSorin Basca\SpecialChar ~ 1614*0c56280aSSorin Basca;\SpecialChar ~ 1615*0c56280aSSorin Bascaleave method (complete normally) 1616*0c56280aSSorin Basca\layout Caption 1617*0c56280aSSorin Basca 1618*0c56280aSSorin Basca 1619*0c56280aSSorin Basca\begin_inset LatexCommand \label{ExcHdAlgo} 1620*0c56280aSSorin Basca 1621*0c56280aSSorin Basca\end_inset 1622*0c56280aSSorin Basca 1623*0c56280aSSorin BascaUse of Exception Handlers 1624*0c56280aSSorin Basca\end_float 1625*0c56280aSSorin Basca\layout Standard 1626*0c56280aSSorin Basca 1627*0c56280aSSorin BascaThe most important item, however, is the 1628*0c56280aSSorin Basca\family typewriter 1629*0c56280aSSorin Bascacode 1630*0c56280aSSorin Basca\family default 1631*0c56280aSSorin Basca item. 1632*0c56280aSSorin Basca It defines the bytecode of this method; i.e., the JVM machine instructions. 1633*0c56280aSSorin Basca\layout Subsubsection 1634*0c56280aSSorin Basca 1635*0c56280aSSorin Basca 1636*0c56280aSSorin Basca\begin_inset LatexCommand \label{LineNumberTableAttribute} 1637*0c56280aSSorin Basca 1638*0c56280aSSorin Basca\end_inset 1639*0c56280aSSorin Basca 1640*0c56280aSSorin BascaThe LineNumberTable Attribute 1641*0c56280aSSorin Basca\layout Standard 1642*0c56280aSSorin Basca 1643*0c56280aSSorin BascaThe 1644*0c56280aSSorin Basca\family typewriter 1645*0c56280aSSorin BascaLineNumberTable 1646*0c56280aSSorin Basca\family default 1647*0c56280aSSorin Basca attribute is defined as follows: 1648*0c56280aSSorin Basca\newline 1649*0c56280aSSorin Basca 1650*0c56280aSSorin Basca\newline 1651*0c56280aSSorin Basca 1652*0c56280aSSorin Basca\family typewriter 1653*0c56280aSSorin BascaLineNumberTable_attribute { 1654*0c56280aSSorin Basca\newline 1655*0c56280aSSorin Basca\SpecialChar \- 1656*0c56280aSSorin Basca\SpecialChar ~ 1657*0c56280aSSorin Basca\SpecialChar ~ 1658*0c56280aSSorin Bascau2 attribute_name_index; 1659*0c56280aSSorin Basca\newline 1660*0c56280aSSorin Basca\SpecialChar \- 1661*0c56280aSSorin Basca\SpecialChar ~ 1662*0c56280aSSorin Basca\SpecialChar ~ 1663*0c56280aSSorin Bascau4 attribute_length; 1664*0c56280aSSorin Basca\newline 1665*0c56280aSSorin Basca\SpecialChar \- 1666*0c56280aSSorin Basca\SpecialChar ~ 1667*0c56280aSSorin Basca\SpecialChar ~ 1668*0c56280aSSorin Bascau2 line_number_table_length; 1669*0c56280aSSorin Basca\newline 1670*0c56280aSSorin Basca\SpecialChar \- 1671*0c56280aSSorin Basca\SpecialChar ~ 1672*0c56280aSSorin Basca\SpecialChar ~ 1673*0c56280aSSorin Basca{ 1674*0c56280aSSorin Basca\newline 1675*0c56280aSSorin Basca\SpecialChar \- 1676*0c56280aSSorin Basca\SpecialChar ~ 1677*0c56280aSSorin Basca\SpecialChar ~ 1678*0c56280aSSorin Basca\SpecialChar \- 1679*0c56280aSSorin Basca\SpecialChar ~ 1680*0c56280aSSorin Basca\SpecialChar ~ 1681*0c56280aSSorin Bascau2 start_pc; 1682*0c56280aSSorin Basca\newline 1683*0c56280aSSorin Basca\SpecialChar \- 1684*0c56280aSSorin Basca\SpecialChar ~ 1685*0c56280aSSorin Basca\SpecialChar ~ 1686*0c56280aSSorin Basca\SpecialChar \- 1687*0c56280aSSorin Basca\SpecialChar ~ 1688*0c56280aSSorin Basca\SpecialChar ~ 1689*0c56280aSSorin Bascau2 line_number; 1690*0c56280aSSorin Basca\newline 1691*0c56280aSSorin Basca\SpecialChar \- 1692*0c56280aSSorin Basca\SpecialChar ~ 1693*0c56280aSSorin Basca\SpecialChar ~ 1694*0c56280aSSorin Basca} line_number_table[line_number_table_length]; 1695*0c56280aSSorin Basca\newline 1696*0c56280aSSorin Basca} 1697*0c56280aSSorin Basca\newline 1698*0c56280aSSorin Basca 1699*0c56280aSSorin Basca\family default 1700*0c56280aSSorin Basca 1701*0c56280aSSorin Basca\newline 1702*0c56280aSSorin BascaThis attribute describes the relation between source code line numbers and 1703*0c56280aSSorin Basca JVM instruction offsets in the 1704*0c56280aSSorin Basca\family typewriter 1705*0c56280aSSorin Bascacode 1706*0c56280aSSorin Basca\family default 1707*0c56280aSSorin Basca array of the 1708*0c56280aSSorin Basca\family typewriter 1709*0c56280aSSorin BascaCode_attribute 1710*0c56280aSSorin Basca\family default 1711*0c56280aSSorin Basca; it can be used by debuggers to show the source code of currently executing 1712*0c56280aSSorin Basca JVM machine instructions. 1713*0c56280aSSorin Basca This attribute is usually a sub-attribute of a 1714*0c56280aSSorin Basca\family typewriter 1715*0c56280aSSorin BascaCode_attribute 1716*0c56280aSSorin Basca\family default 1717*0c56280aSSorin Basca. 1718*0c56280aSSorin Basca Multiple 1719*0c56280aSSorin Basca\family typewriter 1720*0c56280aSSorin BascaLineNumberTable 1721*0c56280aSSorin Basca\family default 1722*0c56280aSSorin Basca attributes may together represent a given line of a source code file. 1723*0c56280aSSorin Basca 1724*0c56280aSSorin Basca\layout Subsection 1725*0c56280aSSorin Basca 1726*0c56280aSSorin BascaConstants 1727*0c56280aSSorin Basca\layout Standard 1728*0c56280aSSorin Basca 1729*0c56280aSSorin BascaAll the constants together form the 1730*0c56280aSSorin Basca\emph on 1731*0c56280aSSorin Bascaconstant pool 1732*0c56280aSSorin Basca\emph default 1733*0c56280aSSorin Basca. 1734*0c56280aSSorin Basca The general 1735*0c56280aSSorin Basca\family typewriter 1736*0c56280aSSorin Bascacp_info 1737*0c56280aSSorin Basca\family default 1738*0c56280aSSorin Basca structure is straightforward. 1739*0c56280aSSorin Basca\newline 1740*0c56280aSSorin Basca 1741*0c56280aSSorin Basca\newline 1742*0c56280aSSorin Basca 1743*0c56280aSSorin Basca\family typewriter 1744*0c56280aSSorin Bascacp_info { 1745*0c56280aSSorin Basca\newline 1746*0c56280aSSorin Basca\SpecialChar \- 1747*0c56280aSSorin Basca\SpecialChar ~ 1748*0c56280aSSorin Basca\SpecialChar ~ 1749*0c56280aSSorin Bascau1 tag; 1750*0c56280aSSorin Basca\newline 1751*0c56280aSSorin Basca\SpecialChar \- 1752*0c56280aSSorin Basca\SpecialChar ~ 1753*0c56280aSSorin Basca\SpecialChar ~ 1754*0c56280aSSorin Bascau1 info[]; 1755*0c56280aSSorin Basca\newline 1756*0c56280aSSorin Basca} 1757*0c56280aSSorin Basca\family default 1758*0c56280aSSorin Basca 1759*0c56280aSSorin Basca\newline 1760*0c56280aSSorin Basca 1761*0c56280aSSorin Basca\newline 1762*0c56280aSSorin BascaThe 'tag' defines what 'info' follows it. 1763*0c56280aSSorin Basca Constants define either constant values or constant symbolic references, 1764*0c56280aSSorin Basca such as references to other classes. 1765*0c56280aSSorin Basca Currently, eleven constant types are defined: 1766*0c56280aSSorin Basca\family typewriter 1767*0c56280aSSorin BascaClass 1768*0c56280aSSorin Basca\family default 1769*0c56280aSSorin Basca, 1770*0c56280aSSorin Basca\family typewriter 1771*0c56280aSSorin BascaField\SpecialChar \- 1772*0c56280aSSorin Bascaref 1773*0c56280aSSorin Basca\family default 1774*0c56280aSSorin Basca, 1775*0c56280aSSorin Basca\family typewriter 1776*0c56280aSSorin BascaMethod\SpecialChar \- 1777*0c56280aSSorin Bascaref 1778*0c56280aSSorin Basca\family default 1779*0c56280aSSorin Basca, 1780*0c56280aSSorin Basca\family typewriter 1781*0c56280aSSorin BascaIn\SpecialChar \- 1782*0c56280aSSorin Bascater\SpecialChar \- 1783*0c56280aSSorin Bascaface\SpecialChar \- 1784*0c56280aSSorin BascaMethod\SpecialChar \- 1785*0c56280aSSorin Bascaref 1786*0c56280aSSorin Basca\family default 1787*0c56280aSSorin Basca, 1788*0c56280aSSorin Basca\family typewriter 1789*0c56280aSSorin BascaString 1790*0c56280aSSorin Basca\family default 1791*0c56280aSSorin Basca, 1792*0c56280aSSorin Basca\family typewriter 1793*0c56280aSSorin BascaIn\SpecialChar \- 1794*0c56280aSSorin Bascateger 1795*0c56280aSSorin Basca\family default 1796*0c56280aSSorin Basca, 1797*0c56280aSSorin Basca\family typewriter 1798*0c56280aSSorin BascaFloat 1799*0c56280aSSorin Basca\family default 1800*0c56280aSSorin Basca, 1801*0c56280aSSorin Basca\family typewriter 1802*0c56280aSSorin BascaLong 1803*0c56280aSSorin Basca\family default 1804*0c56280aSSorin Basca, 1805*0c56280aSSorin Basca\family typewriter 1806*0c56280aSSorin BascaDouble 1807*0c56280aSSorin Basca\family default 1808*0c56280aSSorin Basca, 1809*0c56280aSSorin Basca\family typewriter 1810*0c56280aSSorin BascaName\SpecialChar \- 1811*0c56280aSSorin BascaAnd\SpecialChar \- 1812*0c56280aSSorin BascaType 1813*0c56280aSSorin Basca\family default 1814*0c56280aSSorin Basca and 1815*0c56280aSSorin Basca\family typewriter 1816*0c56280aSSorin BascaUtf8 1817*0c56280aSSorin Basca\family default 1818*0c56280aSSorin Basca. 1819*0c56280aSSorin Basca\layout Standard 1820*0c56280aSSorin Basca 1821*0c56280aSSorin BascaMost of the names are self-explanatory; the interested reader will find 1822*0c56280aSSorin Basca more information in the specification 1823*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 1824*0c56280aSSorin Basca 1825*0c56280aSSorin Basca\end_inset 1826*0c56280aSSorin Basca 1827*0c56280aSSorin Basca. 1828*0c56280aSSorin Basca Constants can be nested; this is done by referring to the constant pool 1829*0c56280aSSorin Basca index of the enclosed constant. 1830*0c56280aSSorin Basca\layout Standard 1831*0c56280aSSorin Basca 1832*0c56280aSSorin BascaSee the following examples. 1833*0c56280aSSorin Basca\newline 1834*0c56280aSSorin Basca 1835*0c56280aSSorin Basca\newline 1836*0c56280aSSorin Basca 1837*0c56280aSSorin Basca\family typewriter 1838*0c56280aSSorin BascaCONSTANT_Utf8_info { 1839*0c56280aSSorin Basca\newline 1840*0c56280aSSorin Basca\SpecialChar \- 1841*0c56280aSSorin Basca\SpecialChar ~ 1842*0c56280aSSorin Basca\SpecialChar ~ 1843*0c56280aSSorin Bascau1 tag; 1844*0c56280aSSorin Basca\newline 1845*0c56280aSSorin Basca\SpecialChar \- 1846*0c56280aSSorin Basca\SpecialChar ~ 1847*0c56280aSSorin Basca\SpecialChar ~ 1848*0c56280aSSorin Bascau2 length; 1849*0c56280aSSorin Basca\newline 1850*0c56280aSSorin Basca\SpecialChar \- 1851*0c56280aSSorin Basca\SpecialChar ~ 1852*0c56280aSSorin Basca\SpecialChar ~ 1853*0c56280aSSorin Bascau1 bytes[length]; 1854*0c56280aSSorin Basca\newline 1855*0c56280aSSorin Basca} 1856*0c56280aSSorin Basca\newline 1857*0c56280aSSorin Basca 1858*0c56280aSSorin Basca\newline 1859*0c56280aSSorin Basca 1860*0c56280aSSorin Basca\family default 1861*0c56280aSSorin BascaA CONSTANT_Utf8 represents a constant string. 1862*0c56280aSSorin Basca Such a string is e.g. 1863*0c56280aSSorin Basca used to describe names of methods, names of fields, names of attributes, 1864*0c56280aSSorin Basca types of methods or types of fields. 1865*0c56280aSSorin Basca This string is encoded in UTF-8 format, a variant of the unicode character 1866*0c56280aSSorin Basca set 1867*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Unicode} 1868*0c56280aSSorin Basca 1869*0c56280aSSorin Basca\end_inset 1870*0c56280aSSorin Basca 1871*0c56280aSSorin Basca. 1872*0c56280aSSorin Basca 1873*0c56280aSSorin Basca\family typewriter 1874*0c56280aSSorin Basca 1875*0c56280aSSorin Basca\family default 1876*0c56280aSSorin BascaThe tag for this type of constant is simply the number 1, as defined in 1877*0c56280aSSorin Basca the Java Virtual Machine Specification, Second Edition 1878*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 1879*0c56280aSSorin Basca 1880*0c56280aSSorin Basca\end_inset 1881*0c56280aSSorin Basca 1882*0c56280aSSorin Basca. 1883*0c56280aSSorin Basca\family typewriter 1884*0c56280aSSorin Basca 1885*0c56280aSSorin Basca\newline 1886*0c56280aSSorin Basca 1887*0c56280aSSorin Basca\newline 1888*0c56280aSSorin BascaCONSTANT_NameAndType_info { 1889*0c56280aSSorin Basca\newline 1890*0c56280aSSorin Basca\SpecialChar \- 1891*0c56280aSSorin Basca\SpecialChar ~ 1892*0c56280aSSorin Basca\SpecialChar ~ 1893*0c56280aSSorin Bascau1 tag; 1894*0c56280aSSorin Basca\newline 1895*0c56280aSSorin Basca\SpecialChar \- 1896*0c56280aSSorin Basca\SpecialChar ~ 1897*0c56280aSSorin Basca\SpecialChar ~ 1898*0c56280aSSorin Bascau2 name_index; 1899*0c56280aSSorin Basca\newline 1900*0c56280aSSorin Basca\SpecialChar \- 1901*0c56280aSSorin Basca\SpecialChar ~ 1902*0c56280aSSorin Basca\SpecialChar ~ 1903*0c56280aSSorin Bascau2 descriptor_index; 1904*0c56280aSSorin Basca\newline 1905*0c56280aSSorin Basca} 1906*0c56280aSSorin Basca\family default 1907*0c56280aSSorin Basca 1908*0c56280aSSorin Basca\newline 1909*0c56280aSSorin Basca 1910*0c56280aSSorin Basca\newline 1911*0c56280aSSorin BascaA Constant_NameAndType represents a name and a signature of a method, the 1912*0c56280aSSorin Basca tag is the number 12. 1913*0c56280aSSorin Basca 1914*0c56280aSSorin Basca\family typewriter 1915*0c56280aSSorin Basca 1916*0c56280aSSorin Basca\family default 1917*0c56280aSSorin BascaBoth 1918*0c56280aSSorin Basca\family typewriter 1919*0c56280aSSorin Bascaclass_index 1920*0c56280aSSorin Basca\family default 1921*0c56280aSSorin Bascaand 1922*0c56280aSSorin Basca\family typewriter 1923*0c56280aSSorin Basca descriptor_index 1924*0c56280aSSorin Basca\family default 1925*0c56280aSSorin Bascarefer to a 1926*0c56280aSSorin Basca\family typewriter 1927*0c56280aSSorin Basca CONSTANT_Utf8 1928*0c56280aSSorin Basca\family default 1929*0c56280aSSorin Basca. 1930*0c56280aSSorin Basca\family typewriter 1931*0c56280aSSorin Basca 1932*0c56280aSSorin Basca\newline 1933*0c56280aSSorin Basca 1934*0c56280aSSorin Basca\newline 1935*0c56280aSSorin BascaCONSTANT_InterfaceMethodref_info { 1936*0c56280aSSorin Basca\newline 1937*0c56280aSSorin Basca\SpecialChar \- 1938*0c56280aSSorin Basca\SpecialChar ~ 1939*0c56280aSSorin Basca\SpecialChar ~ 1940*0c56280aSSorin Bascau1 tag; 1941*0c56280aSSorin Basca\newline 1942*0c56280aSSorin Basca\SpecialChar \- 1943*0c56280aSSorin Basca\SpecialChar ~ 1944*0c56280aSSorin Basca\SpecialChar ~ 1945*0c56280aSSorin Bascau2 class_index; 1946*0c56280aSSorin Basca\newline 1947*0c56280aSSorin Basca\SpecialChar \- 1948*0c56280aSSorin Basca\SpecialChar ~ 1949*0c56280aSSorin Basca\SpecialChar ~ 1950*0c56280aSSorin Bascau2 name_and_type_index; 1951*0c56280aSSorin Basca\newline 1952*0c56280aSSorin Basca} 1953*0c56280aSSorin Basca\family default 1954*0c56280aSSorin Basca 1955*0c56280aSSorin Basca\newline 1956*0c56280aSSorin Basca 1957*0c56280aSSorin Basca\newline 1958*0c56280aSSorin BascaA 1959*0c56280aSSorin Basca\family typewriter 1960*0c56280aSSorin BascaCONSTANT_InterfaceMethodref 1961*0c56280aSSorin Basca\family default 1962*0c56280aSSorin Basca describes a reference to a method defined in an interface class (see section 1963*0c56280aSSorin Basca 1964*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 1965*0c56280aSSorin Basca 1966*0c56280aSSorin Basca\end_inset 1967*0c56280aSSorin Basca 1968*0c56280aSSorin Basca for an explanation of interfaces), the tag is number 11. 1969*0c56280aSSorin Basca The interface class is referenced via a two-byte index into the constant 1970*0c56280aSSorin Basca pool. 1971*0c56280aSSorin Basca A 1972*0c56280aSSorin Basca\family typewriter 1973*0c56280aSSorin BascaConstant_Class 1974*0c56280aSSorin Basca\family default 1975*0c56280aSSorin Basca is expected there describing a reference to some class file. 1976*0c56280aSSorin Basca Every method has a name, zero or more argument types and a return type; 1977*0c56280aSSorin Basca this is described in the 1978*0c56280aSSorin Basca\family typewriter 1979*0c56280aSSorin BascaCONSTANT_NameAndType 1980*0c56280aSSorin Basca\family default 1981*0c56280aSSorin Basca that is also referenced via a two-byte constant pool index. 1982*0c56280aSSorin Basca\layout Standard 1983*0c56280aSSorin Basca 1984*0c56280aSSorin BascaNote that there are implicit constraints on the integrity of a class file: 1985*0c56280aSSorin Basca for example, there must not be a 1986*0c56280aSSorin Basca\family typewriter 1987*0c56280aSSorin BascaCONSTANT_Integer 1988*0c56280aSSorin Basca\family default 1989*0c56280aSSorin Basca where a 1990*0c56280aSSorin Basca\family typewriter 1991*0c56280aSSorin BascaCONSTANT_Utf8 1992*0c56280aSSorin Basca\family default 1993*0c56280aSSorin Basca is expected for a certain entity. 1994*0c56280aSSorin Basca As another example, the names and the types of methods are encoded as strings 1995*0c56280aSSorin Basca in UTF-8 format 1996*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Unicode} 1997*0c56280aSSorin Basca 1998*0c56280aSSorin Basca\end_inset 1999*0c56280aSSorin Basca 2000*0c56280aSSorin Basca. 2001*0c56280aSSorin Basca They have to be well-formed (according to the specification) to be valid. 2002*0c56280aSSorin Basca\layout Subsection 2003*0c56280aSSorin Basca 2004*0c56280aSSorin Basca 2005*0c56280aSSorin Basca\begin_inset LatexCommand \label{Fields} 2006*0c56280aSSorin Basca 2007*0c56280aSSorin Basca\end_inset 2008*0c56280aSSorin Basca 2009*0c56280aSSorin BascaFields 2010*0c56280aSSorin Basca\layout Standard 2011*0c56280aSSorin Basca 2012*0c56280aSSorin BascaEach field is described by a field_info structure as defined below. 2013*0c56280aSSorin Basca\newline 2014*0c56280aSSorin Basca 2015*0c56280aSSorin Basca\newline 2016*0c56280aSSorin Basca 2017*0c56280aSSorin Basca\family typewriter 2018*0c56280aSSorin Bascafield_info { 2019*0c56280aSSorin Basca\newline 2020*0c56280aSSorin Basca\SpecialChar \- 2021*0c56280aSSorin Basca\SpecialChar ~ 2022*0c56280aSSorin Basca\SpecialChar ~ 2023*0c56280aSSorin Bascau2 access_flags; 2024*0c56280aSSorin Basca\newline 2025*0c56280aSSorin Basca\SpecialChar \- 2026*0c56280aSSorin Basca\SpecialChar ~ 2027*0c56280aSSorin Basca\SpecialChar ~ 2028*0c56280aSSorin Bascau2 name_index; 2029*0c56280aSSorin Basca\newline 2030*0c56280aSSorin Basca\SpecialChar \- 2031*0c56280aSSorin Basca\SpecialChar ~ 2032*0c56280aSSorin Basca\SpecialChar ~ 2033*0c56280aSSorin Bascau2 descriptor_index; 2034*0c56280aSSorin Basca\newline 2035*0c56280aSSorin Basca\SpecialChar \- 2036*0c56280aSSorin Basca\SpecialChar ~ 2037*0c56280aSSorin Basca\SpecialChar ~ 2038*0c56280aSSorin Bascau2 attributes_count; 2039*0c56280aSSorin Basca\newline 2040*0c56280aSSorin Basca\SpecialChar \- 2041*0c56280aSSorin Basca\SpecialChar ~ 2042*0c56280aSSorin Basca\SpecialChar ~ 2043*0c56280aSSorin Bascaattribute_info attributes[attributes_count]; 2044*0c56280aSSorin Basca\family default 2045*0c56280aSSorin Basca 2046*0c56280aSSorin Basca\newline 2047*0c56280aSSorin Basca} 2048*0c56280aSSorin Basca\newline 2049*0c56280aSSorin Basca 2050*0c56280aSSorin Basca\newline 2051*0c56280aSSorin BascaA field has to be unique in a class file with respect to its name and descriptor 2052*0c56280aSSorin Basca\begin_float footnote 2053*0c56280aSSorin Basca\layout Standard 2054*0c56280aSSorin Basca 2055*0c56280aSSorin BascaThe descriptor of a field describes its type. 2056*0c56280aSSorin Basca E.g., a descriptor of 2057*0c56280aSSorin Basca\begin_inset Quotes eld 2058*0c56280aSSorin Basca\end_inset 2059*0c56280aSSorin Basca 2060*0c56280aSSorin Basca[I 2061*0c56280aSSorin Basca\begin_inset Quotes erd 2062*0c56280aSSorin Basca\end_inset 2063*0c56280aSSorin Basca 2064*0c56280aSSorin Basca means 2065*0c56280aSSorin Basca\begin_inset Quotes eld 2066*0c56280aSSorin Basca\end_inset 2067*0c56280aSSorin Basca 2068*0c56280aSSorin Bascaone-dimensional array of 2069*0c56280aSSorin Basca\family typewriter 2070*0c56280aSSorin Bascaint 2071*0c56280aSSorin Basca\family default 2072*0c56280aSSorin Basca 2073*0c56280aSSorin Basca\begin_inset Quotes erd 2074*0c56280aSSorin Basca\end_inset 2075*0c56280aSSorin Basca 2076*0c56280aSSorin Basca. 2077*0c56280aSSorin Basca\end_float 2078*0c56280aSSorin Basca. 2079*0c56280aSSorin Basca We see that fields reference constants in the constant pool via their constant 2080*0c56280aSSorin Basca pool indices (such as a 2081*0c56280aSSorin Basca\family typewriter 2082*0c56280aSSorin BascaCONSTANT_Utf8 2083*0c56280aSSorin Basca\family default 2084*0c56280aSSorin Basca describing a field's name). 2085*0c56280aSSorin Basca An important attribute used by fields is the ConstantValue attribute (see 2086*0c56280aSSorin Basca section 2087*0c56280aSSorin Basca\begin_inset LatexCommand \ref{ConstantValueAttribute} 2088*0c56280aSSorin Basca 2089*0c56280aSSorin Basca\end_inset 2090*0c56280aSSorin Basca 2091*0c56280aSSorin Basca). 2092*0c56280aSSorin Basca\layout Standard 2093*0c56280aSSorin Basca 2094*0c56280aSSorin BascaThe 2095*0c56280aSSorin Basca\family typewriter 2096*0c56280aSSorin Bascaaccess_flags 2097*0c56280aSSorin Basca\family default 2098*0c56280aSSorin Basca entry is a bit vector that specifies the accessibility and other properties 2099*0c56280aSSorin Basca\begin_float footnote 2100*0c56280aSSorin Basca\layout Standard 2101*0c56280aSSorin Basca 2102*0c56280aSSorin BascaOften called 2103*0c56280aSSorin Basca\emph on 2104*0c56280aSSorin Bascavisibility 2105*0c56280aSSorin Basca\emph default 2106*0c56280aSSorin Basca. 2107*0c56280aSSorin Basca\end_float 2108*0c56280aSSorin Basca of the field. 2109*0c56280aSSorin Basca E.g., a field with the 2110*0c56280aSSorin Basca\family typewriter 2111*0c56280aSSorin BascaACC_PRIVATE 2112*0c56280aSSorin Basca\begin_float footnote 2113*0c56280aSSorin Basca\layout Standard 2114*0c56280aSSorin Basca 2115*0c56280aSSorin BascaBit number 1. 2116*0c56280aSSorin Basca\end_float 2117*0c56280aSSorin Basca bit set is not accessible to other classes. 2118*0c56280aSSorin Basca A field with the 2119*0c56280aSSorin Basca\family typewriter 2120*0c56280aSSorin BascaACC_PUBLIC 2121*0c56280aSSorin Basca\begin_float footnote 2122*0c56280aSSorin Basca\layout Standard 2123*0c56280aSSorin Basca 2124*0c56280aSSorin BascaBit number 0. 2125*0c56280aSSorin Basca\end_float 2126*0c56280aSSorin Basca bit set is accessible to any other class. 2127*0c56280aSSorin Basca Any combination with both the 2128*0c56280aSSorin Basca\family typewriter 2129*0c56280aSSorin BascaACC_PRIVATE 2130*0c56280aSSorin Basca\family default 2131*0c56280aSSorin Basca and the 2132*0c56280aSSorin Basca\family typewriter 2133*0c56280aSSorin BascaACC_PUBLIC 2134*0c56280aSSorin Basca\family default 2135*0c56280aSSorin Basca bit set is not valid. 2136*0c56280aSSorin Basca\layout Standard 2137*0c56280aSSorin Basca 2138*0c56280aSSorin BascaThe 2139*0c56280aSSorin Basca\family typewriter 2140*0c56280aSSorin Bascadescriptor_index 2141*0c56280aSSorin Basca\family default 2142*0c56280aSSorin Basca refers to a 2143*0c56280aSSorin Basca\family typewriter 2144*0c56280aSSorin BascaCONSTANT_Utf8 2145*0c56280aSSorin Basca\family default 2146*0c56280aSSorin Basca that symbolically encodes the type of the field. 2147*0c56280aSSorin Basca\layout Subsection 2148*0c56280aSSorin Basca 2149*0c56280aSSorin Basca 2150*0c56280aSSorin Basca\begin_inset LatexCommand \label{Methods} 2151*0c56280aSSorin Basca 2152*0c56280aSSorin Basca\end_inset 2153*0c56280aSSorin Basca 2154*0c56280aSSorin BascaMethods 2155*0c56280aSSorin Basca\layout Standard 2156*0c56280aSSorin Basca 2157*0c56280aSSorin BascaEach method is described by a method_info structure as defined below. 2158*0c56280aSSorin Basca\newline 2159*0c56280aSSorin Basca 2160*0c56280aSSorin Basca\newline 2161*0c56280aSSorin Basca 2162*0c56280aSSorin Basca\family typewriter 2163*0c56280aSSorin Bascamethod_info { 2164*0c56280aSSorin Basca\newline 2165*0c56280aSSorin Basca\SpecialChar \- 2166*0c56280aSSorin Basca\SpecialChar ~ 2167*0c56280aSSorin Basca\SpecialChar ~ 2168*0c56280aSSorin Bascau2 access_flags; 2169*0c56280aSSorin Basca\newline 2170*0c56280aSSorin Basca\SpecialChar \- 2171*0c56280aSSorin Basca\SpecialChar ~ 2172*0c56280aSSorin Basca\SpecialChar ~ 2173*0c56280aSSorin Bascau2 name_index; 2174*0c56280aSSorin Basca\newline 2175*0c56280aSSorin Basca\SpecialChar \- 2176*0c56280aSSorin Basca\SpecialChar ~ 2177*0c56280aSSorin Basca\SpecialChar ~ 2178*0c56280aSSorin Bascau2 descriptor_index; 2179*0c56280aSSorin Basca\newline 2180*0c56280aSSorin Basca\SpecialChar \- 2181*0c56280aSSorin Basca\SpecialChar ~ 2182*0c56280aSSorin Basca\SpecialChar ~ 2183*0c56280aSSorin Bascau2 attributes_count; 2184*0c56280aSSorin Basca\newline 2185*0c56280aSSorin Basca\SpecialChar \- 2186*0c56280aSSorin Basca\SpecialChar ~ 2187*0c56280aSSorin Basca\SpecialChar ~ 2188*0c56280aSSorin Bascaattribute_info attributes[attributes_count]; 2189*0c56280aSSorin Basca\newline 2190*0c56280aSSorin Basca} 2191*0c56280aSSorin Basca\family default 2192*0c56280aSSorin Basca 2193*0c56280aSSorin Basca\newline 2194*0c56280aSSorin Basca 2195*0c56280aSSorin Basca\newline 2196*0c56280aSSorin BascaAs we can easily see, this is exactly the same structure we already know 2197*0c56280aSSorin Basca as 2198*0c56280aSSorin Basca\family typewriter 2199*0c56280aSSorin Bascafield_info 2200*0c56280aSSorin Basca\family default 2201*0c56280aSSorin Basca (see section 2202*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Fields} 2203*0c56280aSSorin Basca 2204*0c56280aSSorin Basca\end_inset 2205*0c56280aSSorin Basca 2206*0c56280aSSorin Basca). 2207*0c56280aSSorin Basca The difference lies in the meaning of the enlisted entities. 2208*0c56280aSSorin Basca For example, an access flag saying a field was volatile (non-cacheable) 2209*0c56280aSSorin Basca would not make any sense if set in a 2210*0c56280aSSorin Basca\family typewriter 2211*0c56280aSSorin Bascamethod_info 2212*0c56280aSSorin Basca\family default 2213*0c56280aSSorin Basca structure. 2214*0c56280aSSorin Basca Vice versa, an access flag saying the floating point instructions should 2215*0c56280aSSorin Basca work in 2216*0c56280aSSorin Basca\begin_inset Quotes eld 2217*0c56280aSSorin Basca\end_inset 2218*0c56280aSSorin Basca 2219*0c56280aSSorin BascaFP-strict 2220*0c56280aSSorin Basca\begin_inset Quotes erd 2221*0c56280aSSorin Basca\end_inset 2222*0c56280aSSorin Basca 2223*0c56280aSSorin Basca mode would be of no use if set in a 2224*0c56280aSSorin Basca\family typewriter 2225*0c56280aSSorin Bascafield_info 2226*0c56280aSSorin Basca\family default 2227*0c56280aSSorin Basca structure. 2228*0c56280aSSorin Basca\layout Standard 2229*0c56280aSSorin Basca 2230*0c56280aSSorin BascaMethods use a different set of attributes than fields; for example, the 2231*0c56280aSSorin Basca 2232*0c56280aSSorin Basca\family typewriter 2233*0c56280aSSorin BascaConstant\SpecialChar \- 2234*0c56280aSSorin BascaValue 2235*0c56280aSSorin Basca\family default 2236*0c56280aSSorin Basca attribute (see section 2237*0c56280aSSorin Basca\begin_inset LatexCommand \ref{ConstantValueAttribute} 2238*0c56280aSSorin Basca 2239*0c56280aSSorin Basca\end_inset 2240*0c56280aSSorin Basca 2241*0c56280aSSorin Basca) is of no use here. 2242*0c56280aSSorin Basca The 2243*0c56280aSSorin Basca\family typewriter 2244*0c56280aSSorin BascaCode 2245*0c56280aSSorin Basca\family default 2246*0c56280aSSorin Basca and 2247*0c56280aSSorin Basca\family typewriter 2248*0c56280aSSorin BascaExceptions 2249*0c56280aSSorin Basca\family default 2250*0c56280aSSorin Basca attributes frequently used by methods are of no use for fields on the other 2251*0c56280aSSorin Basca hand. 2252*0c56280aSSorin Basca\layout Section 2253*0c56280aSSorin Basca 2254*0c56280aSSorin BascaThe Execution Engine 2255*0c56280aSSorin Basca\layout Standard 2256*0c56280aSSorin Basca 2257*0c56280aSSorin BascaBefore a piece of code (the code of a 2258*0c56280aSSorin Basca\begin_inset Quotes eld 2259*0c56280aSSorin Basca\end_inset 2260*0c56280aSSorin Basca 2261*0c56280aSSorin Bascamethod 2262*0c56280aSSorin Basca\begin_inset Quotes erd 2263*0c56280aSSorin Basca\end_inset 2264*0c56280aSSorin Basca 2265*0c56280aSSorin Basca) is executed, an 2266*0c56280aSSorin Basca\emph on 2267*0c56280aSSorin Bascaexecution frame 2268*0c56280aSSorin Basca\emph default 2269*0c56280aSSorin Basca is set up. 2270*0c56280aSSorin Basca It consists of a program counter (as known from traditional CPUs), a set 2271*0c56280aSSorin Basca of local variables (similar to registers known from traditional CPUs), 2272*0c56280aSSorin Basca and an operand stack. 2273*0c56280aSSorin Basca For each new invocation instance of a method, a new execution frame is 2274*0c56280aSSorin Basca set up; it is destroyed on method termination. 2275*0c56280aSSorin Basca\layout Standard 2276*0c56280aSSorin Basca 2277*0c56280aSSorin BascaBecause a method may invoke other methods or itself recursively, there is 2278*0c56280aSSorin Basca a global method invocation stack. 2279*0c56280aSSorin Basca\layout Standard 2280*0c56280aSSorin Basca 2281*0c56280aSSorin BascaThere also is a garbage-collected heap shared among the execution frames. 2282*0c56280aSSorin Basca This heap is used for object allocation (see section 2283*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Instructions} 2284*0c56280aSSorin Basca 2285*0c56280aSSorin Basca\end_inset 2286*0c56280aSSorin Basca 2287*0c56280aSSorin Basca). 2288*0c56280aSSorin Basca\layout Standard 2289*0c56280aSSorin Basca 2290*0c56280aSSorin BascaThe number of local variables is not fixed. 2291*0c56280aSSorin Basca Every method defines how many local variables are used for its code (up 2292*0c56280aSSorin Basca to 65536). 2293*0c56280aSSorin Basca\layout Standard 2294*0c56280aSSorin Basca 2295*0c56280aSSorin BascaAlso note that there is no equivalent of a 2296*0c56280aSSorin Basca\emph on 2297*0c56280aSSorin BascaProcessor Status Word 2298*0c56280aSSorin Basca\emph default 2299*0c56280aSSorin Basca (PSW) in the JVM. 2300*0c56280aSSorin Basca Traditionally, a PSW has flags that are set implicitly during execution 2301*0c56280aSSorin Basca of the instructions (such as an overflow or is-zero flag). 2302*0c56280aSSorin Basca This is often used for conditional branching. 2303*0c56280aSSorin Basca The JVM, however, uses the operand stack to store the result of a comparison 2304*0c56280aSSorin Basca instruction explicitly. 2305*0c56280aSSorin Basca This result is often read from the stack by the JVM's conditional branching 2306*0c56280aSSorin Basca instructions. 2307*0c56280aSSorin Basca\layout Standard 2308*0c56280aSSorin Basca 2309*0c56280aSSorin BascaShould exceptional situations occur (such as an out-of-memory situation), 2310*0c56280aSSorin Basca the JVM does not lock up. 2311*0c56280aSSorin Basca Instead, an 2312*0c56280aSSorin Basca\begin_inset Quotes eld 2313*0c56280aSSorin Basca\end_inset 2314*0c56280aSSorin Basca 2315*0c56280aSSorin Bascaexception is thrown 2316*0c56280aSSorin Basca\begin_inset Quotes erd 2317*0c56280aSSorin Basca\end_inset 2318*0c56280aSSorin Basca 2319*0c56280aSSorin Basca; the currently executing program is signalled. 2320*0c56280aSSorin Basca These signals can be processed ( 2321*0c56280aSSorin Basca\begin_inset Quotes eld 2322*0c56280aSSorin Basca\end_inset 2323*0c56280aSSorin Basca 2324*0c56280aSSorin Bascaexceptions can be caught 2325*0c56280aSSorin Basca\begin_inset Quotes erd 2326*0c56280aSSorin Basca\end_inset 2327*0c56280aSSorin Basca 2328*0c56280aSSorin Basca). 2329*0c56280aSSorin Basca If such a signal is not handled by the currently executing method, the 2330*0c56280aSSorin Basca JVM will search a handler through the invocation hierarchy and stop execution 2331*0c56280aSSorin Basca only if none was found. 2332*0c56280aSSorin Basca\layout Standard 2333*0c56280aSSorin Basca 2334*0c56280aSSorin BascaThere is a thread mechanism in the JVM. 2335*0c56280aSSorin Basca Basically every thread creates an own method invocation stack (so there 2336*0c56280aSSorin Basca may be more than one active execution frame at a time), but this feature 2337*0c56280aSSorin Basca is not important for the rest of this text. 2338*0c56280aSSorin Basca\layout Standard 2339*0c56280aSSorin Basca 2340*0c56280aSSorin Basca\begin_float fig 2341*0c56280aSSorin Basca\layout Standard 2342*0c56280aSSorin Basca\align center 2343*0c56280aSSorin Basca 2344*0c56280aSSorin Basca\begin_inset Figure size 595 379 2345*0c56280aSSorin Bascafile exframe.eps 2346*0c56280aSSorin Bascawidth 3 100 2347*0c56280aSSorin Bascaflags 9 2348*0c56280aSSorin Basca 2349*0c56280aSSorin Basca\end_inset 2350*0c56280aSSorin Basca 2351*0c56280aSSorin Basca 2352*0c56280aSSorin Basca\layout Standard 2353*0c56280aSSorin Basca 2354*0c56280aSSorin BascaThis figure shows a method invocation stack. 2355*0c56280aSSorin Basca Method 2356*0c56280aSSorin Basca\family typewriter 2357*0c56280aSSorin Bascamain 2358*0c56280aSSorin Basca\family default 2359*0c56280aSSorin Basca was invoked by the system, 2360*0c56280aSSorin Basca\family typewriter 2361*0c56280aSSorin Bascamain 2362*0c56280aSSorin Basca\family default 2363*0c56280aSSorin Basca invoked 2364*0c56280aSSorin Basca\family typewriter 2365*0c56280aSSorin Bascafoo 2366*0c56280aSSorin Basca\family default 2367*0c56280aSSorin Basca, 2368*0c56280aSSorin Basca\family typewriter 2369*0c56280aSSorin Bascafoo 2370*0c56280aSSorin Basca\family default 2371*0c56280aSSorin Basca invoked 2372*0c56280aSSorin Basca\family typewriter 2373*0c56280aSSorin Bascabar 2374*0c56280aSSorin Basca\family default 2375*0c56280aSSorin Basca, and 2376*0c56280aSSorin Basca\family typewriter 2377*0c56280aSSorin Bascabar 2378*0c56280aSSorin Basca\family default 2379*0c56280aSSorin Basca invoked 2380*0c56280aSSorin Basca\family typewriter 2381*0c56280aSSorin Bascafoo 2382*0c56280aSSorin Basca\family default 2383*0c56280aSSorin Basca recursively. 2384*0c56280aSSorin Basca This figure assumes 2385*0c56280aSSorin Basca\family typewriter 2386*0c56280aSSorin Bascamain 2387*0c56280aSSorin Basca\family default 2388*0c56280aSSorin Basca allocates one local variable and one operand stack slot, 2389*0c56280aSSorin Basca\family typewriter 2390*0c56280aSSorin Bascafoo 2391*0c56280aSSorin Basca\family default 2392*0c56280aSSorin Basca allocates three local variables and two operand stack slots and 2393*0c56280aSSorin Basca\family typewriter 2394*0c56280aSSorin Bascabar 2395*0c56280aSSorin Basca\family default 2396*0c56280aSSorin Basca allocates one local variable and two operand stack slots. 2397*0c56280aSSorin Basca\layout Caption 2398*0c56280aSSorin Basca 2399*0c56280aSSorin BascaMethod Invocation Stack 2400*0c56280aSSorin Basca\end_float 2401*0c56280aSSorin Basca\layout Subsection 2402*0c56280aSSorin Basca 2403*0c56280aSSorin Basca 2404*0c56280aSSorin Basca\begin_inset LatexCommand \label{LV_and_OpStack} 2405*0c56280aSSorin Basca 2406*0c56280aSSorin Basca\end_inset 2407*0c56280aSSorin Basca 2408*0c56280aSSorin BascaLocal Variables and the Operand Stack 2409*0c56280aSSorin Basca\layout Standard 2410*0c56280aSSorin Basca 2411*0c56280aSSorin BascaThe method information in a class file defines how many local variables 2412*0c56280aSSorin Basca are used on this method's invocation. 2413*0c56280aSSorin Basca It also defines the maximum operand stack size. 2414*0c56280aSSorin Basca Together, the local variables array and the operand stack are called the 2415*0c56280aSSorin Basca 2416*0c56280aSSorin Basca\emph on 2417*0c56280aSSorin Bascaexecution frame 2418*0c56280aSSorin Basca\emph default 2419*0c56280aSSorin Basca. 2420*0c56280aSSorin Basca\layout Standard 2421*0c56280aSSorin Basca 2422*0c56280aSSorin BascaA single stack slot has a width of 32 bits, which is also the width of a 2423*0c56280aSSorin Basca local variable. 2424*0c56280aSSorin Basca Therefore, values of types that occupy 64 bits ( 2425*0c56280aSSorin Basca\emph on 2426*0c56280aSSorin Bascadouble 2427*0c56280aSSorin Basca\emph default 2428*0c56280aSSorin Basca and 2429*0c56280aSSorin Basca\emph on 2430*0c56280aSSorin Bascalong 2431*0c56280aSSorin Basca\emph default 2432*0c56280aSSorin Basca) must be stored in two consecutive stack slots or local variables. 2433*0c56280aSSorin Basca\layout Standard 2434*0c56280aSSorin Basca 2435*0c56280aSSorin BascaThe verifier takes care that the stack cannot overflow and that it cannot 2436*0c56280aSSorin Basca underflow. 2437*0c56280aSSorin Basca Also, it takes care that instructions may only access local variables if 2438*0c56280aSSorin Basca they contain a value of a known, correct type (see section 2439*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass3Spec} 2440*0c56280aSSorin Basca 2441*0c56280aSSorin Basca\end_inset 2442*0c56280aSSorin Basca 2443*0c56280aSSorin Basca). 2444*0c56280aSSorin Basca 2445*0c56280aSSorin Basca\layout Subsection 2446*0c56280aSSorin Basca 2447*0c56280aSSorin Basca 2448*0c56280aSSorin Basca\begin_inset LatexCommand \label{Instructions} 2449*0c56280aSSorin Basca 2450*0c56280aSSorin Basca\end_inset 2451*0c56280aSSorin Basca 2452*0c56280aSSorin BascaIntroduction to JVM Instructions 2453*0c56280aSSorin Basca\layout Standard 2454*0c56280aSSorin Basca 2455*0c56280aSSorin BascaThis section is derived from section 2.2 of 2456*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL98} 2457*0c56280aSSorin Basca 2458*0c56280aSSorin Basca\end_inset 2459*0c56280aSSorin Basca 2460*0c56280aSSorin Basca, used with permission of the author. 2461*0c56280aSSorin Basca\layout Standard 2462*0c56280aSSorin Basca 2463*0c56280aSSorin BascaThe JVM's instruction set currently consists of 212 instructions, 44 opcodes 2464*0c56280aSSorin Basca are marked as reserved and may be used for future extensions or intermediate 2465*0c56280aSSorin Basca optimizations within the Virtual Machine. 2466*0c56280aSSorin Basca The instruction set can be roughly grouped as follows: 2467*0c56280aSSorin Basca\layout Description 2468*0c56280aSSorin Basca 2469*0c56280aSSorin BascaStack\SpecialChar ~ 2470*0c56280aSSorin Bascaoperations: Constants can be pushed onto the stack either by loading 2471*0c56280aSSorin Basca them from the constant pool with the 2472*0c56280aSSorin Basca\latex latex 2473*0c56280aSSorin Basca 2474*0c56280aSSorin Basca\backslash 2475*0c56280aSSorin Bascatexttt{ldc} 2476*0c56280aSSorin Basca\latex default 2477*0c56280aSSorin Basca instruction or with special ``short-cut'' instructions where the operand 2478*0c56280aSSorin Basca is encoded into the instructions, e.g., 2479*0c56280aSSorin Basca\latex latex 2480*0c56280aSSorin Basca 2481*0c56280aSSorin Basca\backslash 2482*0c56280aSSorin Bascatexttt{iconst 2483*0c56280aSSorin Basca\backslash 2484*0c56280aSSorin Basca_0} 2485*0c56280aSSorin Basca\latex default 2486*0c56280aSSorin Basca or 2487*0c56280aSSorin Basca\latex latex 2488*0c56280aSSorin Basca 2489*0c56280aSSorin Basca\backslash 2490*0c56280aSSorin Bascatexttt{bipush} 2491*0c56280aSSorin Basca\latex default 2492*0c56280aSSorin Basca (push byte value). 2493*0c56280aSSorin Basca\layout Description 2494*0c56280aSSorin Basca 2495*0c56280aSSorin BascaArithmetic\SpecialChar ~ 2496*0c56280aSSorin Bascaoperations: The instruction set of the JVM distinguishes its operand 2497*0c56280aSSorin Basca types using different instructions to operate on values of specific type. 2498*0c56280aSSorin Basca Arithmetic operations starting with 2499*0c56280aSSorin Basca\latex latex 2500*0c56280aSSorin Basca 2501*0c56280aSSorin Basca\backslash 2502*0c56280aSSorin Bascatexttt{i} 2503*0c56280aSSorin Basca\latex default 2504*0c56280aSSorin Basca, for example, denote an integer operation. 2505*0c56280aSSorin Basca E.g., 2506*0c56280aSSorin Basca\latex latex 2507*0c56280aSSorin Basca 2508*0c56280aSSorin Basca\backslash 2509*0c56280aSSorin Bascatexttt{iadd} 2510*0c56280aSSorin Basca\latex default 2511*0c56280aSSorin Basca that adds two integers and pushes the result back on the operand stack. 2512*0c56280aSSorin Basca The Java types 2513*0c56280aSSorin Basca\latex latex 2514*0c56280aSSorin Basca 2515*0c56280aSSorin Basca\backslash 2516*0c56280aSSorin Bascatexttt{boolean} 2517*0c56280aSSorin Basca\latex default 2518*0c56280aSSorin Basca, 2519*0c56280aSSorin Basca\latex latex 2520*0c56280aSSorin Basca 2521*0c56280aSSorin Basca\backslash 2522*0c56280aSSorin Bascatexttt{byte} 2523*0c56280aSSorin Basca\latex default 2524*0c56280aSSorin Basca, 2525*0c56280aSSorin Basca\latex latex 2526*0c56280aSSorin Basca 2527*0c56280aSSorin Basca\backslash 2528*0c56280aSSorin Bascatexttt{short} 2529*0c56280aSSorin Basca\latex default 2530*0c56280aSSorin Basca, and 2531*0c56280aSSorin Basca\latex latex 2532*0c56280aSSorin Basca 2533*0c56280aSSorin Basca\backslash 2534*0c56280aSSorin Bascatexttt{char} 2535*0c56280aSSorin Basca\latex default 2536*0c56280aSSorin Basca are handled as integers by the JVM. 2537*0c56280aSSorin Basca\layout Description 2538*0c56280aSSorin Basca 2539*0c56280aSSorin Basca 2540*0c56280aSSorin Basca\begin_inset LatexCommand \label{RetDesc} 2541*0c56280aSSorin Basca 2542*0c56280aSSorin Basca\end_inset 2543*0c56280aSSorin Basca 2544*0c56280aSSorin BascaControl\SpecialChar ~ 2545*0c56280aSSorin Bascaflow: There are branch instructions like 2546*0c56280aSSorin Basca\latex latex 2547*0c56280aSSorin Basca 2548*0c56280aSSorin Basca\backslash 2549*0c56280aSSorin Bascatexttt{goto} 2550*0c56280aSSorin Basca\latex default 2551*0c56280aSSorin Bascaand 2552*0c56280aSSorin Basca\latex latex 2553*0c56280aSSorin Basca 2554*0c56280aSSorin Basca\backslash 2555*0c56280aSSorin Bascatexttt{if 2556*0c56280aSSorin Basca\backslash 2557*0c56280aSSorin Basca_icmpeq} 2558*0c56280aSSorin Basca\latex default 2559*0c56280aSSorin Basca, which compares two integers for equality. 2560*0c56280aSSorin Basca There is also a 2561*0c56280aSSorin Basca\latex latex 2562*0c56280aSSorin Basca 2563*0c56280aSSorin Basca\backslash 2564*0c56280aSSorin Bascatexttt{jsr} 2565*0c56280aSSorin Basca\begin_float footnote 2566*0c56280aSSorin Basca\layout Standard 2567*0c56280aSSorin Basca 2568*0c56280aSSorin BascaThere is a 2569*0c56280aSSorin Basca\begin_inset Quotes eld 2570*0c56280aSSorin Basca\end_inset 2571*0c56280aSSorin Basca 2572*0c56280aSSorin Bascawide 2573*0c56280aSSorin Basca\begin_inset Quotes erd 2574*0c56280aSSorin Basca\end_inset 2575*0c56280aSSorin Basca 2576*0c56280aSSorin Basca version of 2577*0c56280aSSorin Basca\latex latex 2578*0c56280aSSorin Basca 2579*0c56280aSSorin Basca\backslash 2580*0c56280aSSorin Bascatexttt{jsr} 2581*0c56280aSSorin Basca\latex default 2582*0c56280aSSorin Basca called 2583*0c56280aSSorin Basca\latex latex 2584*0c56280aSSorin Basca 2585*0c56280aSSorin Basca\backslash 2586*0c56280aSSorin Bascatexttt{jsr 2587*0c56280aSSorin Basca\backslash 2588*0c56280aSSorin Basca_w} 2589*0c56280aSSorin Basca\latex default 2590*0c56280aSSorin Basca. 2591*0c56280aSSorin Basca The instructions 2592*0c56280aSSorin Basca\latex latex 2593*0c56280aSSorin Basca 2594*0c56280aSSorin Basca\backslash 2595*0c56280aSSorin Bascatexttt{jsr} 2596*0c56280aSSorin Basca\latex default 2597*0c56280aSSorin Basca/ 2598*0c56280aSSorin Basca\latex latex 2599*0c56280aSSorin Basca 2600*0c56280aSSorin Basca\backslash 2601*0c56280aSSorin Bascatexttt{jsr 2602*0c56280aSSorin Basca\backslash 2603*0c56280aSSorin Basca_w} 2604*0c56280aSSorin Basca\latex default 2605*0c56280aSSorin Basca and 2606*0c56280aSSorin Basca\latex latex 2607*0c56280aSSorin Basca 2608*0c56280aSSorin Basca\backslash 2609*0c56280aSSorin Bascatexttt{ret} 2610*0c56280aSSorin Basca\latex default 2611*0c56280aSSorin Basca play in important role in chapter 2612*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass3Spec} 2613*0c56280aSSorin Basca 2614*0c56280aSSorin Basca\end_inset 2615*0c56280aSSorin Basca 2616*0c56280aSSorin Basca. 2617*0c56280aSSorin Basca\end_float 2618*0c56280aSSorin Basca (jump into subroutine) and 2619*0c56280aSSorin Basca\latex latex 2620*0c56280aSSorin Basca 2621*0c56280aSSorin Basca\backslash 2622*0c56280aSSorin Bascatexttt{ret} 2623*0c56280aSSorin Basca\latex default 2624*0c56280aSSorin Basca (return from subroutine) pair of instructions. 2625*0c56280aSSorin Basca Exceptions may be thrown with the 2626*0c56280aSSorin Basca\latex latex 2627*0c56280aSSorin Basca 2628*0c56280aSSorin Basca\backslash 2629*0c56280aSSorin Bascatexttt{athrow} 2630*0c56280aSSorin Basca\latex default 2631*0c56280aSSorin Basca instruction. 2632*0c56280aSSorin Basca Branch targets are coded as offsets from the current byte code position, 2633*0c56280aSSorin Basca i.e., they are coded with an integer number. 2634*0c56280aSSorin Basca\layout Description 2635*0c56280aSSorin Basca 2636*0c56280aSSorin BascaLoad\SpecialChar ~ 2637*0c56280aSSorin Bascaand\SpecialChar ~ 2638*0c56280aSSorin Bascastore\SpecialChar ~ 2639*0c56280aSSorin Bascaoperations for local variables like 2640*0c56280aSSorin Basca\latex latex 2641*0c56280aSSorin Basca 2642*0c56280aSSorin Basca\backslash 2643*0c56280aSSorin Bascatexttt{iload} 2644*0c56280aSSorin Basca\latex default 2645*0c56280aSSorin Basca and 2646*0c56280aSSorin Basca\latex latex 2647*0c56280aSSorin Basca 2648*0c56280aSSorin Basca\backslash 2649*0c56280aSSorin Bascatexttt{istore} 2650*0c56280aSSorin Basca\latex default 2651*0c56280aSSorin Basca. 2652*0c56280aSSorin Basca There are also array operations like 2653*0c56280aSSorin Basca\latex latex 2654*0c56280aSSorin Basca 2655*0c56280aSSorin Basca\backslash 2656*0c56280aSSorin Bascatexttt{iastore} 2657*0c56280aSSorin Basca\latex default 2658*0c56280aSSorin Basca which stores an integer value into an array. 2659*0c56280aSSorin Basca\layout Description 2660*0c56280aSSorin Basca 2661*0c56280aSSorin BascaField\SpecialChar ~ 2662*0c56280aSSorin Bascaaccess: The value of an instance field may be retrieved with 2663*0c56280aSSorin Basca\latex latex 2664*0c56280aSSorin Basca 2665*0c56280aSSorin Basca\backslash 2666*0c56280aSSorin Bascatexttt{getfield} 2667*0c56280aSSorin Basca\latex default 2668*0c56280aSSorin Basca and written with 2669*0c56280aSSorin Basca\latex latex 2670*0c56280aSSorin Basca 2671*0c56280aSSorin Basca\backslash 2672*0c56280aSSorin Bascatexttt{putfield} 2673*0c56280aSSorin Basca\latex default 2674*0c56280aSSorin Basca. 2675*0c56280aSSorin Basca For static fields, there are 2676*0c56280aSSorin Basca\latex latex 2677*0c56280aSSorin Basca 2678*0c56280aSSorin Basca\backslash 2679*0c56280aSSorin Bascatexttt{getstatic} 2680*0c56280aSSorin Basca\latex default 2681*0c56280aSSorin Basca and 2682*0c56280aSSorin Basca\latex latex 2683*0c56280aSSorin Basca 2684*0c56280aSSorin Basca\backslash 2685*0c56280aSSorin Bascatexttt{putstatic} 2686*0c56280aSSorin Basca\latex default 2687*0c56280aSSorin Basca counterparts. 2688*0c56280aSSorin Basca\layout Description 2689*0c56280aSSorin Basca 2690*0c56280aSSorin BascaMethod\SpecialChar ~ 2691*0c56280aSSorin Bascainvocation: Methods may either be called via static references with 2692*0c56280aSSorin Basca 2693*0c56280aSSorin Basca\latex latex 2694*0c56280aSSorin Basca 2695*0c56280aSSorin Basca\backslash 2696*0c56280aSSorin Bascatexttt{invokestatic} 2697*0c56280aSSorin Basca\latex default 2698*0c56280aSSorin Basca or be bound virtually with the 2699*0c56280aSSorin Basca\latex latex 2700*0c56280aSSorin Basca 2701*0c56280aSSorin Basca\backslash 2702*0c56280aSSorin Bascatexttt{invokevirtual} 2703*0c56280aSSorin Basca\latex default 2704*0c56280aSSorin Basca instruction. 2705*0c56280aSSorin Basca Super class methods and private methods are invoked with 2706*0c56280aSSorin Basca\latex latex 2707*0c56280aSSorin Basca 2708*0c56280aSSorin Basca\backslash 2709*0c56280aSSorin Bascatexttt{invokespecial} 2710*0c56280aSSorin Basca\latex default 2711*0c56280aSSorin Basca. 2712*0c56280aSSorin Basca\layout Description 2713*0c56280aSSorin Basca 2714*0c56280aSSorin BascaObject\SpecialChar ~ 2715*0c56280aSSorin Bascaallocation: Class instances are allocated with the 2716*0c56280aSSorin Basca\latex latex 2717*0c56280aSSorin Basca 2718*0c56280aSSorin Basca\backslash 2719*0c56280aSSorin Bascatexttt{new} 2720*0c56280aSSorin Basca\latex default 2721*0c56280aSSorin Basca instruction, arrays of basic type like 2722*0c56280aSSorin Basca\latex latex 2723*0c56280aSSorin Basca 2724*0c56280aSSorin Basca\backslash 2725*0c56280aSSorin Bascatexttt{int[]} 2726*0c56280aSSorin Basca\latex default 2727*0c56280aSSorin Basca with 2728*0c56280aSSorin Basca\latex latex 2729*0c56280aSSorin Basca 2730*0c56280aSSorin Basca\backslash 2731*0c56280aSSorin Bascatexttt{newarray} 2732*0c56280aSSorin Basca\latex default 2733*0c56280aSSorin Basca, arrays of references like 2734*0c56280aSSorin Basca\latex latex 2735*0c56280aSSorin Basca 2736*0c56280aSSorin Basca\backslash 2737*0c56280aSSorin Bascatexttt{String[][]} 2738*0c56280aSSorin Basca\latex default 2739*0c56280aSSorin Basca with 2740*0c56280aSSorin Basca\latex latex 2741*0c56280aSSorin Basca 2742*0c56280aSSorin Basca\backslash 2743*0c56280aSSorin Bascatexttt{anewarray} 2744*0c56280aSSorin Basca\latex default 2745*0c56280aSSorin Basca or 2746*0c56280aSSorin Basca\latex latex 2747*0c56280aSSorin Basca 2748*0c56280aSSorin Basca\backslash 2749*0c56280aSSorin Bascatexttt{multianewarray} 2750*0c56280aSSorin Basca\latex default 2751*0c56280aSSorin Basca. 2752*0c56280aSSorin Basca\layout Description 2753*0c56280aSSorin Basca 2754*0c56280aSSorin BascaConversion\SpecialChar ~ 2755*0c56280aSSorin Bascaand\SpecialChar ~ 2756*0c56280aSSorin Bascatype\SpecialChar ~ 2757*0c56280aSSorin Bascachecking: For stack operands of basic type there exist 2758*0c56280aSSorin Basca casting operations like 2759*0c56280aSSorin Basca\latex latex 2760*0c56280aSSorin Basca 2761*0c56280aSSorin Basca\backslash 2762*0c56280aSSorin Bascatexttt{f2i} 2763*0c56280aSSorin Basca\latex default 2764*0c56280aSSorin Basca which converts a float value into an integer. 2765*0c56280aSSorin Basca The validity of a type cast may be checked with 2766*0c56280aSSorin Basca\latex latex 2767*0c56280aSSorin Basca 2768*0c56280aSSorin Basca\backslash 2769*0c56280aSSorin Bascatexttt{checkcast} 2770*0c56280aSSorin Basca\latex default 2771*0c56280aSSorin Basca and the 2772*0c56280aSSorin Basca\latex latex 2773*0c56280aSSorin Basca 2774*0c56280aSSorin Basca\backslash 2775*0c56280aSSorin Bascatexttt{instanceof} 2776*0c56280aSSorin Basca\latex default 2777*0c56280aSSorin Basca operator can be directly mapped to the equally named instruction. 2778*0c56280aSSorin Basca\layout Standard 2779*0c56280aSSorin Basca 2780*0c56280aSSorin BascaMost instructions have a fixed length, but there are also some variable-length 2781*0c56280aSSorin Basca instructions: In particular, the 2782*0c56280aSSorin Basca\latex latex 2783*0c56280aSSorin Basca 2784*0c56280aSSorin Basca\backslash 2785*0c56280aSSorin Bascatexttt{lookupswitch} 2786*0c56280aSSorin Basca\latex default 2787*0c56280aSSorin Basca and 2788*0c56280aSSorin Basca\latex latex 2789*0c56280aSSorin Basca 2790*0c56280aSSorin Basca\backslash 2791*0c56280aSSorin Bascatexttt{tableswitch} 2792*0c56280aSSorin Basca\latex default 2793*0c56280aSSorin Basca instructions, which are often used by compilers to implement the Java language 2794*0c56280aSSorin Basca 2795*0c56280aSSorin Basca\latex latex 2796*0c56280aSSorin Basca 2797*0c56280aSSorin Basca\backslash 2798*0c56280aSSorin Bascatexttt{switch()} 2799*0c56280aSSorin Basca\latex default 2800*0c56280aSSorin Basca statements. 2801*0c56280aSSorin Basca Since the number of 2802*0c56280aSSorin Basca\latex latex 2803*0c56280aSSorin Basca 2804*0c56280aSSorin Basca\backslash 2805*0c56280aSSorin Bascatexttt{case} 2806*0c56280aSSorin Basca\latex default 2807*0c56280aSSorin Basca clauses may vary, these instructions contain a variable number of statements. 2808*0c56280aSSorin Basca\layout Standard 2809*0c56280aSSorin Basca 2810*0c56280aSSorin BascaIn a class file, the 2811*0c56280aSSorin Basca\family typewriter 2812*0c56280aSSorin Bascacode 2813*0c56280aSSorin Basca\family default 2814*0c56280aSSorin Basca item in the 2815*0c56280aSSorin Basca\family typewriter 2816*0c56280aSSorin BascaCode 2817*0c56280aSSorin Basca\family default 2818*0c56280aSSorin Basca attributes (which in turn are attributes of 2819*0c56280aSSorin Basca\family typewriter 2820*0c56280aSSorin Bascamethod_info 2821*0c56280aSSorin Basca\family default 2822*0c56280aSSorin Basca structures), is a byte array in which binary representations of JVM instruction 2823*0c56280aSSorin Bascas are stored sequentially. 2824*0c56280aSSorin Basca This is also called 2825*0c56280aSSorin Basca\emph on 2826*0c56280aSSorin Bascabytecode 2827*0c56280aSSorin Basca\emph default 2828*0c56280aSSorin Basca. 2829*0c56280aSSorin Basca\layout Standard 2830*0c56280aSSorin Basca 2831*0c56280aSSorin BascaThe JVM is a stack-based machine. 2832*0c56280aSSorin Basca There are local variables which may be compared to registers, but most 2833*0c56280aSSorin Basca instructions work on the operand stack. 2834*0c56280aSSorin Basca E.g., the 2835*0c56280aSSorin Basca\latex latex 2836*0c56280aSSorin Basca 2837*0c56280aSSorin Basca\backslash 2838*0c56280aSSorin Bascatexttt{iadd} 2839*0c56280aSSorin Basca\latex default 2840*0c56280aSSorin Basca instruction pops two integers from the operand stack and pushes the result 2841*0c56280aSSorin Basca of the add operation on top of the stack. 2842*0c56280aSSorin Basca\layout Standard 2843*0c56280aSSorin Basca 2844*0c56280aSSorin BascaWe will not list all of the instructions here, since these are explained 2845*0c56280aSSorin Basca in detail in the JVM specification. 2846*0c56280aSSorin Basca However, you will find the most common instructions in table 2847*0c56280aSSorin Basca\begin_inset LatexCommand \ref{typeprefixes} 2848*0c56280aSSorin Basca 2849*0c56280aSSorin Basca\end_inset 2850*0c56280aSSorin Basca 2851*0c56280aSSorin Basca, cited with slight corrections and modifications from chapter 4 of 2852*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JNS} 2853*0c56280aSSorin Basca 2854*0c56280aSSorin Basca\end_inset 2855*0c56280aSSorin Basca 2856*0c56280aSSorin Basca. 2857*0c56280aSSorin Basca\layout Standard 2858*0c56280aSSorin Basca 2859*0c56280aSSorin Basca\begin_float tab 2860*0c56280aSSorin Basca\layout Caption 2861*0c56280aSSorin Basca 2862*0c56280aSSorin Basca 2863*0c56280aSSorin Basca\begin_inset LatexCommand \label{typeprefixes} 2864*0c56280aSSorin Basca 2865*0c56280aSSorin Basca\end_inset 2866*0c56280aSSorin Basca 2867*0c56280aSSorin BascaType Prefixes and the Most Common JVM Instructions 2868*0c56280aSSorin Basca\layout Standard 2869*0c56280aSSorin Basca\align center 2870*0c56280aSSorin Basca 2871*0c56280aSSorin Basca\begin_inset Tabular 2872*0c56280aSSorin Basca<lyxtabular version="2" rows="9" columns="2"> 2873*0c56280aSSorin Basca<features rotate="false" islongtable="false" endhead="0" endfirsthead="0" endfoot="0" endlastfoot="0"> 2874*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 2875*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="true" width="" special=""> 2876*0c56280aSSorin Basca<row topline="true" bottomline="true" newpage="false"> 2877*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2878*0c56280aSSorin Basca\begin_inset Text 2879*0c56280aSSorin Basca 2880*0c56280aSSorin Basca\layout Standard 2881*0c56280aSSorin Basca 2882*0c56280aSSorin BascaPrefix 2883*0c56280aSSorin Basca\end_inset 2884*0c56280aSSorin Basca</cell> 2885*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2886*0c56280aSSorin Basca\begin_inset Text 2887*0c56280aSSorin Basca 2888*0c56280aSSorin Basca\layout Standard 2889*0c56280aSSorin Basca 2890*0c56280aSSorin BascaBytecode type 2891*0c56280aSSorin Basca\end_inset 2892*0c56280aSSorin Basca</cell> 2893*0c56280aSSorin Basca</row> 2894*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2895*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2896*0c56280aSSorin Basca\begin_inset Text 2897*0c56280aSSorin Basca 2898*0c56280aSSorin Basca\layout Standard 2899*0c56280aSSorin Basca 2900*0c56280aSSorin Bascai 2901*0c56280aSSorin Basca\end_inset 2902*0c56280aSSorin Basca</cell> 2903*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2904*0c56280aSSorin Basca\begin_inset Text 2905*0c56280aSSorin Basca 2906*0c56280aSSorin Basca\layout Standard 2907*0c56280aSSorin Basca 2908*0c56280aSSorin BascaInteger 2909*0c56280aSSorin Basca\end_inset 2910*0c56280aSSorin Basca</cell> 2911*0c56280aSSorin Basca</row> 2912*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2913*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2914*0c56280aSSorin Basca\begin_inset Text 2915*0c56280aSSorin Basca 2916*0c56280aSSorin Basca\layout Standard 2917*0c56280aSSorin Basca 2918*0c56280aSSorin Bascaf 2919*0c56280aSSorin Basca\end_inset 2920*0c56280aSSorin Basca</cell> 2921*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2922*0c56280aSSorin Basca\begin_inset Text 2923*0c56280aSSorin Basca 2924*0c56280aSSorin Basca\layout Standard 2925*0c56280aSSorin Basca 2926*0c56280aSSorin BascaFloating point 2927*0c56280aSSorin Basca\end_inset 2928*0c56280aSSorin Basca</cell> 2929*0c56280aSSorin Basca</row> 2930*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2931*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2932*0c56280aSSorin Basca\begin_inset Text 2933*0c56280aSSorin Basca 2934*0c56280aSSorin Basca\layout Standard 2935*0c56280aSSorin Basca 2936*0c56280aSSorin Bascal 2937*0c56280aSSorin Basca\end_inset 2938*0c56280aSSorin Basca</cell> 2939*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2940*0c56280aSSorin Basca\begin_inset Text 2941*0c56280aSSorin Basca 2942*0c56280aSSorin Basca\layout Standard 2943*0c56280aSSorin Basca 2944*0c56280aSSorin BascaLong 2945*0c56280aSSorin Basca\end_inset 2946*0c56280aSSorin Basca</cell> 2947*0c56280aSSorin Basca</row> 2948*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2949*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2950*0c56280aSSorin Basca\begin_inset Text 2951*0c56280aSSorin Basca 2952*0c56280aSSorin Basca\layout Standard 2953*0c56280aSSorin Basca 2954*0c56280aSSorin Bascad 2955*0c56280aSSorin Basca\end_inset 2956*0c56280aSSorin Basca</cell> 2957*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2958*0c56280aSSorin Basca\begin_inset Text 2959*0c56280aSSorin Basca 2960*0c56280aSSorin Basca\layout Standard 2961*0c56280aSSorin Basca 2962*0c56280aSSorin BascaDouble precision floating point 2963*0c56280aSSorin Basca\end_inset 2964*0c56280aSSorin Basca</cell> 2965*0c56280aSSorin Basca</row> 2966*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2967*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2968*0c56280aSSorin Basca\begin_inset Text 2969*0c56280aSSorin Basca 2970*0c56280aSSorin Basca\layout Standard 2971*0c56280aSSorin Basca 2972*0c56280aSSorin Bascab 2973*0c56280aSSorin Basca\end_inset 2974*0c56280aSSorin Basca</cell> 2975*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2976*0c56280aSSorin Basca\begin_inset Text 2977*0c56280aSSorin Basca 2978*0c56280aSSorin Basca\layout Standard 2979*0c56280aSSorin Basca 2980*0c56280aSSorin BascaByte 2981*0c56280aSSorin Basca\end_inset 2982*0c56280aSSorin Basca</cell> 2983*0c56280aSSorin Basca</row> 2984*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 2985*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2986*0c56280aSSorin Basca\begin_inset Text 2987*0c56280aSSorin Basca 2988*0c56280aSSorin Basca\layout Standard 2989*0c56280aSSorin Basca 2990*0c56280aSSorin Bascas 2991*0c56280aSSorin Basca\end_inset 2992*0c56280aSSorin Basca</cell> 2993*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2994*0c56280aSSorin Basca\begin_inset Text 2995*0c56280aSSorin Basca 2996*0c56280aSSorin Basca\layout Standard 2997*0c56280aSSorin Basca 2998*0c56280aSSorin BascaShort 2999*0c56280aSSorin Basca\end_inset 3000*0c56280aSSorin Basca</cell> 3001*0c56280aSSorin Basca</row> 3002*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3003*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3004*0c56280aSSorin Basca\begin_inset Text 3005*0c56280aSSorin Basca 3006*0c56280aSSorin Basca\layout Standard 3007*0c56280aSSorin Basca 3008*0c56280aSSorin Bascac 3009*0c56280aSSorin Basca\end_inset 3010*0c56280aSSorin Basca</cell> 3011*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3012*0c56280aSSorin Basca\begin_inset Text 3013*0c56280aSSorin Basca 3014*0c56280aSSorin Basca\layout Standard 3015*0c56280aSSorin Basca 3016*0c56280aSSorin BascaCharacter 3017*0c56280aSSorin Basca\end_inset 3018*0c56280aSSorin Basca</cell> 3019*0c56280aSSorin Basca</row> 3020*0c56280aSSorin Basca<row topline="true" bottomline="true" newpage="false"> 3021*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3022*0c56280aSSorin Basca\begin_inset Text 3023*0c56280aSSorin Basca 3024*0c56280aSSorin Basca\layout Standard 3025*0c56280aSSorin Basca 3026*0c56280aSSorin Bascaa 3027*0c56280aSSorin Basca\end_inset 3028*0c56280aSSorin Basca</cell> 3029*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3030*0c56280aSSorin Basca\begin_inset Text 3031*0c56280aSSorin Basca 3032*0c56280aSSorin Basca\layout Standard 3033*0c56280aSSorin Basca 3034*0c56280aSSorin BascaObject reference 3035*0c56280aSSorin Basca\end_inset 3036*0c56280aSSorin Basca</cell> 3037*0c56280aSSorin Basca</row> 3038*0c56280aSSorin Basca</lyxtabular> 3039*0c56280aSSorin Basca 3040*0c56280aSSorin Basca\end_inset 3041*0c56280aSSorin Basca 3042*0c56280aSSorin Basca 3043*0c56280aSSorin Basca\end_float 3044*0c56280aSSorin Basca\layout Standard 3045*0c56280aSSorin Basca 3046*0c56280aSSorin Basca 3047*0c56280aSSorin Basca\begin_inset Tabular 3048*0c56280aSSorin Basca<lyxtabular version="2" rows="29" columns="10"> 3049*0c56280aSSorin Basca<features rotate="false" islongtable="true" endhead="1" endfirsthead="0" endfoot="0" endlastfoot="0"> 3050*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3051*0c56280aSSorin Basca<column alignment="left" valignment="top" leftline="true" rightline="false" width="" special=""> 3052*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3053*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3054*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3055*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3056*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3057*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3058*0c56280aSSorin Basca<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3059*0c56280aSSorin Basca<column alignment="left" valignment="top" leftline="true" rightline="true" width="4cm" special=""> 3060*0c56280aSSorin Basca<row topline="true" bottomline="true" newpage="false"> 3061*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3062*0c56280aSSorin Basca\begin_inset Text 3063*0c56280aSSorin Basca 3064*0c56280aSSorin Basca\layout Standard 3065*0c56280aSSorin Basca 3066*0c56280aSSorin Basca 3067*0c56280aSSorin Basca\size scriptsize 3068*0c56280aSSorin BascaInstruction 3069*0c56280aSSorin Basca\end_inset 3070*0c56280aSSorin Basca</cell> 3071*0c56280aSSorin Basca<cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3072*0c56280aSSorin Basca\begin_inset Text 3073*0c56280aSSorin Basca 3074*0c56280aSSorin Basca\layout Standard 3075*0c56280aSSorin Basca 3076*0c56280aSSorin Basca 3077*0c56280aSSorin Basca\size scriptsize 3078*0c56280aSSorin Bascaint 3079*0c56280aSSorin Basca\end_inset 3080*0c56280aSSorin Basca</cell> 3081*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3082*0c56280aSSorin Basca\begin_inset Text 3083*0c56280aSSorin Basca 3084*0c56280aSSorin Basca\layout Standard 3085*0c56280aSSorin Basca 3086*0c56280aSSorin Basca 3087*0c56280aSSorin Basca\size scriptsize 3088*0c56280aSSorin Bascalong 3089*0c56280aSSorin Basca\end_inset 3090*0c56280aSSorin Basca</cell> 3091*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3092*0c56280aSSorin Basca\begin_inset Text 3093*0c56280aSSorin Basca 3094*0c56280aSSorin Basca\layout Standard 3095*0c56280aSSorin Basca 3096*0c56280aSSorin Basca 3097*0c56280aSSorin Basca\size scriptsize 3098*0c56280aSSorin Bascafloat 3099*0c56280aSSorin Basca\end_inset 3100*0c56280aSSorin Basca</cell> 3101*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3102*0c56280aSSorin Basca\begin_inset Text 3103*0c56280aSSorin Basca 3104*0c56280aSSorin Basca\layout Standard 3105*0c56280aSSorin Basca 3106*0c56280aSSorin Basca 3107*0c56280aSSorin Basca\size scriptsize 3108*0c56280aSSorin Bascadouble 3109*0c56280aSSorin Basca\end_inset 3110*0c56280aSSorin Basca</cell> 3111*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3112*0c56280aSSorin Basca\begin_inset Text 3113*0c56280aSSorin Basca 3114*0c56280aSSorin Basca\layout Standard 3115*0c56280aSSorin Basca 3116*0c56280aSSorin Basca 3117*0c56280aSSorin Basca\size scriptsize 3118*0c56280aSSorin Bascabyte 3119*0c56280aSSorin Basca\end_inset 3120*0c56280aSSorin Basca</cell> 3121*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3122*0c56280aSSorin Basca\begin_inset Text 3123*0c56280aSSorin Basca 3124*0c56280aSSorin Basca\layout Standard 3125*0c56280aSSorin Basca 3126*0c56280aSSorin Basca 3127*0c56280aSSorin Basca\size scriptsize 3128*0c56280aSSorin Bascachar 3129*0c56280aSSorin Basca\end_inset 3130*0c56280aSSorin Basca</cell> 3131*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3132*0c56280aSSorin Basca\begin_inset Text 3133*0c56280aSSorin Basca 3134*0c56280aSSorin Basca\layout Standard 3135*0c56280aSSorin Basca 3136*0c56280aSSorin Basca 3137*0c56280aSSorin Basca\size scriptsize 3138*0c56280aSSorin Bascashort 3139*0c56280aSSorin Basca\end_inset 3140*0c56280aSSorin Basca</cell> 3141*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3142*0c56280aSSorin Basca\begin_inset Text 3143*0c56280aSSorin Basca 3144*0c56280aSSorin Basca\layout Standard 3145*0c56280aSSorin Basca 3146*0c56280aSSorin Basca 3147*0c56280aSSorin Basca\size scriptsize 3148*0c56280aSSorin Bascaobject ref. 3149*0c56280aSSorin Basca\end_inset 3150*0c56280aSSorin Basca</cell> 3151*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3152*0c56280aSSorin Basca\begin_inset Text 3153*0c56280aSSorin Basca 3154*0c56280aSSorin Basca\layout Standard 3155*0c56280aSSorin Basca 3156*0c56280aSSorin Basca 3157*0c56280aSSorin Basca\size scriptsize 3158*0c56280aSSorin BascaFunction 3159*0c56280aSSorin Basca\end_inset 3160*0c56280aSSorin Basca</cell> 3161*0c56280aSSorin Basca</row> 3162*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3163*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3164*0c56280aSSorin Basca\begin_inset Text 3165*0c56280aSSorin Basca 3166*0c56280aSSorin Basca\layout Standard 3167*0c56280aSSorin Basca 3168*0c56280aSSorin Basca?2c 3169*0c56280aSSorin Basca\end_inset 3170*0c56280aSSorin Basca</cell> 3171*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3172*0c56280aSSorin Basca\begin_inset Text 3173*0c56280aSSorin Basca 3174*0c56280aSSorin Basca\layout Standard 3175*0c56280aSSorin Basca 3176*0c56280aSSorin BascaX 3177*0c56280aSSorin Basca\end_inset 3178*0c56280aSSorin Basca</cell> 3179*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3180*0c56280aSSorin Basca\begin_inset Text 3181*0c56280aSSorin Basca 3182*0c56280aSSorin Basca\layout Standard 3183*0c56280aSSorin Basca 3184*0c56280aSSorin Basca\end_inset 3185*0c56280aSSorin Basca</cell> 3186*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3187*0c56280aSSorin Basca\begin_inset Text 3188*0c56280aSSorin Basca 3189*0c56280aSSorin Basca\layout Standard 3190*0c56280aSSorin Basca 3191*0c56280aSSorin Basca\end_inset 3192*0c56280aSSorin Basca</cell> 3193*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3194*0c56280aSSorin Basca\begin_inset Text 3195*0c56280aSSorin Basca 3196*0c56280aSSorin Basca\layout Standard 3197*0c56280aSSorin Basca 3198*0c56280aSSorin Basca\end_inset 3199*0c56280aSSorin Basca</cell> 3200*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3201*0c56280aSSorin Basca\begin_inset Text 3202*0c56280aSSorin Basca 3203*0c56280aSSorin Basca\layout Standard 3204*0c56280aSSorin Basca 3205*0c56280aSSorin Basca\end_inset 3206*0c56280aSSorin Basca</cell> 3207*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3208*0c56280aSSorin Basca\begin_inset Text 3209*0c56280aSSorin Basca 3210*0c56280aSSorin Basca\layout Standard 3211*0c56280aSSorin Basca 3212*0c56280aSSorin Basca\end_inset 3213*0c56280aSSorin Basca</cell> 3214*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3215*0c56280aSSorin Basca\begin_inset Text 3216*0c56280aSSorin Basca 3217*0c56280aSSorin Basca\layout Standard 3218*0c56280aSSorin Basca 3219*0c56280aSSorin Basca\end_inset 3220*0c56280aSSorin Basca</cell> 3221*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3222*0c56280aSSorin Basca\begin_inset Text 3223*0c56280aSSorin Basca 3224*0c56280aSSorin Basca\layout Standard 3225*0c56280aSSorin Basca 3226*0c56280aSSorin Basca\end_inset 3227*0c56280aSSorin Basca</cell> 3228*0c56280aSSorin Basca<cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3229*0c56280aSSorin Basca\begin_inset Text 3230*0c56280aSSorin Basca 3231*0c56280aSSorin Basca\layout Standard 3232*0c56280aSSorin Basca 3233*0c56280aSSorin BascaConvert value of type <?> to character 3234*0c56280aSSorin Basca\end_inset 3235*0c56280aSSorin Basca</cell> 3236*0c56280aSSorin Basca</row> 3237*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3238*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3239*0c56280aSSorin Basca\begin_inset Text 3240*0c56280aSSorin Basca 3241*0c56280aSSorin Basca\layout Standard 3242*0c56280aSSorin Basca 3243*0c56280aSSorin Basca?2d 3244*0c56280aSSorin Basca\end_inset 3245*0c56280aSSorin Basca</cell> 3246*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3247*0c56280aSSorin Basca\begin_inset Text 3248*0c56280aSSorin Basca 3249*0c56280aSSorin Basca\layout Standard 3250*0c56280aSSorin Basca 3251*0c56280aSSorin BascaX 3252*0c56280aSSorin Basca\end_inset 3253*0c56280aSSorin Basca</cell> 3254*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3255*0c56280aSSorin Basca\begin_inset Text 3256*0c56280aSSorin Basca 3257*0c56280aSSorin Basca\layout Standard 3258*0c56280aSSorin Basca 3259*0c56280aSSorin BascaX 3260*0c56280aSSorin Basca\end_inset 3261*0c56280aSSorin Basca</cell> 3262*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3263*0c56280aSSorin Basca\begin_inset Text 3264*0c56280aSSorin Basca 3265*0c56280aSSorin Basca\layout Standard 3266*0c56280aSSorin Basca 3267*0c56280aSSorin BascaX 3268*0c56280aSSorin Basca\end_inset 3269*0c56280aSSorin Basca</cell> 3270*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3271*0c56280aSSorin Basca\begin_inset Text 3272*0c56280aSSorin Basca 3273*0c56280aSSorin Basca\layout Standard 3274*0c56280aSSorin Basca 3275*0c56280aSSorin Basca\end_inset 3276*0c56280aSSorin Basca</cell> 3277*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3278*0c56280aSSorin Basca\begin_inset Text 3279*0c56280aSSorin Basca 3280*0c56280aSSorin Basca\layout Standard 3281*0c56280aSSorin Basca 3282*0c56280aSSorin Basca\end_inset 3283*0c56280aSSorin Basca</cell> 3284*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3285*0c56280aSSorin Basca\begin_inset Text 3286*0c56280aSSorin Basca 3287*0c56280aSSorin Basca\layout Standard 3288*0c56280aSSorin Basca 3289*0c56280aSSorin Basca\end_inset 3290*0c56280aSSorin Basca</cell> 3291*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3292*0c56280aSSorin Basca\begin_inset Text 3293*0c56280aSSorin Basca 3294*0c56280aSSorin Basca\layout Standard 3295*0c56280aSSorin Basca 3296*0c56280aSSorin Basca\end_inset 3297*0c56280aSSorin Basca</cell> 3298*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3299*0c56280aSSorin Basca\begin_inset Text 3300*0c56280aSSorin Basca 3301*0c56280aSSorin Basca\layout Standard 3302*0c56280aSSorin Basca 3303*0c56280aSSorin Basca\end_inset 3304*0c56280aSSorin Basca</cell> 3305*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3306*0c56280aSSorin Basca\begin_inset Text 3307*0c56280aSSorin Basca 3308*0c56280aSSorin Basca\layout Standard 3309*0c56280aSSorin Basca 3310*0c56280aSSorin BascaConvert value of type <?> to double 3311*0c56280aSSorin Basca\end_inset 3312*0c56280aSSorin Basca</cell> 3313*0c56280aSSorin Basca</row> 3314*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3315*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3316*0c56280aSSorin Basca\begin_inset Text 3317*0c56280aSSorin Basca 3318*0c56280aSSorin Basca\layout Standard 3319*0c56280aSSorin Basca 3320*0c56280aSSorin Basca?2i 3321*0c56280aSSorin Basca\end_inset 3322*0c56280aSSorin Basca</cell> 3323*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3324*0c56280aSSorin Basca\begin_inset Text 3325*0c56280aSSorin Basca 3326*0c56280aSSorin Basca\layout Standard 3327*0c56280aSSorin Basca 3328*0c56280aSSorin Basca\end_inset 3329*0c56280aSSorin Basca</cell> 3330*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3331*0c56280aSSorin Basca\begin_inset Text 3332*0c56280aSSorin Basca 3333*0c56280aSSorin Basca\layout Standard 3334*0c56280aSSorin Basca 3335*0c56280aSSorin BascaX 3336*0c56280aSSorin Basca\end_inset 3337*0c56280aSSorin Basca</cell> 3338*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3339*0c56280aSSorin Basca\begin_inset Text 3340*0c56280aSSorin Basca 3341*0c56280aSSorin Basca\layout Standard 3342*0c56280aSSorin Basca 3343*0c56280aSSorin BascaX 3344*0c56280aSSorin Basca\end_inset 3345*0c56280aSSorin Basca</cell> 3346*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3347*0c56280aSSorin Basca\begin_inset Text 3348*0c56280aSSorin Basca 3349*0c56280aSSorin Basca\layout Standard 3350*0c56280aSSorin Basca 3351*0c56280aSSorin BascaX 3352*0c56280aSSorin Basca\end_inset 3353*0c56280aSSorin Basca</cell> 3354*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3355*0c56280aSSorin Basca\begin_inset Text 3356*0c56280aSSorin Basca 3357*0c56280aSSorin Basca\layout Standard 3358*0c56280aSSorin Basca 3359*0c56280aSSorin Basca\end_inset 3360*0c56280aSSorin Basca</cell> 3361*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3362*0c56280aSSorin Basca\begin_inset Text 3363*0c56280aSSorin Basca 3364*0c56280aSSorin Basca\layout Standard 3365*0c56280aSSorin Basca 3366*0c56280aSSorin Basca\end_inset 3367*0c56280aSSorin Basca</cell> 3368*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3369*0c56280aSSorin Basca\begin_inset Text 3370*0c56280aSSorin Basca 3371*0c56280aSSorin Basca\layout Standard 3372*0c56280aSSorin Basca 3373*0c56280aSSorin Basca\end_inset 3374*0c56280aSSorin Basca</cell> 3375*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3376*0c56280aSSorin Basca\begin_inset Text 3377*0c56280aSSorin Basca 3378*0c56280aSSorin Basca\layout Standard 3379*0c56280aSSorin Basca 3380*0c56280aSSorin Basca\end_inset 3381*0c56280aSSorin Basca</cell> 3382*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3383*0c56280aSSorin Basca\begin_inset Text 3384*0c56280aSSorin Basca 3385*0c56280aSSorin Basca\layout Standard 3386*0c56280aSSorin Basca 3387*0c56280aSSorin BascaConvert value of type <?> to integer 3388*0c56280aSSorin Basca\end_inset 3389*0c56280aSSorin Basca</cell> 3390*0c56280aSSorin Basca</row> 3391*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3392*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3393*0c56280aSSorin Basca\begin_inset Text 3394*0c56280aSSorin Basca 3395*0c56280aSSorin Basca\layout Standard 3396*0c56280aSSorin Basca 3397*0c56280aSSorin Basca?2f 3398*0c56280aSSorin Basca\end_inset 3399*0c56280aSSorin Basca</cell> 3400*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3401*0c56280aSSorin Basca\begin_inset Text 3402*0c56280aSSorin Basca 3403*0c56280aSSorin Basca\layout Standard 3404*0c56280aSSorin Basca 3405*0c56280aSSorin BascaX 3406*0c56280aSSorin Basca\end_inset 3407*0c56280aSSorin Basca</cell> 3408*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3409*0c56280aSSorin Basca\begin_inset Text 3410*0c56280aSSorin Basca 3411*0c56280aSSorin Basca\layout Standard 3412*0c56280aSSorin Basca 3413*0c56280aSSorin BascaX 3414*0c56280aSSorin Basca\end_inset 3415*0c56280aSSorin Basca</cell> 3416*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3417*0c56280aSSorin Basca\begin_inset Text 3418*0c56280aSSorin Basca 3419*0c56280aSSorin Basca\layout Standard 3420*0c56280aSSorin Basca 3421*0c56280aSSorin Basca\end_inset 3422*0c56280aSSorin Basca</cell> 3423*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3424*0c56280aSSorin Basca\begin_inset Text 3425*0c56280aSSorin Basca 3426*0c56280aSSorin Basca\layout Standard 3427*0c56280aSSorin Basca 3428*0c56280aSSorin BascaX 3429*0c56280aSSorin Basca\end_inset 3430*0c56280aSSorin Basca</cell> 3431*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3432*0c56280aSSorin Basca\begin_inset Text 3433*0c56280aSSorin Basca 3434*0c56280aSSorin Basca\layout Standard 3435*0c56280aSSorin Basca 3436*0c56280aSSorin Basca\end_inset 3437*0c56280aSSorin Basca</cell> 3438*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3439*0c56280aSSorin Basca\begin_inset Text 3440*0c56280aSSorin Basca 3441*0c56280aSSorin Basca\layout Standard 3442*0c56280aSSorin Basca 3443*0c56280aSSorin Basca\end_inset 3444*0c56280aSSorin Basca</cell> 3445*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3446*0c56280aSSorin Basca\begin_inset Text 3447*0c56280aSSorin Basca 3448*0c56280aSSorin Basca\layout Standard 3449*0c56280aSSorin Basca 3450*0c56280aSSorin Basca\end_inset 3451*0c56280aSSorin Basca</cell> 3452*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3453*0c56280aSSorin Basca\begin_inset Text 3454*0c56280aSSorin Basca 3455*0c56280aSSorin Basca\layout Standard 3456*0c56280aSSorin Basca 3457*0c56280aSSorin Basca\end_inset 3458*0c56280aSSorin Basca</cell> 3459*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3460*0c56280aSSorin Basca\begin_inset Text 3461*0c56280aSSorin Basca 3462*0c56280aSSorin Basca\layout Standard 3463*0c56280aSSorin Basca 3464*0c56280aSSorin BascaConvert value of type <?> to float 3465*0c56280aSSorin Basca\end_inset 3466*0c56280aSSorin Basca</cell> 3467*0c56280aSSorin Basca</row> 3468*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3469*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3470*0c56280aSSorin Basca\begin_inset Text 3471*0c56280aSSorin Basca 3472*0c56280aSSorin Basca\layout Standard 3473*0c56280aSSorin Basca 3474*0c56280aSSorin Basca?2l 3475*0c56280aSSorin Basca\end_inset 3476*0c56280aSSorin Basca</cell> 3477*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3478*0c56280aSSorin Basca\begin_inset Text 3479*0c56280aSSorin Basca 3480*0c56280aSSorin Basca\layout Standard 3481*0c56280aSSorin Basca 3482*0c56280aSSorin BascaX 3483*0c56280aSSorin Basca\end_inset 3484*0c56280aSSorin Basca</cell> 3485*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3486*0c56280aSSorin Basca\begin_inset Text 3487*0c56280aSSorin Basca 3488*0c56280aSSorin Basca\layout Standard 3489*0c56280aSSorin Basca 3490*0c56280aSSorin Basca\end_inset 3491*0c56280aSSorin Basca</cell> 3492*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3493*0c56280aSSorin Basca\begin_inset Text 3494*0c56280aSSorin Basca 3495*0c56280aSSorin Basca\layout Standard 3496*0c56280aSSorin Basca 3497*0c56280aSSorin BascaX 3498*0c56280aSSorin Basca\end_inset 3499*0c56280aSSorin Basca</cell> 3500*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3501*0c56280aSSorin Basca\begin_inset Text 3502*0c56280aSSorin Basca 3503*0c56280aSSorin Basca\layout Standard 3504*0c56280aSSorin Basca 3505*0c56280aSSorin BascaX 3506*0c56280aSSorin Basca\end_inset 3507*0c56280aSSorin Basca</cell> 3508*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3509*0c56280aSSorin Basca\begin_inset Text 3510*0c56280aSSorin Basca 3511*0c56280aSSorin Basca\layout Standard 3512*0c56280aSSorin Basca 3513*0c56280aSSorin Basca\end_inset 3514*0c56280aSSorin Basca</cell> 3515*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3516*0c56280aSSorin Basca\begin_inset Text 3517*0c56280aSSorin Basca 3518*0c56280aSSorin Basca\layout Standard 3519*0c56280aSSorin Basca 3520*0c56280aSSorin Basca\end_inset 3521*0c56280aSSorin Basca</cell> 3522*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3523*0c56280aSSorin Basca\begin_inset Text 3524*0c56280aSSorin Basca 3525*0c56280aSSorin Basca\layout Standard 3526*0c56280aSSorin Basca 3527*0c56280aSSorin Basca\end_inset 3528*0c56280aSSorin Basca</cell> 3529*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3530*0c56280aSSorin Basca\begin_inset Text 3531*0c56280aSSorin Basca 3532*0c56280aSSorin Basca\layout Standard 3533*0c56280aSSorin Basca 3534*0c56280aSSorin Basca\end_inset 3535*0c56280aSSorin Basca</cell> 3536*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3537*0c56280aSSorin Basca\begin_inset Text 3538*0c56280aSSorin Basca 3539*0c56280aSSorin Basca\layout Standard 3540*0c56280aSSorin Basca 3541*0c56280aSSorin BascaConvert value of type <?> to long 3542*0c56280aSSorin Basca\end_inset 3543*0c56280aSSorin Basca</cell> 3544*0c56280aSSorin Basca</row> 3545*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3546*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3547*0c56280aSSorin Basca\begin_inset Text 3548*0c56280aSSorin Basca 3549*0c56280aSSorin Basca\layout Standard 3550*0c56280aSSorin Basca 3551*0c56280aSSorin Basca?2s 3552*0c56280aSSorin Basca\end_inset 3553*0c56280aSSorin Basca</cell> 3554*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3555*0c56280aSSorin Basca\begin_inset Text 3556*0c56280aSSorin Basca 3557*0c56280aSSorin Basca\layout Standard 3558*0c56280aSSorin Basca 3559*0c56280aSSorin BascaX 3560*0c56280aSSorin Basca\end_inset 3561*0c56280aSSorin Basca</cell> 3562*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3563*0c56280aSSorin Basca\begin_inset Text 3564*0c56280aSSorin Basca 3565*0c56280aSSorin Basca\layout Standard 3566*0c56280aSSorin Basca 3567*0c56280aSSorin Basca\end_inset 3568*0c56280aSSorin Basca</cell> 3569*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3570*0c56280aSSorin Basca\begin_inset Text 3571*0c56280aSSorin Basca 3572*0c56280aSSorin Basca\layout Standard 3573*0c56280aSSorin Basca 3574*0c56280aSSorin Basca\end_inset 3575*0c56280aSSorin Basca</cell> 3576*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3577*0c56280aSSorin Basca\begin_inset Text 3578*0c56280aSSorin Basca 3579*0c56280aSSorin Basca\layout Standard 3580*0c56280aSSorin Basca 3581*0c56280aSSorin Basca\end_inset 3582*0c56280aSSorin Basca</cell> 3583*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3584*0c56280aSSorin Basca\begin_inset Text 3585*0c56280aSSorin Basca 3586*0c56280aSSorin Basca\layout Standard 3587*0c56280aSSorin Basca 3588*0c56280aSSorin Basca\end_inset 3589*0c56280aSSorin Basca</cell> 3590*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3591*0c56280aSSorin Basca\begin_inset Text 3592*0c56280aSSorin Basca 3593*0c56280aSSorin Basca\layout Standard 3594*0c56280aSSorin Basca 3595*0c56280aSSorin Basca\end_inset 3596*0c56280aSSorin Basca</cell> 3597*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3598*0c56280aSSorin Basca\begin_inset Text 3599*0c56280aSSorin Basca 3600*0c56280aSSorin Basca\layout Standard 3601*0c56280aSSorin Basca 3602*0c56280aSSorin Basca\end_inset 3603*0c56280aSSorin Basca</cell> 3604*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3605*0c56280aSSorin Basca\begin_inset Text 3606*0c56280aSSorin Basca 3607*0c56280aSSorin Basca\layout Standard 3608*0c56280aSSorin Basca 3609*0c56280aSSorin Basca\end_inset 3610*0c56280aSSorin Basca</cell> 3611*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3612*0c56280aSSorin Basca\begin_inset Text 3613*0c56280aSSorin Basca 3614*0c56280aSSorin Basca\layout Standard 3615*0c56280aSSorin Basca 3616*0c56280aSSorin BascaConvert value of type <?> to short 3617*0c56280aSSorin Basca\end_inset 3618*0c56280aSSorin Basca</cell> 3619*0c56280aSSorin Basca</row> 3620*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3621*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3622*0c56280aSSorin Basca\begin_inset Text 3623*0c56280aSSorin Basca 3624*0c56280aSSorin Basca\layout Standard 3625*0c56280aSSorin Basca 3626*0c56280aSSorin Basca?add 3627*0c56280aSSorin Basca\end_inset 3628*0c56280aSSorin Basca</cell> 3629*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3630*0c56280aSSorin Basca\begin_inset Text 3631*0c56280aSSorin Basca 3632*0c56280aSSorin Basca\layout Standard 3633*0c56280aSSorin Basca 3634*0c56280aSSorin BascaX 3635*0c56280aSSorin Basca\end_inset 3636*0c56280aSSorin Basca</cell> 3637*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3638*0c56280aSSorin Basca\begin_inset Text 3639*0c56280aSSorin Basca 3640*0c56280aSSorin Basca\layout Standard 3641*0c56280aSSorin Basca 3642*0c56280aSSorin BascaX 3643*0c56280aSSorin Basca\end_inset 3644*0c56280aSSorin Basca</cell> 3645*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3646*0c56280aSSorin Basca\begin_inset Text 3647*0c56280aSSorin Basca 3648*0c56280aSSorin Basca\layout Standard 3649*0c56280aSSorin Basca 3650*0c56280aSSorin BascaX 3651*0c56280aSSorin Basca\end_inset 3652*0c56280aSSorin Basca</cell> 3653*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3654*0c56280aSSorin Basca\begin_inset Text 3655*0c56280aSSorin Basca 3656*0c56280aSSorin Basca\layout Standard 3657*0c56280aSSorin Basca 3658*0c56280aSSorin BascaX 3659*0c56280aSSorin Basca\end_inset 3660*0c56280aSSorin Basca</cell> 3661*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3662*0c56280aSSorin Basca\begin_inset Text 3663*0c56280aSSorin Basca 3664*0c56280aSSorin Basca\layout Standard 3665*0c56280aSSorin Basca 3666*0c56280aSSorin Basca\end_inset 3667*0c56280aSSorin Basca</cell> 3668*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3669*0c56280aSSorin Basca\begin_inset Text 3670*0c56280aSSorin Basca 3671*0c56280aSSorin Basca\layout Standard 3672*0c56280aSSorin Basca 3673*0c56280aSSorin Basca\end_inset 3674*0c56280aSSorin Basca</cell> 3675*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3676*0c56280aSSorin Basca\begin_inset Text 3677*0c56280aSSorin Basca 3678*0c56280aSSorin Basca\layout Standard 3679*0c56280aSSorin Basca 3680*0c56280aSSorin Basca\end_inset 3681*0c56280aSSorin Basca</cell> 3682*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3683*0c56280aSSorin Basca\begin_inset Text 3684*0c56280aSSorin Basca 3685*0c56280aSSorin Basca\layout Standard 3686*0c56280aSSorin Basca 3687*0c56280aSSorin Basca\end_inset 3688*0c56280aSSorin Basca</cell> 3689*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3690*0c56280aSSorin Basca\begin_inset Text 3691*0c56280aSSorin Basca 3692*0c56280aSSorin Basca\layout Standard 3693*0c56280aSSorin Basca 3694*0c56280aSSorin BascaAdd two values of type <?> 3695*0c56280aSSorin Basca\end_inset 3696*0c56280aSSorin Basca</cell> 3697*0c56280aSSorin Basca</row> 3698*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3699*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3700*0c56280aSSorin Basca\begin_inset Text 3701*0c56280aSSorin Basca 3702*0c56280aSSorin Basca\layout Standard 3703*0c56280aSSorin Basca 3704*0c56280aSSorin Basca?aload 3705*0c56280aSSorin Basca\end_inset 3706*0c56280aSSorin Basca</cell> 3707*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3708*0c56280aSSorin Basca\begin_inset Text 3709*0c56280aSSorin Basca 3710*0c56280aSSorin Basca\layout Standard 3711*0c56280aSSorin Basca 3712*0c56280aSSorin BascaX 3713*0c56280aSSorin Basca\end_inset 3714*0c56280aSSorin Basca</cell> 3715*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3716*0c56280aSSorin Basca\begin_inset Text 3717*0c56280aSSorin Basca 3718*0c56280aSSorin Basca\layout Standard 3719*0c56280aSSorin Basca 3720*0c56280aSSorin BascaX 3721*0c56280aSSorin Basca\end_inset 3722*0c56280aSSorin Basca</cell> 3723*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3724*0c56280aSSorin Basca\begin_inset Text 3725*0c56280aSSorin Basca 3726*0c56280aSSorin Basca\layout Standard 3727*0c56280aSSorin Basca 3728*0c56280aSSorin BascaX 3729*0c56280aSSorin Basca\end_inset 3730*0c56280aSSorin Basca</cell> 3731*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3732*0c56280aSSorin Basca\begin_inset Text 3733*0c56280aSSorin Basca 3734*0c56280aSSorin Basca\layout Standard 3735*0c56280aSSorin Basca 3736*0c56280aSSorin BascaX 3737*0c56280aSSorin Basca\end_inset 3738*0c56280aSSorin Basca</cell> 3739*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3740*0c56280aSSorin Basca\begin_inset Text 3741*0c56280aSSorin Basca 3742*0c56280aSSorin Basca\layout Standard 3743*0c56280aSSorin Basca 3744*0c56280aSSorin BascaX 3745*0c56280aSSorin Basca\end_inset 3746*0c56280aSSorin Basca</cell> 3747*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3748*0c56280aSSorin Basca\begin_inset Text 3749*0c56280aSSorin Basca 3750*0c56280aSSorin Basca\layout Standard 3751*0c56280aSSorin Basca 3752*0c56280aSSorin BascaX 3753*0c56280aSSorin Basca\end_inset 3754*0c56280aSSorin Basca</cell> 3755*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3756*0c56280aSSorin Basca\begin_inset Text 3757*0c56280aSSorin Basca 3758*0c56280aSSorin Basca\layout Standard 3759*0c56280aSSorin Basca 3760*0c56280aSSorin BascaX 3761*0c56280aSSorin Basca\end_inset 3762*0c56280aSSorin Basca</cell> 3763*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3764*0c56280aSSorin Basca\begin_inset Text 3765*0c56280aSSorin Basca 3766*0c56280aSSorin Basca\layout Standard 3767*0c56280aSSorin Basca 3768*0c56280aSSorin BascaX 3769*0c56280aSSorin Basca\end_inset 3770*0c56280aSSorin Basca</cell> 3771*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3772*0c56280aSSorin Basca\begin_inset Text 3773*0c56280aSSorin Basca 3774*0c56280aSSorin Basca\layout Standard 3775*0c56280aSSorin Basca 3776*0c56280aSSorin BascaPush an element of type <?> from an array onto the stack 3777*0c56280aSSorin Basca\end_inset 3778*0c56280aSSorin Basca</cell> 3779*0c56280aSSorin Basca</row> 3780*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3781*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3782*0c56280aSSorin Basca\begin_inset Text 3783*0c56280aSSorin Basca 3784*0c56280aSSorin Basca\layout Standard 3785*0c56280aSSorin Basca 3786*0c56280aSSorin Basca?and 3787*0c56280aSSorin Basca\end_inset 3788*0c56280aSSorin Basca</cell> 3789*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3790*0c56280aSSorin Basca\begin_inset Text 3791*0c56280aSSorin Basca 3792*0c56280aSSorin Basca\layout Standard 3793*0c56280aSSorin Basca 3794*0c56280aSSorin BascaX 3795*0c56280aSSorin Basca\end_inset 3796*0c56280aSSorin Basca</cell> 3797*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3798*0c56280aSSorin Basca\begin_inset Text 3799*0c56280aSSorin Basca 3800*0c56280aSSorin Basca\layout Standard 3801*0c56280aSSorin Basca 3802*0c56280aSSorin BascaX 3803*0c56280aSSorin Basca\end_inset 3804*0c56280aSSorin Basca</cell> 3805*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3806*0c56280aSSorin Basca\begin_inset Text 3807*0c56280aSSorin Basca 3808*0c56280aSSorin Basca\layout Standard 3809*0c56280aSSorin Basca 3810*0c56280aSSorin Basca\end_inset 3811*0c56280aSSorin Basca</cell> 3812*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3813*0c56280aSSorin Basca\begin_inset Text 3814*0c56280aSSorin Basca 3815*0c56280aSSorin Basca\layout Standard 3816*0c56280aSSorin Basca 3817*0c56280aSSorin Basca\end_inset 3818*0c56280aSSorin Basca</cell> 3819*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3820*0c56280aSSorin Basca\begin_inset Text 3821*0c56280aSSorin Basca 3822*0c56280aSSorin Basca\layout Standard 3823*0c56280aSSorin Basca 3824*0c56280aSSorin Basca\end_inset 3825*0c56280aSSorin Basca</cell> 3826*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3827*0c56280aSSorin Basca\begin_inset Text 3828*0c56280aSSorin Basca 3829*0c56280aSSorin Basca\layout Standard 3830*0c56280aSSorin Basca 3831*0c56280aSSorin Basca\end_inset 3832*0c56280aSSorin Basca</cell> 3833*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3834*0c56280aSSorin Basca\begin_inset Text 3835*0c56280aSSorin Basca 3836*0c56280aSSorin Basca\layout Standard 3837*0c56280aSSorin Basca 3838*0c56280aSSorin Basca\end_inset 3839*0c56280aSSorin Basca</cell> 3840*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3841*0c56280aSSorin Basca\begin_inset Text 3842*0c56280aSSorin Basca 3843*0c56280aSSorin Basca\layout Standard 3844*0c56280aSSorin Basca 3845*0c56280aSSorin Basca\end_inset 3846*0c56280aSSorin Basca</cell> 3847*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3848*0c56280aSSorin Basca\begin_inset Text 3849*0c56280aSSorin Basca 3850*0c56280aSSorin Basca\layout Standard 3851*0c56280aSSorin Basca 3852*0c56280aSSorin BascaPerform logical AND on two values of type <?> 3853*0c56280aSSorin Basca\end_inset 3854*0c56280aSSorin Basca</cell> 3855*0c56280aSSorin Basca</row> 3856*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3857*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3858*0c56280aSSorin Basca\begin_inset Text 3859*0c56280aSSorin Basca 3860*0c56280aSSorin Basca\layout Standard 3861*0c56280aSSorin Basca 3862*0c56280aSSorin Basca?astore 3863*0c56280aSSorin Basca\end_inset 3864*0c56280aSSorin Basca</cell> 3865*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3866*0c56280aSSorin Basca\begin_inset Text 3867*0c56280aSSorin Basca 3868*0c56280aSSorin Basca\layout Standard 3869*0c56280aSSorin Basca 3870*0c56280aSSorin BascaX 3871*0c56280aSSorin Basca\end_inset 3872*0c56280aSSorin Basca</cell> 3873*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3874*0c56280aSSorin Basca\begin_inset Text 3875*0c56280aSSorin Basca 3876*0c56280aSSorin Basca\layout Standard 3877*0c56280aSSorin Basca 3878*0c56280aSSorin BascaX 3879*0c56280aSSorin Basca\end_inset 3880*0c56280aSSorin Basca</cell> 3881*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3882*0c56280aSSorin Basca\begin_inset Text 3883*0c56280aSSorin Basca 3884*0c56280aSSorin Basca\layout Standard 3885*0c56280aSSorin Basca 3886*0c56280aSSorin BascaX 3887*0c56280aSSorin Basca\end_inset 3888*0c56280aSSorin Basca</cell> 3889*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3890*0c56280aSSorin Basca\begin_inset Text 3891*0c56280aSSorin Basca 3892*0c56280aSSorin Basca\layout Standard 3893*0c56280aSSorin Basca 3894*0c56280aSSorin BascaX 3895*0c56280aSSorin Basca\end_inset 3896*0c56280aSSorin Basca</cell> 3897*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3898*0c56280aSSorin Basca\begin_inset Text 3899*0c56280aSSorin Basca 3900*0c56280aSSorin Basca\layout Standard 3901*0c56280aSSorin Basca 3902*0c56280aSSorin BascaX 3903*0c56280aSSorin Basca\end_inset 3904*0c56280aSSorin Basca</cell> 3905*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3906*0c56280aSSorin Basca\begin_inset Text 3907*0c56280aSSorin Basca 3908*0c56280aSSorin Basca\layout Standard 3909*0c56280aSSorin Basca 3910*0c56280aSSorin BascaX 3911*0c56280aSSorin Basca\end_inset 3912*0c56280aSSorin Basca</cell> 3913*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3914*0c56280aSSorin Basca\begin_inset Text 3915*0c56280aSSorin Basca 3916*0c56280aSSorin Basca\layout Standard 3917*0c56280aSSorin Basca 3918*0c56280aSSorin BascaX 3919*0c56280aSSorin Basca\end_inset 3920*0c56280aSSorin Basca</cell> 3921*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3922*0c56280aSSorin Basca\begin_inset Text 3923*0c56280aSSorin Basca 3924*0c56280aSSorin Basca\layout Standard 3925*0c56280aSSorin Basca 3926*0c56280aSSorin BascaX 3927*0c56280aSSorin Basca\end_inset 3928*0c56280aSSorin Basca</cell> 3929*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3930*0c56280aSSorin Basca\begin_inset Text 3931*0c56280aSSorin Basca 3932*0c56280aSSorin Basca\layout Standard 3933*0c56280aSSorin Basca 3934*0c56280aSSorin BascaPop an element of type <?> from the stack and store it in an array of type 3935*0c56280aSSorin Basca <?> 3936*0c56280aSSorin Basca\end_inset 3937*0c56280aSSorin Basca</cell> 3938*0c56280aSSorin Basca</row> 3939*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 3940*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3941*0c56280aSSorin Basca\begin_inset Text 3942*0c56280aSSorin Basca 3943*0c56280aSSorin Basca\layout Standard 3944*0c56280aSSorin Basca 3945*0c56280aSSorin Basca?cmp 3946*0c56280aSSorin Basca\end_inset 3947*0c56280aSSorin Basca</cell> 3948*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3949*0c56280aSSorin Basca\begin_inset Text 3950*0c56280aSSorin Basca 3951*0c56280aSSorin Basca\layout Standard 3952*0c56280aSSorin Basca 3953*0c56280aSSorin Basca\end_inset 3954*0c56280aSSorin Basca</cell> 3955*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3956*0c56280aSSorin Basca\begin_inset Text 3957*0c56280aSSorin Basca 3958*0c56280aSSorin Basca\layout Standard 3959*0c56280aSSorin Basca 3960*0c56280aSSorin BascaX 3961*0c56280aSSorin Basca\end_inset 3962*0c56280aSSorin Basca</cell> 3963*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3964*0c56280aSSorin Basca\begin_inset Text 3965*0c56280aSSorin Basca 3966*0c56280aSSorin Basca\layout Standard 3967*0c56280aSSorin Basca 3968*0c56280aSSorin Basca\end_inset 3969*0c56280aSSorin Basca</cell> 3970*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3971*0c56280aSSorin Basca\begin_inset Text 3972*0c56280aSSorin Basca 3973*0c56280aSSorin Basca\layout Standard 3974*0c56280aSSorin Basca 3975*0c56280aSSorin Basca\end_inset 3976*0c56280aSSorin Basca</cell> 3977*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3978*0c56280aSSorin Basca\begin_inset Text 3979*0c56280aSSorin Basca 3980*0c56280aSSorin Basca\layout Standard 3981*0c56280aSSorin Basca 3982*0c56280aSSorin Basca\end_inset 3983*0c56280aSSorin Basca</cell> 3984*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3985*0c56280aSSorin Basca\begin_inset Text 3986*0c56280aSSorin Basca 3987*0c56280aSSorin Basca\layout Standard 3988*0c56280aSSorin Basca 3989*0c56280aSSorin Basca\end_inset 3990*0c56280aSSorin Basca</cell> 3991*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3992*0c56280aSSorin Basca\begin_inset Text 3993*0c56280aSSorin Basca 3994*0c56280aSSorin Basca\layout Standard 3995*0c56280aSSorin Basca 3996*0c56280aSSorin Basca\end_inset 3997*0c56280aSSorin Basca</cell> 3998*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3999*0c56280aSSorin Basca\begin_inset Text 4000*0c56280aSSorin Basca 4001*0c56280aSSorin Basca\layout Standard 4002*0c56280aSSorin Basca 4003*0c56280aSSorin Basca\end_inset 4004*0c56280aSSorin Basca</cell> 4005*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4006*0c56280aSSorin Basca\begin_inset Text 4007*0c56280aSSorin Basca 4008*0c56280aSSorin Basca\layout Standard 4009*0c56280aSSorin Basca 4010*0c56280aSSorin BascaCompare two long values. 4011*0c56280aSSorin Basca If they are equal push 0, if the first is greater push 1, else push -1 4012*0c56280aSSorin Basca\end_inset 4013*0c56280aSSorin Basca</cell> 4014*0c56280aSSorin Basca</row> 4015*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4016*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4017*0c56280aSSorin Basca\begin_inset Text 4018*0c56280aSSorin Basca 4019*0c56280aSSorin Basca\layout Standard 4020*0c56280aSSorin Basca 4021*0c56280aSSorin Basca?cmpg 4022*0c56280aSSorin Basca\end_inset 4023*0c56280aSSorin Basca</cell> 4024*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4025*0c56280aSSorin Basca\begin_inset Text 4026*0c56280aSSorin Basca 4027*0c56280aSSorin Basca\layout Standard 4028*0c56280aSSorin Basca 4029*0c56280aSSorin Basca\end_inset 4030*0c56280aSSorin Basca</cell> 4031*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4032*0c56280aSSorin Basca\begin_inset Text 4033*0c56280aSSorin Basca 4034*0c56280aSSorin Basca\layout Standard 4035*0c56280aSSorin Basca 4036*0c56280aSSorin Basca\end_inset 4037*0c56280aSSorin Basca</cell> 4038*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4039*0c56280aSSorin Basca\begin_inset Text 4040*0c56280aSSorin Basca 4041*0c56280aSSorin Basca\layout Standard 4042*0c56280aSSorin Basca 4043*0c56280aSSorin BascaX 4044*0c56280aSSorin Basca\end_inset 4045*0c56280aSSorin Basca</cell> 4046*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4047*0c56280aSSorin Basca\begin_inset Text 4048*0c56280aSSorin Basca 4049*0c56280aSSorin Basca\layout Standard 4050*0c56280aSSorin Basca 4051*0c56280aSSorin BascaX 4052*0c56280aSSorin Basca\end_inset 4053*0c56280aSSorin Basca</cell> 4054*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4055*0c56280aSSorin Basca\begin_inset Text 4056*0c56280aSSorin Basca 4057*0c56280aSSorin Basca\layout Standard 4058*0c56280aSSorin Basca 4059*0c56280aSSorin Basca\end_inset 4060*0c56280aSSorin Basca</cell> 4061*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4062*0c56280aSSorin Basca\begin_inset Text 4063*0c56280aSSorin Basca 4064*0c56280aSSorin Basca\layout Standard 4065*0c56280aSSorin Basca 4066*0c56280aSSorin Basca\end_inset 4067*0c56280aSSorin Basca</cell> 4068*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4069*0c56280aSSorin Basca\begin_inset Text 4070*0c56280aSSorin Basca 4071*0c56280aSSorin Basca\layout Standard 4072*0c56280aSSorin Basca 4073*0c56280aSSorin Basca\end_inset 4074*0c56280aSSorin Basca</cell> 4075*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4076*0c56280aSSorin Basca\begin_inset Text 4077*0c56280aSSorin Basca 4078*0c56280aSSorin Basca\layout Standard 4079*0c56280aSSorin Basca 4080*0c56280aSSorin Basca\end_inset 4081*0c56280aSSorin Basca</cell> 4082*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4083*0c56280aSSorin Basca\begin_inset Text 4084*0c56280aSSorin Basca 4085*0c56280aSSorin Basca\layout Standard 4086*0c56280aSSorin Basca 4087*0c56280aSSorin BascaCompare two IEEE values of type <?> from the stack. 4088*0c56280aSSorin Basca If they are equal push 0, if the first is greater push 1, if the second 4089*0c56280aSSorin Basca is greater push -1. 4090*0c56280aSSorin Basca If either is NaN (not a number) push 1 4091*0c56280aSSorin Basca\end_inset 4092*0c56280aSSorin Basca</cell> 4093*0c56280aSSorin Basca</row> 4094*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4095*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4096*0c56280aSSorin Basca\begin_inset Text 4097*0c56280aSSorin Basca 4098*0c56280aSSorin Basca\layout Standard 4099*0c56280aSSorin Basca 4100*0c56280aSSorin Basca?cmpl 4101*0c56280aSSorin Basca\end_inset 4102*0c56280aSSorin Basca</cell> 4103*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4104*0c56280aSSorin Basca\begin_inset Text 4105*0c56280aSSorin Basca 4106*0c56280aSSorin Basca\layout Standard 4107*0c56280aSSorin Basca 4108*0c56280aSSorin Basca\end_inset 4109*0c56280aSSorin Basca</cell> 4110*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4111*0c56280aSSorin Basca\begin_inset Text 4112*0c56280aSSorin Basca 4113*0c56280aSSorin Basca\layout Standard 4114*0c56280aSSorin Basca 4115*0c56280aSSorin Basca\end_inset 4116*0c56280aSSorin Basca</cell> 4117*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4118*0c56280aSSorin Basca\begin_inset Text 4119*0c56280aSSorin Basca 4120*0c56280aSSorin Basca\layout Standard 4121*0c56280aSSorin Basca 4122*0c56280aSSorin BascaX 4123*0c56280aSSorin Basca\end_inset 4124*0c56280aSSorin Basca</cell> 4125*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4126*0c56280aSSorin Basca\begin_inset Text 4127*0c56280aSSorin Basca 4128*0c56280aSSorin Basca\layout Standard 4129*0c56280aSSorin Basca 4130*0c56280aSSorin BascaX 4131*0c56280aSSorin Basca\end_inset 4132*0c56280aSSorin Basca</cell> 4133*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4134*0c56280aSSorin Basca\begin_inset Text 4135*0c56280aSSorin Basca 4136*0c56280aSSorin Basca\layout Standard 4137*0c56280aSSorin Basca 4138*0c56280aSSorin Basca\end_inset 4139*0c56280aSSorin Basca</cell> 4140*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4141*0c56280aSSorin Basca\begin_inset Text 4142*0c56280aSSorin Basca 4143*0c56280aSSorin Basca\layout Standard 4144*0c56280aSSorin Basca 4145*0c56280aSSorin Basca\end_inset 4146*0c56280aSSorin Basca</cell> 4147*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4148*0c56280aSSorin Basca\begin_inset Text 4149*0c56280aSSorin Basca 4150*0c56280aSSorin Basca\layout Standard 4151*0c56280aSSorin Basca 4152*0c56280aSSorin Basca\end_inset 4153*0c56280aSSorin Basca</cell> 4154*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4155*0c56280aSSorin Basca\begin_inset Text 4156*0c56280aSSorin Basca 4157*0c56280aSSorin Basca\layout Standard 4158*0c56280aSSorin Basca 4159*0c56280aSSorin Basca\end_inset 4160*0c56280aSSorin Basca</cell> 4161*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4162*0c56280aSSorin Basca\begin_inset Text 4163*0c56280aSSorin Basca 4164*0c56280aSSorin Basca\layout Standard 4165*0c56280aSSorin Basca 4166*0c56280aSSorin BascaCompare two IEEE values of type <?> from the stack. 4167*0c56280aSSorin Basca If they are equal push 0, if the first is greater push 1, if the second 4168*0c56280aSSorin Basca is greater push -1. 4169*0c56280aSSorin Basca If either is NaN (not a number) push -1 4170*0c56280aSSorin Basca\end_inset 4171*0c56280aSSorin Basca</cell> 4172*0c56280aSSorin Basca</row> 4173*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4174*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4175*0c56280aSSorin Basca\begin_inset Text 4176*0c56280aSSorin Basca 4177*0c56280aSSorin Basca\layout Standard 4178*0c56280aSSorin Basca 4179*0c56280aSSorin Basca?const 4180*0c56280aSSorin Basca\end_inset 4181*0c56280aSSorin Basca</cell> 4182*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4183*0c56280aSSorin Basca\begin_inset Text 4184*0c56280aSSorin Basca 4185*0c56280aSSorin Basca\layout Standard 4186*0c56280aSSorin Basca 4187*0c56280aSSorin BascaX 4188*0c56280aSSorin Basca\end_inset 4189*0c56280aSSorin Basca</cell> 4190*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4191*0c56280aSSorin Basca\begin_inset Text 4192*0c56280aSSorin Basca 4193*0c56280aSSorin Basca\layout Standard 4194*0c56280aSSorin Basca 4195*0c56280aSSorin BascaX 4196*0c56280aSSorin Basca\end_inset 4197*0c56280aSSorin Basca</cell> 4198*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4199*0c56280aSSorin Basca\begin_inset Text 4200*0c56280aSSorin Basca 4201*0c56280aSSorin Basca\layout Standard 4202*0c56280aSSorin Basca 4203*0c56280aSSorin BascaX 4204*0c56280aSSorin Basca\end_inset 4205*0c56280aSSorin Basca</cell> 4206*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4207*0c56280aSSorin Basca\begin_inset Text 4208*0c56280aSSorin Basca 4209*0c56280aSSorin Basca\layout Standard 4210*0c56280aSSorin Basca 4211*0c56280aSSorin BascaX 4212*0c56280aSSorin Basca\end_inset 4213*0c56280aSSorin Basca</cell> 4214*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4215*0c56280aSSorin Basca\begin_inset Text 4216*0c56280aSSorin Basca 4217*0c56280aSSorin Basca\layout Standard 4218*0c56280aSSorin Basca 4219*0c56280aSSorin Basca\end_inset 4220*0c56280aSSorin Basca</cell> 4221*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4222*0c56280aSSorin Basca\begin_inset Text 4223*0c56280aSSorin Basca 4224*0c56280aSSorin Basca\layout Standard 4225*0c56280aSSorin Basca 4226*0c56280aSSorin Basca\end_inset 4227*0c56280aSSorin Basca</cell> 4228*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4229*0c56280aSSorin Basca\begin_inset Text 4230*0c56280aSSorin Basca 4231*0c56280aSSorin Basca\layout Standard 4232*0c56280aSSorin Basca 4233*0c56280aSSorin Basca\end_inset 4234*0c56280aSSorin Basca</cell> 4235*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4236*0c56280aSSorin Basca\begin_inset Text 4237*0c56280aSSorin Basca 4238*0c56280aSSorin Basca\layout Standard 4239*0c56280aSSorin Basca 4240*0c56280aSSorin BascaX 4241*0c56280aSSorin Basca\end_inset 4242*0c56280aSSorin Basca</cell> 4243*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4244*0c56280aSSorin Basca\begin_inset Text 4245*0c56280aSSorin Basca 4246*0c56280aSSorin Basca\layout Standard 4247*0c56280aSSorin Basca 4248*0c56280aSSorin BascaPush a constant value of type <?> onto the stack 4249*0c56280aSSorin Basca\end_inset 4250*0c56280aSSorin Basca</cell> 4251*0c56280aSSorin Basca</row> 4252*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4253*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4254*0c56280aSSorin Basca\begin_inset Text 4255*0c56280aSSorin Basca 4256*0c56280aSSorin Basca\layout Standard 4257*0c56280aSSorin Basca 4258*0c56280aSSorin Basca?div 4259*0c56280aSSorin Basca\end_inset 4260*0c56280aSSorin Basca</cell> 4261*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4262*0c56280aSSorin Basca\begin_inset Text 4263*0c56280aSSorin Basca 4264*0c56280aSSorin Basca\layout Standard 4265*0c56280aSSorin Basca 4266*0c56280aSSorin BascaX 4267*0c56280aSSorin Basca\end_inset 4268*0c56280aSSorin Basca</cell> 4269*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4270*0c56280aSSorin Basca\begin_inset Text 4271*0c56280aSSorin Basca 4272*0c56280aSSorin Basca\layout Standard 4273*0c56280aSSorin Basca 4274*0c56280aSSorin BascaX 4275*0c56280aSSorin Basca\end_inset 4276*0c56280aSSorin Basca</cell> 4277*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4278*0c56280aSSorin Basca\begin_inset Text 4279*0c56280aSSorin Basca 4280*0c56280aSSorin Basca\layout Standard 4281*0c56280aSSorin Basca 4282*0c56280aSSorin BascaX 4283*0c56280aSSorin Basca\end_inset 4284*0c56280aSSorin Basca</cell> 4285*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4286*0c56280aSSorin Basca\begin_inset Text 4287*0c56280aSSorin Basca 4288*0c56280aSSorin Basca\layout Standard 4289*0c56280aSSorin Basca 4290*0c56280aSSorin BascaX 4291*0c56280aSSorin Basca\end_inset 4292*0c56280aSSorin Basca</cell> 4293*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4294*0c56280aSSorin Basca\begin_inset Text 4295*0c56280aSSorin Basca 4296*0c56280aSSorin Basca\layout Standard 4297*0c56280aSSorin Basca 4298*0c56280aSSorin Basca\end_inset 4299*0c56280aSSorin Basca</cell> 4300*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4301*0c56280aSSorin Basca\begin_inset Text 4302*0c56280aSSorin Basca 4303*0c56280aSSorin Basca\layout Standard 4304*0c56280aSSorin Basca 4305*0c56280aSSorin Basca\end_inset 4306*0c56280aSSorin Basca</cell> 4307*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4308*0c56280aSSorin Basca\begin_inset Text 4309*0c56280aSSorin Basca 4310*0c56280aSSorin Basca\layout Standard 4311*0c56280aSSorin Basca 4312*0c56280aSSorin Basca\end_inset 4313*0c56280aSSorin Basca</cell> 4314*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4315*0c56280aSSorin Basca\begin_inset Text 4316*0c56280aSSorin Basca 4317*0c56280aSSorin Basca\layout Standard 4318*0c56280aSSorin Basca 4319*0c56280aSSorin Basca\end_inset 4320*0c56280aSSorin Basca</cell> 4321*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4322*0c56280aSSorin Basca\begin_inset Text 4323*0c56280aSSorin Basca 4324*0c56280aSSorin Basca\layout Standard 4325*0c56280aSSorin Basca 4326*0c56280aSSorin BascaPerform a division using two values of type <?> and push the quotient onto 4327*0c56280aSSorin Basca the stack 4328*0c56280aSSorin Basca\end_inset 4329*0c56280aSSorin Basca</cell> 4330*0c56280aSSorin Basca</row> 4331*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4332*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4333*0c56280aSSorin Basca\begin_inset Text 4334*0c56280aSSorin Basca 4335*0c56280aSSorin Basca\layout Standard 4336*0c56280aSSorin Basca 4337*0c56280aSSorin Basca?inc 4338*0c56280aSSorin Basca\end_inset 4339*0c56280aSSorin Basca</cell> 4340*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4341*0c56280aSSorin Basca\begin_inset Text 4342*0c56280aSSorin Basca 4343*0c56280aSSorin Basca\layout Standard 4344*0c56280aSSorin Basca 4345*0c56280aSSorin BascaX 4346*0c56280aSSorin Basca\end_inset 4347*0c56280aSSorin Basca</cell> 4348*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4349*0c56280aSSorin Basca\begin_inset Text 4350*0c56280aSSorin Basca 4351*0c56280aSSorin Basca\layout Standard 4352*0c56280aSSorin Basca 4353*0c56280aSSorin Basca\end_inset 4354*0c56280aSSorin Basca</cell> 4355*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4356*0c56280aSSorin Basca\begin_inset Text 4357*0c56280aSSorin Basca 4358*0c56280aSSorin Basca\layout Standard 4359*0c56280aSSorin Basca 4360*0c56280aSSorin Basca\end_inset 4361*0c56280aSSorin Basca</cell> 4362*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4363*0c56280aSSorin Basca\begin_inset Text 4364*0c56280aSSorin Basca 4365*0c56280aSSorin Basca\layout Standard 4366*0c56280aSSorin Basca 4367*0c56280aSSorin Basca\end_inset 4368*0c56280aSSorin Basca</cell> 4369*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4370*0c56280aSSorin Basca\begin_inset Text 4371*0c56280aSSorin Basca 4372*0c56280aSSorin Basca\layout Standard 4373*0c56280aSSorin Basca 4374*0c56280aSSorin Basca\end_inset 4375*0c56280aSSorin Basca</cell> 4376*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4377*0c56280aSSorin Basca\begin_inset Text 4378*0c56280aSSorin Basca 4379*0c56280aSSorin Basca\layout Standard 4380*0c56280aSSorin Basca 4381*0c56280aSSorin Basca\end_inset 4382*0c56280aSSorin Basca</cell> 4383*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4384*0c56280aSSorin Basca\begin_inset Text 4385*0c56280aSSorin Basca 4386*0c56280aSSorin Basca\layout Standard 4387*0c56280aSSorin Basca 4388*0c56280aSSorin Basca\end_inset 4389*0c56280aSSorin Basca</cell> 4390*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4391*0c56280aSSorin Basca\begin_inset Text 4392*0c56280aSSorin Basca 4393*0c56280aSSorin Basca\layout Standard 4394*0c56280aSSorin Basca 4395*0c56280aSSorin Basca\end_inset 4396*0c56280aSSorin Basca</cell> 4397*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4398*0c56280aSSorin Basca\begin_inset Text 4399*0c56280aSSorin Basca 4400*0c56280aSSorin Basca\layout Standard 4401*0c56280aSSorin Basca 4402*0c56280aSSorin BascaIncrement the top of the stack (possibly by a negative value) 4403*0c56280aSSorin Basca\end_inset 4404*0c56280aSSorin Basca</cell> 4405*0c56280aSSorin Basca</row> 4406*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4407*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4408*0c56280aSSorin Basca\begin_inset Text 4409*0c56280aSSorin Basca 4410*0c56280aSSorin Basca\layout Standard 4411*0c56280aSSorin Basca 4412*0c56280aSSorin Basca?ipush 4413*0c56280aSSorin Basca\end_inset 4414*0c56280aSSorin Basca</cell> 4415*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4416*0c56280aSSorin Basca\begin_inset Text 4417*0c56280aSSorin Basca 4418*0c56280aSSorin Basca\layout Standard 4419*0c56280aSSorin Basca 4420*0c56280aSSorin Basca\end_inset 4421*0c56280aSSorin Basca</cell> 4422*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4423*0c56280aSSorin Basca\begin_inset Text 4424*0c56280aSSorin Basca 4425*0c56280aSSorin Basca\layout Standard 4426*0c56280aSSorin Basca 4427*0c56280aSSorin Basca\end_inset 4428*0c56280aSSorin Basca</cell> 4429*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4430*0c56280aSSorin Basca\begin_inset Text 4431*0c56280aSSorin Basca 4432*0c56280aSSorin Basca\layout Standard 4433*0c56280aSSorin Basca 4434*0c56280aSSorin Basca\end_inset 4435*0c56280aSSorin Basca</cell> 4436*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4437*0c56280aSSorin Basca\begin_inset Text 4438*0c56280aSSorin Basca 4439*0c56280aSSorin Basca\layout Standard 4440*0c56280aSSorin Basca 4441*0c56280aSSorin Basca\end_inset 4442*0c56280aSSorin Basca</cell> 4443*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4444*0c56280aSSorin Basca\begin_inset Text 4445*0c56280aSSorin Basca 4446*0c56280aSSorin Basca\layout Standard 4447*0c56280aSSorin Basca 4448*0c56280aSSorin BascaX 4449*0c56280aSSorin Basca\end_inset 4450*0c56280aSSorin Basca</cell> 4451*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4452*0c56280aSSorin Basca\begin_inset Text 4453*0c56280aSSorin Basca 4454*0c56280aSSorin Basca\layout Standard 4455*0c56280aSSorin Basca 4456*0c56280aSSorin Basca\end_inset 4457*0c56280aSSorin Basca</cell> 4458*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4459*0c56280aSSorin Basca\begin_inset Text 4460*0c56280aSSorin Basca 4461*0c56280aSSorin Basca\layout Standard 4462*0c56280aSSorin Basca 4463*0c56280aSSorin BascaX 4464*0c56280aSSorin Basca\end_inset 4465*0c56280aSSorin Basca</cell> 4466*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4467*0c56280aSSorin Basca\begin_inset Text 4468*0c56280aSSorin Basca 4469*0c56280aSSorin Basca\layout Standard 4470*0c56280aSSorin Basca 4471*0c56280aSSorin Basca\end_inset 4472*0c56280aSSorin Basca</cell> 4473*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4474*0c56280aSSorin Basca\begin_inset Text 4475*0c56280aSSorin Basca 4476*0c56280aSSorin Basca\layout Standard 4477*0c56280aSSorin Basca 4478*0c56280aSSorin BascaPush a sign extended byte or short value onto the stack 4479*0c56280aSSorin Basca\end_inset 4480*0c56280aSSorin Basca</cell> 4481*0c56280aSSorin Basca</row> 4482*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4483*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4484*0c56280aSSorin Basca\begin_inset Text 4485*0c56280aSSorin Basca 4486*0c56280aSSorin Basca\layout Standard 4487*0c56280aSSorin Basca 4488*0c56280aSSorin Basca?load 4489*0c56280aSSorin Basca\end_inset 4490*0c56280aSSorin Basca</cell> 4491*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4492*0c56280aSSorin Basca\begin_inset Text 4493*0c56280aSSorin Basca 4494*0c56280aSSorin Basca\layout Standard 4495*0c56280aSSorin Basca 4496*0c56280aSSorin BascaX 4497*0c56280aSSorin Basca\end_inset 4498*0c56280aSSorin Basca</cell> 4499*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4500*0c56280aSSorin Basca\begin_inset Text 4501*0c56280aSSorin Basca 4502*0c56280aSSorin Basca\layout Standard 4503*0c56280aSSorin Basca 4504*0c56280aSSorin BascaX 4505*0c56280aSSorin Basca\end_inset 4506*0c56280aSSorin Basca</cell> 4507*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4508*0c56280aSSorin Basca\begin_inset Text 4509*0c56280aSSorin Basca 4510*0c56280aSSorin Basca\layout Standard 4511*0c56280aSSorin Basca 4512*0c56280aSSorin BascaX 4513*0c56280aSSorin Basca\end_inset 4514*0c56280aSSorin Basca</cell> 4515*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4516*0c56280aSSorin Basca\begin_inset Text 4517*0c56280aSSorin Basca 4518*0c56280aSSorin Basca\layout Standard 4519*0c56280aSSorin Basca 4520*0c56280aSSorin BascaX 4521*0c56280aSSorin Basca\end_inset 4522*0c56280aSSorin Basca</cell> 4523*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4524*0c56280aSSorin Basca\begin_inset Text 4525*0c56280aSSorin Basca 4526*0c56280aSSorin Basca\layout Standard 4527*0c56280aSSorin Basca 4528*0c56280aSSorin Basca\end_inset 4529*0c56280aSSorin Basca</cell> 4530*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4531*0c56280aSSorin Basca\begin_inset Text 4532*0c56280aSSorin Basca 4533*0c56280aSSorin Basca\layout Standard 4534*0c56280aSSorin Basca 4535*0c56280aSSorin Basca\end_inset 4536*0c56280aSSorin Basca</cell> 4537*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4538*0c56280aSSorin Basca\begin_inset Text 4539*0c56280aSSorin Basca 4540*0c56280aSSorin Basca\layout Standard 4541*0c56280aSSorin Basca 4542*0c56280aSSorin Basca\end_inset 4543*0c56280aSSorin Basca</cell> 4544*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4545*0c56280aSSorin Basca\begin_inset Text 4546*0c56280aSSorin Basca 4547*0c56280aSSorin Basca\layout Standard 4548*0c56280aSSorin Basca 4549*0c56280aSSorin Basca\end_inset 4550*0c56280aSSorin Basca</cell> 4551*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4552*0c56280aSSorin Basca\begin_inset Text 4553*0c56280aSSorin Basca 4554*0c56280aSSorin Basca\layout Standard 4555*0c56280aSSorin Basca 4556*0c56280aSSorin BascaPush a value of type <?> from a local variable onto the stack 4557*0c56280aSSorin Basca\end_inset 4558*0c56280aSSorin Basca</cell> 4559*0c56280aSSorin Basca</row> 4560*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4561*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4562*0c56280aSSorin Basca\begin_inset Text 4563*0c56280aSSorin Basca 4564*0c56280aSSorin Basca\layout Standard 4565*0c56280aSSorin Basca 4566*0c56280aSSorin Basca?mul 4567*0c56280aSSorin Basca\end_inset 4568*0c56280aSSorin Basca</cell> 4569*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4570*0c56280aSSorin Basca\begin_inset Text 4571*0c56280aSSorin Basca 4572*0c56280aSSorin Basca\layout Standard 4573*0c56280aSSorin Basca 4574*0c56280aSSorin BascaX 4575*0c56280aSSorin Basca\end_inset 4576*0c56280aSSorin Basca</cell> 4577*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4578*0c56280aSSorin Basca\begin_inset Text 4579*0c56280aSSorin Basca 4580*0c56280aSSorin Basca\layout Standard 4581*0c56280aSSorin Basca 4582*0c56280aSSorin BascaX 4583*0c56280aSSorin Basca\end_inset 4584*0c56280aSSorin Basca</cell> 4585*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4586*0c56280aSSorin Basca\begin_inset Text 4587*0c56280aSSorin Basca 4588*0c56280aSSorin Basca\layout Standard 4589*0c56280aSSorin Basca 4590*0c56280aSSorin BascaX 4591*0c56280aSSorin Basca\end_inset 4592*0c56280aSSorin Basca</cell> 4593*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4594*0c56280aSSorin Basca\begin_inset Text 4595*0c56280aSSorin Basca 4596*0c56280aSSorin Basca\layout Standard 4597*0c56280aSSorin Basca 4598*0c56280aSSorin BascaX 4599*0c56280aSSorin Basca\end_inset 4600*0c56280aSSorin Basca</cell> 4601*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4602*0c56280aSSorin Basca\begin_inset Text 4603*0c56280aSSorin Basca 4604*0c56280aSSorin Basca\layout Standard 4605*0c56280aSSorin Basca 4606*0c56280aSSorin Basca\end_inset 4607*0c56280aSSorin Basca</cell> 4608*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4609*0c56280aSSorin Basca\begin_inset Text 4610*0c56280aSSorin Basca 4611*0c56280aSSorin Basca\layout Standard 4612*0c56280aSSorin Basca 4613*0c56280aSSorin Basca\end_inset 4614*0c56280aSSorin Basca</cell> 4615*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4616*0c56280aSSorin Basca\begin_inset Text 4617*0c56280aSSorin Basca 4618*0c56280aSSorin Basca\layout Standard 4619*0c56280aSSorin Basca 4620*0c56280aSSorin Basca\end_inset 4621*0c56280aSSorin Basca</cell> 4622*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4623*0c56280aSSorin Basca\begin_inset Text 4624*0c56280aSSorin Basca 4625*0c56280aSSorin Basca\layout Standard 4626*0c56280aSSorin Basca 4627*0c56280aSSorin Basca\end_inset 4628*0c56280aSSorin Basca</cell> 4629*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4630*0c56280aSSorin Basca\begin_inset Text 4631*0c56280aSSorin Basca 4632*0c56280aSSorin Basca\layout Standard 4633*0c56280aSSorin Basca 4634*0c56280aSSorin BascaPerform multiplication of two values of type <?> 4635*0c56280aSSorin Basca\end_inset 4636*0c56280aSSorin Basca</cell> 4637*0c56280aSSorin Basca</row> 4638*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4639*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4640*0c56280aSSorin Basca\begin_inset Text 4641*0c56280aSSorin Basca 4642*0c56280aSSorin Basca\layout Standard 4643*0c56280aSSorin Basca 4644*0c56280aSSorin Basca?neg 4645*0c56280aSSorin Basca\end_inset 4646*0c56280aSSorin Basca</cell> 4647*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4648*0c56280aSSorin Basca\begin_inset Text 4649*0c56280aSSorin Basca 4650*0c56280aSSorin Basca\layout Standard 4651*0c56280aSSorin Basca 4652*0c56280aSSorin BascaX 4653*0c56280aSSorin Basca\end_inset 4654*0c56280aSSorin Basca</cell> 4655*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4656*0c56280aSSorin Basca\begin_inset Text 4657*0c56280aSSorin Basca 4658*0c56280aSSorin Basca\layout Standard 4659*0c56280aSSorin Basca 4660*0c56280aSSorin BascaX 4661*0c56280aSSorin Basca\end_inset 4662*0c56280aSSorin Basca</cell> 4663*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4664*0c56280aSSorin Basca\begin_inset Text 4665*0c56280aSSorin Basca 4666*0c56280aSSorin Basca\layout Standard 4667*0c56280aSSorin Basca 4668*0c56280aSSorin BascaX 4669*0c56280aSSorin Basca\end_inset 4670*0c56280aSSorin Basca</cell> 4671*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4672*0c56280aSSorin Basca\begin_inset Text 4673*0c56280aSSorin Basca 4674*0c56280aSSorin Basca\layout Standard 4675*0c56280aSSorin Basca 4676*0c56280aSSorin BascaX 4677*0c56280aSSorin Basca\end_inset 4678*0c56280aSSorin Basca</cell> 4679*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4680*0c56280aSSorin Basca\begin_inset Text 4681*0c56280aSSorin Basca 4682*0c56280aSSorin Basca\layout Standard 4683*0c56280aSSorin Basca 4684*0c56280aSSorin Basca\end_inset 4685*0c56280aSSorin Basca</cell> 4686*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4687*0c56280aSSorin Basca\begin_inset Text 4688*0c56280aSSorin Basca 4689*0c56280aSSorin Basca\layout Standard 4690*0c56280aSSorin Basca 4691*0c56280aSSorin Basca\end_inset 4692*0c56280aSSorin Basca</cell> 4693*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4694*0c56280aSSorin Basca\begin_inset Text 4695*0c56280aSSorin Basca 4696*0c56280aSSorin Basca\layout Standard 4697*0c56280aSSorin Basca 4698*0c56280aSSorin Basca\end_inset 4699*0c56280aSSorin Basca</cell> 4700*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4701*0c56280aSSorin Basca\begin_inset Text 4702*0c56280aSSorin Basca 4703*0c56280aSSorin Basca\layout Standard 4704*0c56280aSSorin Basca 4705*0c56280aSSorin Basca\end_inset 4706*0c56280aSSorin Basca</cell> 4707*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4708*0c56280aSSorin Basca\begin_inset Text 4709*0c56280aSSorin Basca 4710*0c56280aSSorin Basca\layout Standard 4711*0c56280aSSorin Basca 4712*0c56280aSSorin BascaNegate a value of type <?> 4713*0c56280aSSorin Basca\end_inset 4714*0c56280aSSorin Basca</cell> 4715*0c56280aSSorin Basca</row> 4716*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4717*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4718*0c56280aSSorin Basca\begin_inset Text 4719*0c56280aSSorin Basca 4720*0c56280aSSorin Basca\layout Standard 4721*0c56280aSSorin Basca 4722*0c56280aSSorin Basca?newarray 4723*0c56280aSSorin Basca\end_inset 4724*0c56280aSSorin Basca</cell> 4725*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4726*0c56280aSSorin Basca\begin_inset Text 4727*0c56280aSSorin Basca 4728*0c56280aSSorin Basca\layout Standard 4729*0c56280aSSorin Basca 4730*0c56280aSSorin Basca\end_inset 4731*0c56280aSSorin Basca</cell> 4732*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4733*0c56280aSSorin Basca\begin_inset Text 4734*0c56280aSSorin Basca 4735*0c56280aSSorin Basca\layout Standard 4736*0c56280aSSorin Basca 4737*0c56280aSSorin Basca\end_inset 4738*0c56280aSSorin Basca</cell> 4739*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4740*0c56280aSSorin Basca\begin_inset Text 4741*0c56280aSSorin Basca 4742*0c56280aSSorin Basca\layout Standard 4743*0c56280aSSorin Basca 4744*0c56280aSSorin Basca\end_inset 4745*0c56280aSSorin Basca</cell> 4746*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4747*0c56280aSSorin Basca\begin_inset Text 4748*0c56280aSSorin Basca 4749*0c56280aSSorin Basca\layout Standard 4750*0c56280aSSorin Basca 4751*0c56280aSSorin Basca\end_inset 4752*0c56280aSSorin Basca</cell> 4753*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4754*0c56280aSSorin Basca\begin_inset Text 4755*0c56280aSSorin Basca 4756*0c56280aSSorin Basca\layout Standard 4757*0c56280aSSorin Basca 4758*0c56280aSSorin Basca\end_inset 4759*0c56280aSSorin Basca</cell> 4760*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4761*0c56280aSSorin Basca\begin_inset Text 4762*0c56280aSSorin Basca 4763*0c56280aSSorin Basca\layout Standard 4764*0c56280aSSorin Basca 4765*0c56280aSSorin Basca\end_inset 4766*0c56280aSSorin Basca</cell> 4767*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4768*0c56280aSSorin Basca\begin_inset Text 4769*0c56280aSSorin Basca 4770*0c56280aSSorin Basca\layout Standard 4771*0c56280aSSorin Basca 4772*0c56280aSSorin Basca\end_inset 4773*0c56280aSSorin Basca</cell> 4774*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4775*0c56280aSSorin Basca\begin_inset Text 4776*0c56280aSSorin Basca 4777*0c56280aSSorin Basca\layout Standard 4778*0c56280aSSorin Basca 4779*0c56280aSSorin BascaX 4780*0c56280aSSorin Basca\end_inset 4781*0c56280aSSorin Basca</cell> 4782*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4783*0c56280aSSorin Basca\begin_inset Text 4784*0c56280aSSorin Basca 4785*0c56280aSSorin Basca\layout Standard 4786*0c56280aSSorin Basca 4787*0c56280aSSorin BascaCreate a new array of object references 4788*0c56280aSSorin Basca\end_inset 4789*0c56280aSSorin Basca</cell> 4790*0c56280aSSorin Basca</row> 4791*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4792*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4793*0c56280aSSorin Basca\begin_inset Text 4794*0c56280aSSorin Basca 4795*0c56280aSSorin Basca\layout Standard 4796*0c56280aSSorin Basca 4797*0c56280aSSorin Basca?or 4798*0c56280aSSorin Basca\end_inset 4799*0c56280aSSorin Basca</cell> 4800*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4801*0c56280aSSorin Basca\begin_inset Text 4802*0c56280aSSorin Basca 4803*0c56280aSSorin Basca\layout Standard 4804*0c56280aSSorin Basca 4805*0c56280aSSorin BascaX 4806*0c56280aSSorin Basca\end_inset 4807*0c56280aSSorin Basca</cell> 4808*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4809*0c56280aSSorin Basca\begin_inset Text 4810*0c56280aSSorin Basca 4811*0c56280aSSorin Basca\layout Standard 4812*0c56280aSSorin Basca 4813*0c56280aSSorin BascaX 4814*0c56280aSSorin Basca\end_inset 4815*0c56280aSSorin Basca</cell> 4816*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4817*0c56280aSSorin Basca\begin_inset Text 4818*0c56280aSSorin Basca 4819*0c56280aSSorin Basca\layout Standard 4820*0c56280aSSorin Basca 4821*0c56280aSSorin Basca\end_inset 4822*0c56280aSSorin Basca</cell> 4823*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4824*0c56280aSSorin Basca\begin_inset Text 4825*0c56280aSSorin Basca 4826*0c56280aSSorin Basca\layout Standard 4827*0c56280aSSorin Basca 4828*0c56280aSSorin Basca\end_inset 4829*0c56280aSSorin Basca</cell> 4830*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4831*0c56280aSSorin Basca\begin_inset Text 4832*0c56280aSSorin Basca 4833*0c56280aSSorin Basca\layout Standard 4834*0c56280aSSorin Basca 4835*0c56280aSSorin Basca\end_inset 4836*0c56280aSSorin Basca</cell> 4837*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4838*0c56280aSSorin Basca\begin_inset Text 4839*0c56280aSSorin Basca 4840*0c56280aSSorin Basca\layout Standard 4841*0c56280aSSorin Basca 4842*0c56280aSSorin Basca\end_inset 4843*0c56280aSSorin Basca</cell> 4844*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4845*0c56280aSSorin Basca\begin_inset Text 4846*0c56280aSSorin Basca 4847*0c56280aSSorin Basca\layout Standard 4848*0c56280aSSorin Basca 4849*0c56280aSSorin Basca\end_inset 4850*0c56280aSSorin Basca</cell> 4851*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4852*0c56280aSSorin Basca\begin_inset Text 4853*0c56280aSSorin Basca 4854*0c56280aSSorin Basca\layout Standard 4855*0c56280aSSorin Basca 4856*0c56280aSSorin Basca\end_inset 4857*0c56280aSSorin Basca</cell> 4858*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4859*0c56280aSSorin Basca\begin_inset Text 4860*0c56280aSSorin Basca 4861*0c56280aSSorin Basca\layout Standard 4862*0c56280aSSorin Basca 4863*0c56280aSSorin BascaPerform logical OR on two values of type <?> 4864*0c56280aSSorin Basca\end_inset 4865*0c56280aSSorin Basca</cell> 4866*0c56280aSSorin Basca</row> 4867*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4868*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4869*0c56280aSSorin Basca\begin_inset Text 4870*0c56280aSSorin Basca 4871*0c56280aSSorin Basca\layout Standard 4872*0c56280aSSorin Basca 4873*0c56280aSSorin Basca?rem 4874*0c56280aSSorin Basca\end_inset 4875*0c56280aSSorin Basca</cell> 4876*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4877*0c56280aSSorin Basca\begin_inset Text 4878*0c56280aSSorin Basca 4879*0c56280aSSorin Basca\layout Standard 4880*0c56280aSSorin Basca 4881*0c56280aSSorin BascaX 4882*0c56280aSSorin Basca\end_inset 4883*0c56280aSSorin Basca</cell> 4884*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4885*0c56280aSSorin Basca\begin_inset Text 4886*0c56280aSSorin Basca 4887*0c56280aSSorin Basca\layout Standard 4888*0c56280aSSorin Basca 4889*0c56280aSSorin BascaX 4890*0c56280aSSorin Basca\end_inset 4891*0c56280aSSorin Basca</cell> 4892*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4893*0c56280aSSorin Basca\begin_inset Text 4894*0c56280aSSorin Basca 4895*0c56280aSSorin Basca\layout Standard 4896*0c56280aSSorin Basca 4897*0c56280aSSorin BascaX 4898*0c56280aSSorin Basca\end_inset 4899*0c56280aSSorin Basca</cell> 4900*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4901*0c56280aSSorin Basca\begin_inset Text 4902*0c56280aSSorin Basca 4903*0c56280aSSorin Basca\layout Standard 4904*0c56280aSSorin Basca 4905*0c56280aSSorin BascaX 4906*0c56280aSSorin Basca\end_inset 4907*0c56280aSSorin Basca</cell> 4908*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4909*0c56280aSSorin Basca\begin_inset Text 4910*0c56280aSSorin Basca 4911*0c56280aSSorin Basca\layout Standard 4912*0c56280aSSorin Basca 4913*0c56280aSSorin Basca\end_inset 4914*0c56280aSSorin Basca</cell> 4915*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4916*0c56280aSSorin Basca\begin_inset Text 4917*0c56280aSSorin Basca 4918*0c56280aSSorin Basca\layout Standard 4919*0c56280aSSorin Basca 4920*0c56280aSSorin Basca\end_inset 4921*0c56280aSSorin Basca</cell> 4922*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4923*0c56280aSSorin Basca\begin_inset Text 4924*0c56280aSSorin Basca 4925*0c56280aSSorin Basca\layout Standard 4926*0c56280aSSorin Basca 4927*0c56280aSSorin Basca\end_inset 4928*0c56280aSSorin Basca</cell> 4929*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4930*0c56280aSSorin Basca\begin_inset Text 4931*0c56280aSSorin Basca 4932*0c56280aSSorin Basca\layout Standard 4933*0c56280aSSorin Basca 4934*0c56280aSSorin Basca\end_inset 4935*0c56280aSSorin Basca</cell> 4936*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4937*0c56280aSSorin Basca\begin_inset Text 4938*0c56280aSSorin Basca 4939*0c56280aSSorin Basca\layout Standard 4940*0c56280aSSorin Basca 4941*0c56280aSSorin BascaPerform a division using two values of type <?> and push the remainder onto 4942*0c56280aSSorin Basca the stack 4943*0c56280aSSorin Basca\end_inset 4944*0c56280aSSorin Basca</cell> 4945*0c56280aSSorin Basca</row> 4946*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 4947*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4948*0c56280aSSorin Basca\begin_inset Text 4949*0c56280aSSorin Basca 4950*0c56280aSSorin Basca\layout Standard 4951*0c56280aSSorin Basca 4952*0c56280aSSorin Basca?return 4953*0c56280aSSorin Basca\end_inset 4954*0c56280aSSorin Basca</cell> 4955*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4956*0c56280aSSorin Basca\begin_inset Text 4957*0c56280aSSorin Basca 4958*0c56280aSSorin Basca\layout Standard 4959*0c56280aSSorin Basca 4960*0c56280aSSorin BascaX 4961*0c56280aSSorin Basca\end_inset 4962*0c56280aSSorin Basca</cell> 4963*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4964*0c56280aSSorin Basca\begin_inset Text 4965*0c56280aSSorin Basca 4966*0c56280aSSorin Basca\layout Standard 4967*0c56280aSSorin Basca 4968*0c56280aSSorin BascaX 4969*0c56280aSSorin Basca\end_inset 4970*0c56280aSSorin Basca</cell> 4971*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4972*0c56280aSSorin Basca\begin_inset Text 4973*0c56280aSSorin Basca 4974*0c56280aSSorin Basca\layout Standard 4975*0c56280aSSorin Basca 4976*0c56280aSSorin BascaX 4977*0c56280aSSorin Basca\end_inset 4978*0c56280aSSorin Basca</cell> 4979*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4980*0c56280aSSorin Basca\begin_inset Text 4981*0c56280aSSorin Basca 4982*0c56280aSSorin Basca\layout Standard 4983*0c56280aSSorin Basca 4984*0c56280aSSorin BascaX 4985*0c56280aSSorin Basca\end_inset 4986*0c56280aSSorin Basca</cell> 4987*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4988*0c56280aSSorin Basca\begin_inset Text 4989*0c56280aSSorin Basca 4990*0c56280aSSorin Basca\layout Standard 4991*0c56280aSSorin Basca 4992*0c56280aSSorin Basca\end_inset 4993*0c56280aSSorin Basca</cell> 4994*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4995*0c56280aSSorin Basca\begin_inset Text 4996*0c56280aSSorin Basca 4997*0c56280aSSorin Basca\layout Standard 4998*0c56280aSSorin Basca 4999*0c56280aSSorin Basca\end_inset 5000*0c56280aSSorin Basca</cell> 5001*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5002*0c56280aSSorin Basca\begin_inset Text 5003*0c56280aSSorin Basca 5004*0c56280aSSorin Basca\layout Standard 5005*0c56280aSSorin Basca 5006*0c56280aSSorin Basca\end_inset 5007*0c56280aSSorin Basca</cell> 5008*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5009*0c56280aSSorin Basca\begin_inset Text 5010*0c56280aSSorin Basca 5011*0c56280aSSorin Basca\layout Standard 5012*0c56280aSSorin Basca 5013*0c56280aSSorin BascaX 5014*0c56280aSSorin Basca\end_inset 5015*0c56280aSSorin Basca</cell> 5016*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5017*0c56280aSSorin Basca\begin_inset Text 5018*0c56280aSSorin Basca 5019*0c56280aSSorin Basca\layout Standard 5020*0c56280aSSorin Basca 5021*0c56280aSSorin BascaReturn a value of type <?> to the invoking method 5022*0c56280aSSorin Basca\end_inset 5023*0c56280aSSorin Basca</cell> 5024*0c56280aSSorin Basca</row> 5025*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 5026*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5027*0c56280aSSorin Basca\begin_inset Text 5028*0c56280aSSorin Basca 5029*0c56280aSSorin Basca\layout Standard 5030*0c56280aSSorin Basca 5031*0c56280aSSorin Basca?shl 5032*0c56280aSSorin Basca\end_inset 5033*0c56280aSSorin Basca</cell> 5034*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5035*0c56280aSSorin Basca\begin_inset Text 5036*0c56280aSSorin Basca 5037*0c56280aSSorin Basca\layout Standard 5038*0c56280aSSorin Basca 5039*0c56280aSSorin BascaX 5040*0c56280aSSorin Basca\end_inset 5041*0c56280aSSorin Basca</cell> 5042*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5043*0c56280aSSorin Basca\begin_inset Text 5044*0c56280aSSorin Basca 5045*0c56280aSSorin Basca\layout Standard 5046*0c56280aSSorin Basca 5047*0c56280aSSorin BascaX 5048*0c56280aSSorin Basca\end_inset 5049*0c56280aSSorin Basca</cell> 5050*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5051*0c56280aSSorin Basca\begin_inset Text 5052*0c56280aSSorin Basca 5053*0c56280aSSorin Basca\layout Standard 5054*0c56280aSSorin Basca 5055*0c56280aSSorin Basca\end_inset 5056*0c56280aSSorin Basca</cell> 5057*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5058*0c56280aSSorin Basca\begin_inset Text 5059*0c56280aSSorin Basca 5060*0c56280aSSorin Basca\layout Standard 5061*0c56280aSSorin Basca 5062*0c56280aSSorin Basca\end_inset 5063*0c56280aSSorin Basca</cell> 5064*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5065*0c56280aSSorin Basca\begin_inset Text 5066*0c56280aSSorin Basca 5067*0c56280aSSorin Basca\layout Standard 5068*0c56280aSSorin Basca 5069*0c56280aSSorin Basca\end_inset 5070*0c56280aSSorin Basca</cell> 5071*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5072*0c56280aSSorin Basca\begin_inset Text 5073*0c56280aSSorin Basca 5074*0c56280aSSorin Basca\layout Standard 5075*0c56280aSSorin Basca 5076*0c56280aSSorin Basca\end_inset 5077*0c56280aSSorin Basca</cell> 5078*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5079*0c56280aSSorin Basca\begin_inset Text 5080*0c56280aSSorin Basca 5081*0c56280aSSorin Basca\layout Standard 5082*0c56280aSSorin Basca 5083*0c56280aSSorin Basca\end_inset 5084*0c56280aSSorin Basca</cell> 5085*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5086*0c56280aSSorin Basca\begin_inset Text 5087*0c56280aSSorin Basca 5088*0c56280aSSorin Basca\layout Standard 5089*0c56280aSSorin Basca 5090*0c56280aSSorin Basca\end_inset 5091*0c56280aSSorin Basca</cell> 5092*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5093*0c56280aSSorin Basca\begin_inset Text 5094*0c56280aSSorin Basca 5095*0c56280aSSorin Basca\layout Standard 5096*0c56280aSSorin Basca 5097*0c56280aSSorin BascaPerform arithmetic shift left on a value of type <?> 5098*0c56280aSSorin Basca\end_inset 5099*0c56280aSSorin Basca</cell> 5100*0c56280aSSorin Basca</row> 5101*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 5102*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5103*0c56280aSSorin Basca\begin_inset Text 5104*0c56280aSSorin Basca 5105*0c56280aSSorin Basca\layout Standard 5106*0c56280aSSorin Basca 5107*0c56280aSSorin Basca?shr 5108*0c56280aSSorin Basca\end_inset 5109*0c56280aSSorin Basca</cell> 5110*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5111*0c56280aSSorin Basca\begin_inset Text 5112*0c56280aSSorin Basca 5113*0c56280aSSorin Basca\layout Standard 5114*0c56280aSSorin Basca 5115*0c56280aSSorin BascaX 5116*0c56280aSSorin Basca\end_inset 5117*0c56280aSSorin Basca</cell> 5118*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5119*0c56280aSSorin Basca\begin_inset Text 5120*0c56280aSSorin Basca 5121*0c56280aSSorin Basca\layout Standard 5122*0c56280aSSorin Basca 5123*0c56280aSSorin BascaX 5124*0c56280aSSorin Basca\end_inset 5125*0c56280aSSorin Basca</cell> 5126*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5127*0c56280aSSorin Basca\begin_inset Text 5128*0c56280aSSorin Basca 5129*0c56280aSSorin Basca\layout Standard 5130*0c56280aSSorin Basca 5131*0c56280aSSorin Basca\end_inset 5132*0c56280aSSorin Basca</cell> 5133*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5134*0c56280aSSorin Basca\begin_inset Text 5135*0c56280aSSorin Basca 5136*0c56280aSSorin Basca\layout Standard 5137*0c56280aSSorin Basca 5138*0c56280aSSorin Basca\end_inset 5139*0c56280aSSorin Basca</cell> 5140*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5141*0c56280aSSorin Basca\begin_inset Text 5142*0c56280aSSorin Basca 5143*0c56280aSSorin Basca\layout Standard 5144*0c56280aSSorin Basca 5145*0c56280aSSorin Basca\end_inset 5146*0c56280aSSorin Basca</cell> 5147*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5148*0c56280aSSorin Basca\begin_inset Text 5149*0c56280aSSorin Basca 5150*0c56280aSSorin Basca\layout Standard 5151*0c56280aSSorin Basca 5152*0c56280aSSorin Basca\end_inset 5153*0c56280aSSorin Basca</cell> 5154*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5155*0c56280aSSorin Basca\begin_inset Text 5156*0c56280aSSorin Basca 5157*0c56280aSSorin Basca\layout Standard 5158*0c56280aSSorin Basca 5159*0c56280aSSorin Basca\end_inset 5160*0c56280aSSorin Basca</cell> 5161*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5162*0c56280aSSorin Basca\begin_inset Text 5163*0c56280aSSorin Basca 5164*0c56280aSSorin Basca\layout Standard 5165*0c56280aSSorin Basca 5166*0c56280aSSorin Basca\end_inset 5167*0c56280aSSorin Basca</cell> 5168*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5169*0c56280aSSorin Basca\begin_inset Text 5170*0c56280aSSorin Basca 5171*0c56280aSSorin Basca\layout Standard 5172*0c56280aSSorin Basca 5173*0c56280aSSorin BascaPerform arithmetic shift right on a value of type <?> 5174*0c56280aSSorin Basca\end_inset 5175*0c56280aSSorin Basca</cell> 5176*0c56280aSSorin Basca</row> 5177*0c56280aSSorin Basca<row topline="true" bottomline="false" newpage="false"> 5178*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5179*0c56280aSSorin Basca\begin_inset Text 5180*0c56280aSSorin Basca 5181*0c56280aSSorin Basca\layout Standard 5182*0c56280aSSorin Basca 5183*0c56280aSSorin Basca?store 5184*0c56280aSSorin Basca\end_inset 5185*0c56280aSSorin Basca</cell> 5186*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5187*0c56280aSSorin Basca\begin_inset Text 5188*0c56280aSSorin Basca 5189*0c56280aSSorin Basca\layout Standard 5190*0c56280aSSorin Basca 5191*0c56280aSSorin BascaX 5192*0c56280aSSorin Basca\end_inset 5193*0c56280aSSorin Basca</cell> 5194*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5195*0c56280aSSorin Basca\begin_inset Text 5196*0c56280aSSorin Basca 5197*0c56280aSSorin Basca\layout Standard 5198*0c56280aSSorin Basca 5199*0c56280aSSorin BascaX 5200*0c56280aSSorin Basca\end_inset 5201*0c56280aSSorin Basca</cell> 5202*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5203*0c56280aSSorin Basca\begin_inset Text 5204*0c56280aSSorin Basca 5205*0c56280aSSorin Basca\layout Standard 5206*0c56280aSSorin Basca 5207*0c56280aSSorin BascaX 5208*0c56280aSSorin Basca\end_inset 5209*0c56280aSSorin Basca</cell> 5210*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5211*0c56280aSSorin Basca\begin_inset Text 5212*0c56280aSSorin Basca 5213*0c56280aSSorin Basca\layout Standard 5214*0c56280aSSorin Basca 5215*0c56280aSSorin BascaX 5216*0c56280aSSorin Basca\end_inset 5217*0c56280aSSorin Basca</cell> 5218*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5219*0c56280aSSorin Basca\begin_inset Text 5220*0c56280aSSorin Basca 5221*0c56280aSSorin Basca\layout Standard 5222*0c56280aSSorin Basca 5223*0c56280aSSorin Basca\end_inset 5224*0c56280aSSorin Basca</cell> 5225*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5226*0c56280aSSorin Basca\begin_inset Text 5227*0c56280aSSorin Basca 5228*0c56280aSSorin Basca\layout Standard 5229*0c56280aSSorin Basca 5230*0c56280aSSorin Basca\end_inset 5231*0c56280aSSorin Basca</cell> 5232*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5233*0c56280aSSorin Basca\begin_inset Text 5234*0c56280aSSorin Basca 5235*0c56280aSSorin Basca\layout Standard 5236*0c56280aSSorin Basca 5237*0c56280aSSorin Basca\end_inset 5238*0c56280aSSorin Basca</cell> 5239*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5240*0c56280aSSorin Basca\begin_inset Text 5241*0c56280aSSorin Basca 5242*0c56280aSSorin Basca\layout Standard 5243*0c56280aSSorin Basca 5244*0c56280aSSorin BascaX 5245*0c56280aSSorin Basca\end_inset 5246*0c56280aSSorin Basca</cell> 5247*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5248*0c56280aSSorin Basca\begin_inset Text 5249*0c56280aSSorin Basca 5250*0c56280aSSorin Basca\layout Standard 5251*0c56280aSSorin Basca 5252*0c56280aSSorin BascaPop a value of type <?> and store it into a local variable 5253*0c56280aSSorin Basca\end_inset 5254*0c56280aSSorin Basca</cell> 5255*0c56280aSSorin Basca</row> 5256*0c56280aSSorin Basca<row topline="true" bottomline="true" newpage="false"> 5257*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5258*0c56280aSSorin Basca\begin_inset Text 5259*0c56280aSSorin Basca 5260*0c56280aSSorin Basca\layout Standard 5261*0c56280aSSorin Basca 5262*0c56280aSSorin Basca?sub 5263*0c56280aSSorin Basca\end_inset 5264*0c56280aSSorin Basca</cell> 5265*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5266*0c56280aSSorin Basca\begin_inset Text 5267*0c56280aSSorin Basca 5268*0c56280aSSorin Basca\layout Standard 5269*0c56280aSSorin Basca 5270*0c56280aSSorin BascaX 5271*0c56280aSSorin Basca\end_inset 5272*0c56280aSSorin Basca</cell> 5273*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5274*0c56280aSSorin Basca\begin_inset Text 5275*0c56280aSSorin Basca 5276*0c56280aSSorin Basca\layout Standard 5277*0c56280aSSorin Basca 5278*0c56280aSSorin BascaX 5279*0c56280aSSorin Basca\end_inset 5280*0c56280aSSorin Basca</cell> 5281*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5282*0c56280aSSorin Basca\begin_inset Text 5283*0c56280aSSorin Basca 5284*0c56280aSSorin Basca\layout Standard 5285*0c56280aSSorin Basca 5286*0c56280aSSorin BascaX 5287*0c56280aSSorin Basca\end_inset 5288*0c56280aSSorin Basca</cell> 5289*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5290*0c56280aSSorin Basca\begin_inset Text 5291*0c56280aSSorin Basca 5292*0c56280aSSorin Basca\layout Standard 5293*0c56280aSSorin Basca 5294*0c56280aSSorin BascaX 5295*0c56280aSSorin Basca\end_inset 5296*0c56280aSSorin Basca</cell> 5297*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5298*0c56280aSSorin Basca\begin_inset Text 5299*0c56280aSSorin Basca 5300*0c56280aSSorin Basca\layout Standard 5301*0c56280aSSorin Basca 5302*0c56280aSSorin Basca\end_inset 5303*0c56280aSSorin Basca</cell> 5304*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5305*0c56280aSSorin Basca\begin_inset Text 5306*0c56280aSSorin Basca 5307*0c56280aSSorin Basca\layout Standard 5308*0c56280aSSorin Basca 5309*0c56280aSSorin Basca\end_inset 5310*0c56280aSSorin Basca</cell> 5311*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5312*0c56280aSSorin Basca\begin_inset Text 5313*0c56280aSSorin Basca 5314*0c56280aSSorin Basca\layout Standard 5315*0c56280aSSorin Basca 5316*0c56280aSSorin Basca\end_inset 5317*0c56280aSSorin Basca</cell> 5318*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5319*0c56280aSSorin Basca\begin_inset Text 5320*0c56280aSSorin Basca 5321*0c56280aSSorin Basca\layout Standard 5322*0c56280aSSorin Basca 5323*0c56280aSSorin Basca\end_inset 5324*0c56280aSSorin Basca</cell> 5325*0c56280aSSorin Basca<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5326*0c56280aSSorin Basca\begin_inset Text 5327*0c56280aSSorin Basca 5328*0c56280aSSorin Basca\layout Standard 5329*0c56280aSSorin Basca 5330*0c56280aSSorin BascaPerform a subtraction using two values of type <?> 5331*0c56280aSSorin Basca\end_inset 5332*0c56280aSSorin Basca</cell> 5333*0c56280aSSorin Basca</row> 5334*0c56280aSSorin Basca</lyxtabular> 5335*0c56280aSSorin Basca 5336*0c56280aSSorin Basca\end_inset 5337*0c56280aSSorin Basca 5338*0c56280aSSorin Basca 5339*0c56280aSSorin Basca\layout Standard 5340*0c56280aSSorin Basca 5341*0c56280aSSorin BascaThe opcode names are mostly self-explanatory. 5342*0c56280aSSorin Basca In this paper, all bytecode is commented to support the intuitive understanding. 5343*0c56280aSSorin Basca Algorithms 5344*0c56280aSSorin Basca\begin_inset LatexCommand \ref{facjavapl} 5345*0c56280aSSorin Basca 5346*0c56280aSSorin Basca\end_inset 5347*0c56280aSSorin Basca 5348*0c56280aSSorin Basca and 5349*0c56280aSSorin Basca\begin_inset LatexCommand \ref{facjavabytecode} 5350*0c56280aSSorin Basca 5351*0c56280aSSorin Basca\end_inset 5352*0c56280aSSorin Basca 5353*0c56280aSSorin Basca show an example bytecode taken from 5354*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL98} 5355*0c56280aSSorin Basca 5356*0c56280aSSorin Basca\end_inset 5357*0c56280aSSorin Basca 5358*0c56280aSSorin Basca. 5359*0c56280aSSorin Basca It implements the well-known faculty function. 5360*0c56280aSSorin Basca To understand this example, it is important to know that method arguments 5361*0c56280aSSorin Basca are stored into the local variables of a newly created execution frame 5362*0c56280aSSorin Basca upon method invocation. 5363*0c56280aSSorin Basca\layout Standard 5364*0c56280aSSorin Basca 5365*0c56280aSSorin Basca\begin_float alg 5366*0c56280aSSorin Basca\layout Caption 5367*0c56280aSSorin Basca 5368*0c56280aSSorin Basca 5369*0c56280aSSorin Basca\begin_inset LatexCommand \label{facjavapl} 5370*0c56280aSSorin Basca 5371*0c56280aSSorin Basca\end_inset 5372*0c56280aSSorin Basca 5373*0c56280aSSorin BascaMethed 5374*0c56280aSSorin Basca\emph on 5375*0c56280aSSorin Bascafac 5376*0c56280aSSorin Basca\emph default 5377*0c56280aSSorin Basca in a class 5378*0c56280aSSorin Basca\emph on 5379*0c56280aSSorin BascaFaculty 5380*0c56280aSSorin Basca\emph default 5381*0c56280aSSorin Basca, Java programming language version 5382*0c56280aSSorin Basca\layout Standard 5383*0c56280aSSorin Basca 5384*0c56280aSSorin Basca 5385*0c56280aSSorin Basca\family typewriter 5386*0c56280aSSorin Bascapublic static final int fac(int n){ 5387*0c56280aSSorin Basca\layout Standard 5388*0c56280aSSorin Basca 5389*0c56280aSSorin Basca 5390*0c56280aSSorin Basca\family typewriter 5391*0c56280aSSorin Basca\SpecialChar ~ 5392*0c56280aSSorin Basca\SpecialChar ~ 5393*0c56280aSSorin Bascareturn (n==0)?1:n*fac(n-1); 5394*0c56280aSSorin Basca\layout Standard 5395*0c56280aSSorin Basca 5396*0c56280aSSorin Basca 5397*0c56280aSSorin Basca\family typewriter 5398*0c56280aSSorin Basca} 5399*0c56280aSSorin Basca\end_float 5400*0c56280aSSorin Basca\layout Standard 5401*0c56280aSSorin Basca 5402*0c56280aSSorin Basca\begin_float alg 5403*0c56280aSSorin Basca\layout Caption 5404*0c56280aSSorin Basca 5405*0c56280aSSorin Basca 5406*0c56280aSSorin Basca\begin_inset LatexCommand \label{facjavabytecode} 5407*0c56280aSSorin Basca 5408*0c56280aSSorin Basca\end_inset 5409*0c56280aSSorin Basca 5410*0c56280aSSorin BascaMethod 5411*0c56280aSSorin Basca\emph on 5412*0c56280aSSorin Bascafac 5413*0c56280aSSorin Basca\emph default 5414*0c56280aSSorin Basca in a class 5415*0c56280aSSorin Basca\emph on 5416*0c56280aSSorin BascaFaculty 5417*0c56280aSSorin Basca\emph default 5418*0c56280aSSorin Basca, Java bytecode version 5419*0c56280aSSorin Basca\layout Standard 5420*0c56280aSSorin Basca 5421*0c56280aSSorin Basca 5422*0c56280aSSorin Basca\family typewriter 5423*0c56280aSSorin Basca\size footnotesize 5424*0c56280aSSorin BascaFaculty.fac (I)I 5425*0c56280aSSorin Basca\layout Standard 5426*0c56280aSSorin Basca 5427*0c56280aSSorin Basca 5428*0c56280aSSorin Basca\family typewriter 5429*0c56280aSSorin Basca\size footnotesize 5430*0c56280aSSorin Basca0:\SpecialChar ~ 5431*0c56280aSSorin Basca\SpecialChar ~ 5432*0c56280aSSorin Bascaiload_0\SpecialChar ~ 5433*0c56280aSSorin Basca\SpecialChar ~ 5434*0c56280aSSorin Basca\SpecialChar ~ 5435*0c56280aSSorin Basca\SpecialChar ~ 5436*0c56280aSSorin Basca\SpecialChar ~ 5437*0c56280aSSorin Basca\SpecialChar ~ 5438*0c56280aSSorin Basca\SpecialChar ~ 5439*0c56280aSSorin Basca\SpecialChar ~ 5440*0c56280aSSorin Basca\SpecialChar ~ 5441*0c56280aSSorin Basca\SpecialChar ~ 5442*0c56280aSSorin Basca\SpecialChar ~ 5443*0c56280aSSorin Basca\SpecialChar ~ 5444*0c56280aSSorin Basca\SpecialChar ~ 5445*0c56280aSSorin Basca\SpecialChar ~ 5446*0c56280aSSorin Basca\SpecialChar ~ 5447*0c56280aSSorin Basca\SpecialChar ~ 5448*0c56280aSSorin Basca\SpecialChar ~ 5449*0c56280aSSorin Basca\SpecialChar ~ 5450*0c56280aSSorin Basca\SpecialChar ~ 5451*0c56280aSSorin Basca\SpecialChar ~ 5452*0c56280aSSorin Basca\SpecialChar ~ 5453*0c56280aSSorin Basca\SpecialChar ~ 5454*0c56280aSSorin Basca\SpecialChar ~ 5455*0c56280aSSorin Basca\SpecialChar ~ 5456*0c56280aSSorin Basca; load argument onto stack 5457*0c56280aSSorin Basca\layout Standard 5458*0c56280aSSorin Basca 5459*0c56280aSSorin Basca 5460*0c56280aSSorin Basca\family typewriter 5461*0c56280aSSorin Basca\size footnotesize 5462*0c56280aSSorin Basca1:\SpecialChar ~ 5463*0c56280aSSorin Basca\SpecialChar ~ 5464*0c56280aSSorin Bascaifne #8\SpecialChar ~ 5465*0c56280aSSorin Basca\SpecialChar ~ 5466*0c56280aSSorin Basca\SpecialChar ~ 5467*0c56280aSSorin Basca\SpecialChar ~ 5468*0c56280aSSorin Basca\SpecialChar ~ 5469*0c56280aSSorin Basca\SpecialChar ~ 5470*0c56280aSSorin Basca\SpecialChar ~ 5471*0c56280aSSorin Basca\SpecialChar ~ 5472*0c56280aSSorin Basca\SpecialChar ~ 5473*0c56280aSSorin Basca\SpecialChar ~ 5474*0c56280aSSorin Basca\SpecialChar ~ 5475*0c56280aSSorin Basca\SpecialChar ~ 5476*0c56280aSSorin Basca\SpecialChar ~ 5477*0c56280aSSorin Basca\SpecialChar ~ 5478*0c56280aSSorin Basca\SpecialChar ~ 5479*0c56280aSSorin Basca\SpecialChar ~ 5480*0c56280aSSorin Basca\SpecialChar ~ 5481*0c56280aSSorin Basca\SpecialChar ~ 5482*0c56280aSSorin Basca\SpecialChar ~ 5483*0c56280aSSorin Basca\SpecialChar ~ 5484*0c56280aSSorin Basca\SpecialChar ~ 5485*0c56280aSSorin Basca\SpecialChar ~ 5486*0c56280aSSorin Basca\SpecialChar ~ 5487*0c56280aSSorin Basca\SpecialChar ~ 5488*0c56280aSSorin Basca; non-zero? Then branch to 8. 5489*0c56280aSSorin Basca\layout Standard 5490*0c56280aSSorin Basca 5491*0c56280aSSorin Basca 5492*0c56280aSSorin Basca\family typewriter 5493*0c56280aSSorin Basca\size footnotesize 5494*0c56280aSSorin Basca4:\SpecialChar ~ 5495*0c56280aSSorin Basca\SpecialChar ~ 5496*0c56280aSSorin Bascaiconst_1\SpecialChar ~ 5497*0c56280aSSorin Basca\SpecialChar ~ 5498*0c56280aSSorin Basca\SpecialChar ~ 5499*0c56280aSSorin Basca\SpecialChar ~ 5500*0c56280aSSorin Basca\SpecialChar ~ 5501*0c56280aSSorin Basca\SpecialChar ~ 5502*0c56280aSSorin Basca\SpecialChar ~ 5503*0c56280aSSorin Basca\SpecialChar ~ 5504*0c56280aSSorin Basca\SpecialChar ~ 5505*0c56280aSSorin Basca\SpecialChar ~ 5506*0c56280aSSorin Basca\SpecialChar ~ 5507*0c56280aSSorin Basca\SpecialChar ~ 5508*0c56280aSSorin Basca\SpecialChar ~ 5509*0c56280aSSorin Basca\SpecialChar ~ 5510*0c56280aSSorin Basca\SpecialChar ~ 5511*0c56280aSSorin Basca\SpecialChar ~ 5512*0c56280aSSorin Basca\SpecialChar ~ 5513*0c56280aSSorin Basca\SpecialChar ~ 5514*0c56280aSSorin Basca\SpecialChar ~ 5515*0c56280aSSorin Basca\SpecialChar ~ 5516*0c56280aSSorin Basca\SpecialChar ~ 5517*0c56280aSSorin Basca\SpecialChar ~ 5518*0c56280aSSorin Basca\SpecialChar ~ 5519*0c56280aSSorin Basca; push constant 1 onto stack 5520*0c56280aSSorin Basca\layout Standard 5521*0c56280aSSorin Basca 5522*0c56280aSSorin Basca 5523*0c56280aSSorin Basca\family typewriter 5524*0c56280aSSorin Basca\size footnotesize 5525*0c56280aSSorin Basca5:\SpecialChar ~ 5526*0c56280aSSorin Basca\SpecialChar ~ 5527*0c56280aSSorin Bascagoto #16\SpecialChar ~ 5528*0c56280aSSorin Basca\SpecialChar ~ 5529*0c56280aSSorin Basca\SpecialChar ~ 5530*0c56280aSSorin Basca\SpecialChar ~ 5531*0c56280aSSorin Basca\SpecialChar ~ 5532*0c56280aSSorin Basca\SpecialChar ~ 5533*0c56280aSSorin Basca\SpecialChar ~ 5534*0c56280aSSorin Basca\SpecialChar ~ 5535*0c56280aSSorin Basca\SpecialChar ~ 5536*0c56280aSSorin Basca\SpecialChar ~ 5537*0c56280aSSorin Basca\SpecialChar ~ 5538*0c56280aSSorin Basca\SpecialChar ~ 5539*0c56280aSSorin Basca\SpecialChar ~ 5540*0c56280aSSorin Basca\SpecialChar ~ 5541*0c56280aSSorin Basca\SpecialChar ~ 5542*0c56280aSSorin Basca\SpecialChar ~ 5543*0c56280aSSorin Basca\SpecialChar ~ 5544*0c56280aSSorin Basca\SpecialChar ~ 5545*0c56280aSSorin Basca\SpecialChar ~ 5546*0c56280aSSorin Basca\SpecialChar ~ 5547*0c56280aSSorin Basca\SpecialChar ~ 5548*0c56280aSSorin Basca\SpecialChar ~ 5549*0c56280aSSorin Basca\SpecialChar ~ 5550*0c56280aSSorin Basca; jump to 16 5551*0c56280aSSorin Basca\layout Standard 5552*0c56280aSSorin Basca 5553*0c56280aSSorin Basca 5554*0c56280aSSorin Basca\family typewriter 5555*0c56280aSSorin Basca\size footnotesize 5556*0c56280aSSorin Basca8:\SpecialChar ~ 5557*0c56280aSSorin Basca\SpecialChar ~ 5558*0c56280aSSorin Bascaiload_0\SpecialChar ~ 5559*0c56280aSSorin Basca\SpecialChar ~ 5560*0c56280aSSorin Basca\SpecialChar ~ 5561*0c56280aSSorin Basca\SpecialChar ~ 5562*0c56280aSSorin Basca\SpecialChar ~ 5563*0c56280aSSorin Basca\SpecialChar ~ 5564*0c56280aSSorin Basca\SpecialChar ~ 5565*0c56280aSSorin Basca\SpecialChar ~ 5566*0c56280aSSorin Basca\SpecialChar ~ 5567*0c56280aSSorin Basca\SpecialChar ~ 5568*0c56280aSSorin Basca\SpecialChar ~ 5569*0c56280aSSorin Basca\SpecialChar ~ 5570*0c56280aSSorin Basca\SpecialChar ~ 5571*0c56280aSSorin Basca\SpecialChar ~ 5572*0c56280aSSorin Basca\SpecialChar ~ 5573*0c56280aSSorin Basca\SpecialChar ~ 5574*0c56280aSSorin Basca\SpecialChar ~ 5575*0c56280aSSorin Basca\SpecialChar ~ 5576*0c56280aSSorin Basca\SpecialChar ~ 5577*0c56280aSSorin Basca\SpecialChar ~ 5578*0c56280aSSorin Basca\SpecialChar ~ 5579*0c56280aSSorin Basca\SpecialChar ~ 5580*0c56280aSSorin Basca\SpecialChar ~ 5581*0c56280aSSorin Basca\SpecialChar ~ 5582*0c56280aSSorin Basca; load argument onto stack 5583*0c56280aSSorin Basca\layout Standard 5584*0c56280aSSorin Basca 5585*0c56280aSSorin Basca 5586*0c56280aSSorin Basca\family typewriter 5587*0c56280aSSorin Basca\size footnotesize 5588*0c56280aSSorin Basca9:\SpecialChar ~ 5589*0c56280aSSorin Basca\SpecialChar ~ 5590*0c56280aSSorin Bascaiload_0\SpecialChar ~ 5591*0c56280aSSorin Basca\SpecialChar ~ 5592*0c56280aSSorin Basca\SpecialChar ~ 5593*0c56280aSSorin Basca\SpecialChar ~ 5594*0c56280aSSorin Basca\SpecialChar ~ 5595*0c56280aSSorin Basca\SpecialChar ~ 5596*0c56280aSSorin Basca\SpecialChar ~ 5597*0c56280aSSorin Basca\SpecialChar ~ 5598*0c56280aSSorin Basca\SpecialChar ~ 5599*0c56280aSSorin Basca\SpecialChar ~ 5600*0c56280aSSorin Basca\SpecialChar ~ 5601*0c56280aSSorin Basca\SpecialChar ~ 5602*0c56280aSSorin Basca\SpecialChar ~ 5603*0c56280aSSorin Basca\SpecialChar ~ 5604*0c56280aSSorin Basca\SpecialChar ~ 5605*0c56280aSSorin Basca\SpecialChar ~ 5606*0c56280aSSorin Basca\SpecialChar ~ 5607*0c56280aSSorin Basca\SpecialChar ~ 5608*0c56280aSSorin Basca\SpecialChar ~ 5609*0c56280aSSorin Basca\SpecialChar ~ 5610*0c56280aSSorin Basca\SpecialChar ~ 5611*0c56280aSSorin Basca\SpecialChar ~ 5612*0c56280aSSorin Basca\SpecialChar ~ 5613*0c56280aSSorin Basca\SpecialChar ~ 5614*0c56280aSSorin Basca; load argument onto stack 5615*0c56280aSSorin Basca\layout Standard 5616*0c56280aSSorin Basca 5617*0c56280aSSorin Basca 5618*0c56280aSSorin Basca\family typewriter 5619*0c56280aSSorin Basca\size footnotesize 5620*0c56280aSSorin Basca10:\SpecialChar ~ 5621*0c56280aSSorin Bascaiconst_1\SpecialChar ~ 5622*0c56280aSSorin Basca\SpecialChar ~ 5623*0c56280aSSorin Basca\SpecialChar ~ 5624*0c56280aSSorin Basca\SpecialChar ~ 5625*0c56280aSSorin Basca\SpecialChar ~ 5626*0c56280aSSorin Basca\SpecialChar ~ 5627*0c56280aSSorin Basca\SpecialChar ~ 5628*0c56280aSSorin Basca\SpecialChar ~ 5629*0c56280aSSorin Basca\SpecialChar ~ 5630*0c56280aSSorin Basca\SpecialChar ~ 5631*0c56280aSSorin Basca\SpecialChar ~ 5632*0c56280aSSorin Basca\SpecialChar ~ 5633*0c56280aSSorin Basca\SpecialChar ~ 5634*0c56280aSSorin Basca\SpecialChar ~ 5635*0c56280aSSorin Basca\SpecialChar ~ 5636*0c56280aSSorin Basca\SpecialChar ~ 5637*0c56280aSSorin Basca\SpecialChar ~ 5638*0c56280aSSorin Basca\SpecialChar ~ 5639*0c56280aSSorin Basca\SpecialChar ~ 5640*0c56280aSSorin Basca\SpecialChar ~ 5641*0c56280aSSorin Basca\SpecialChar ~ 5642*0c56280aSSorin Basca\SpecialChar ~ 5643*0c56280aSSorin Basca\SpecialChar ~ 5644*0c56280aSSorin Basca; push constant 1 onto stack 5645*0c56280aSSorin Basca\layout Standard 5646*0c56280aSSorin Basca 5647*0c56280aSSorin Basca 5648*0c56280aSSorin Basca\family typewriter 5649*0c56280aSSorin Basca\size footnotesize 5650*0c56280aSSorin Basca11:\SpecialChar ~ 5651*0c56280aSSorin Bascaisub\SpecialChar ~ 5652*0c56280aSSorin Basca\SpecialChar ~ 5653*0c56280aSSorin Basca\SpecialChar ~ 5654*0c56280aSSorin Basca\SpecialChar ~ 5655*0c56280aSSorin Basca\SpecialChar ~ 5656*0c56280aSSorin Basca\SpecialChar ~ 5657*0c56280aSSorin Basca\SpecialChar ~ 5658*0c56280aSSorin Basca\SpecialChar ~ 5659*0c56280aSSorin Basca\SpecialChar ~ 5660*0c56280aSSorin Basca\SpecialChar ~ 5661*0c56280aSSorin Basca\SpecialChar ~ 5662*0c56280aSSorin Basca\SpecialChar ~ 5663*0c56280aSSorin Basca\SpecialChar ~ 5664*0c56280aSSorin Basca\SpecialChar ~ 5665*0c56280aSSorin Basca\SpecialChar ~ 5666*0c56280aSSorin Basca\SpecialChar ~ 5667*0c56280aSSorin Basca\SpecialChar ~ 5668*0c56280aSSorin Basca\SpecialChar ~ 5669*0c56280aSSorin Basca\SpecialChar ~ 5670*0c56280aSSorin Basca\SpecialChar ~ 5671*0c56280aSSorin Basca\SpecialChar ~ 5672*0c56280aSSorin Basca\SpecialChar ~ 5673*0c56280aSSorin Basca\SpecialChar ~ 5674*0c56280aSSorin Basca\SpecialChar ~ 5675*0c56280aSSorin Basca\SpecialChar ~ 5676*0c56280aSSorin Basca\SpecialChar ~ 5677*0c56280aSSorin Basca\SpecialChar ~ 5678*0c56280aSSorin Basca; subtract the stack top from 5679*0c56280aSSorin Basca\layout Standard 5680*0c56280aSSorin Basca 5681*0c56280aSSorin Basca 5682*0c56280aSSorin Basca\family typewriter 5683*0c56280aSSorin Basca\size footnotesize 5684*0c56280aSSorin Basca\SpecialChar ~ 5685*0c56280aSSorin Basca\SpecialChar ~ 5686*0c56280aSSorin Basca\SpecialChar ~ 5687*0c56280aSSorin Basca\SpecialChar ~ 5688*0c56280aSSorin Basca\SpecialChar ~ 5689*0c56280aSSorin Basca\SpecialChar ~ 5690*0c56280aSSorin Basca\SpecialChar ~ 5691*0c56280aSSorin Basca\SpecialChar ~ 5692*0c56280aSSorin Basca\SpecialChar ~ 5693*0c56280aSSorin Basca\SpecialChar ~ 5694*0c56280aSSorin Basca\SpecialChar ~ 5695*0c56280aSSorin Basca\SpecialChar ~ 5696*0c56280aSSorin Basca\SpecialChar ~ 5697*0c56280aSSorin Basca\SpecialChar ~ 5698*0c56280aSSorin Basca\SpecialChar ~ 5699*0c56280aSSorin Basca\SpecialChar ~ 5700*0c56280aSSorin Basca\SpecialChar ~ 5701*0c56280aSSorin Basca\SpecialChar ~ 5702*0c56280aSSorin Basca\SpecialChar ~ 5703*0c56280aSSorin Basca\SpecialChar ~ 5704*0c56280aSSorin Basca\SpecialChar ~ 5705*0c56280aSSorin Basca\SpecialChar ~ 5706*0c56280aSSorin Basca\SpecialChar ~ 5707*0c56280aSSorin Basca\SpecialChar ~ 5708*0c56280aSSorin Basca\SpecialChar ~ 5709*0c56280aSSorin Basca\SpecialChar ~ 5710*0c56280aSSorin Basca\SpecialChar ~ 5711*0c56280aSSorin Basca\SpecialChar ~ 5712*0c56280aSSorin Basca\SpecialChar ~ 5713*0c56280aSSorin Basca\SpecialChar ~ 5714*0c56280aSSorin Basca\SpecialChar ~ 5715*0c56280aSSorin Basca\SpecialChar ~ 5716*0c56280aSSorin Basca\SpecialChar ~ 5717*0c56280aSSorin Basca\SpecialChar ~ 5718*0c56280aSSorin Basca\SpecialChar ~ 5719*0c56280aSSorin Basca; the stack next-to-top which becomes 5720*0c56280aSSorin Basca\layout Standard 5721*0c56280aSSorin Basca 5722*0c56280aSSorin Basca 5723*0c56280aSSorin Basca\family typewriter 5724*0c56280aSSorin Basca\size footnotesize 5725*0c56280aSSorin Basca\SpecialChar ~ 5726*0c56280aSSorin Basca\SpecialChar ~ 5727*0c56280aSSorin Basca\SpecialChar ~ 5728*0c56280aSSorin Basca\SpecialChar ~ 5729*0c56280aSSorin Basca\SpecialChar ~ 5730*0c56280aSSorin Basca\SpecialChar ~ 5731*0c56280aSSorin Basca\SpecialChar ~ 5732*0c56280aSSorin Basca\SpecialChar ~ 5733*0c56280aSSorin Basca\SpecialChar ~ 5734*0c56280aSSorin Basca\SpecialChar ~ 5735*0c56280aSSorin Basca\SpecialChar ~ 5736*0c56280aSSorin Basca\SpecialChar ~ 5737*0c56280aSSorin Basca\SpecialChar ~ 5738*0c56280aSSorin Basca\SpecialChar ~ 5739*0c56280aSSorin Basca\SpecialChar ~ 5740*0c56280aSSorin Basca\SpecialChar ~ 5741*0c56280aSSorin Basca\SpecialChar ~ 5742*0c56280aSSorin Basca\SpecialChar ~ 5743*0c56280aSSorin Basca\SpecialChar ~ 5744*0c56280aSSorin Basca\SpecialChar ~ 5745*0c56280aSSorin Basca\SpecialChar ~ 5746*0c56280aSSorin Basca\SpecialChar ~ 5747*0c56280aSSorin Basca\SpecialChar ~ 5748*0c56280aSSorin Basca\SpecialChar ~ 5749*0c56280aSSorin Basca\SpecialChar ~ 5750*0c56280aSSorin Basca\SpecialChar ~ 5751*0c56280aSSorin Basca\SpecialChar ~ 5752*0c56280aSSorin Basca\SpecialChar ~ 5753*0c56280aSSorin Basca\SpecialChar ~ 5754*0c56280aSSorin Basca\SpecialChar ~ 5755*0c56280aSSorin Basca\SpecialChar ~ 5756*0c56280aSSorin Basca\SpecialChar ~ 5757*0c56280aSSorin Basca\SpecialChar ~ 5758*0c56280aSSorin Basca\SpecialChar ~ 5759*0c56280aSSorin Basca\SpecialChar ~ 5760*0c56280aSSorin Basca; the new stack top 5761*0c56280aSSorin Basca\layout Standard 5762*0c56280aSSorin Basca 5763*0c56280aSSorin Basca 5764*0c56280aSSorin Basca\family typewriter 5765*0c56280aSSorin Basca\size footnotesize 5766*0c56280aSSorin Basca12:\SpecialChar ~ 5767*0c56280aSSorin Bascainvokestatic Faculty.fac (I)I\SpecialChar ~ 5768*0c56280aSSorin Basca\SpecialChar ~ 5769*0c56280aSSorin Basca; call method fac recursively, 5770*0c56280aSSorin Basca\layout Standard 5771*0c56280aSSorin Basca 5772*0c56280aSSorin Basca 5773*0c56280aSSorin Basca\family typewriter 5774*0c56280aSSorin Basca\size footnotesize 5775*0c56280aSSorin Basca\SpecialChar ~ 5776*0c56280aSSorin Basca\SpecialChar ~ 5777*0c56280aSSorin Basca\SpecialChar ~ 5778*0c56280aSSorin Basca\SpecialChar ~ 5779*0c56280aSSorin Basca\SpecialChar ~ 5780*0c56280aSSorin Basca\SpecialChar ~ 5781*0c56280aSSorin Basca\SpecialChar ~ 5782*0c56280aSSorin Basca\SpecialChar ~ 5783*0c56280aSSorin Basca\SpecialChar ~ 5784*0c56280aSSorin Basca\SpecialChar ~ 5785*0c56280aSSorin Basca\SpecialChar ~ 5786*0c56280aSSorin Basca\SpecialChar ~ 5787*0c56280aSSorin Basca\SpecialChar ~ 5788*0c56280aSSorin Basca\SpecialChar ~ 5789*0c56280aSSorin Basca\SpecialChar ~ 5790*0c56280aSSorin Basca\SpecialChar ~ 5791*0c56280aSSorin Basca\SpecialChar ~ 5792*0c56280aSSorin Basca\SpecialChar ~ 5793*0c56280aSSorin Basca\SpecialChar ~ 5794*0c56280aSSorin Basca\SpecialChar ~ 5795*0c56280aSSorin Basca\SpecialChar ~ 5796*0c56280aSSorin Basca\SpecialChar ~ 5797*0c56280aSSorin Basca\SpecialChar ~ 5798*0c56280aSSorin Basca\SpecialChar ~ 5799*0c56280aSSorin Basca\SpecialChar ~ 5800*0c56280aSSorin Basca\SpecialChar ~ 5801*0c56280aSSorin Basca\SpecialChar ~ 5802*0c56280aSSorin Basca\SpecialChar ~ 5803*0c56280aSSorin Basca\SpecialChar ~ 5804*0c56280aSSorin Basca\SpecialChar ~ 5805*0c56280aSSorin Basca\SpecialChar ~ 5806*0c56280aSSorin Basca\SpecialChar ~ 5807*0c56280aSSorin Basca\SpecialChar ~ 5808*0c56280aSSorin Basca\SpecialChar ~ 5809*0c56280aSSorin Basca\SpecialChar ~ 5810*0c56280aSSorin Basca; the new invocation 5811*0c56280aSSorin Basca\layout Standard 5812*0c56280aSSorin Basca 5813*0c56280aSSorin Basca 5814*0c56280aSSorin Basca\family typewriter 5815*0c56280aSSorin Basca\size footnotesize 5816*0c56280aSSorin Basca\SpecialChar ~ 5817*0c56280aSSorin Basca\SpecialChar ~ 5818*0c56280aSSorin Basca\SpecialChar ~ 5819*0c56280aSSorin Basca\SpecialChar ~ 5820*0c56280aSSorin Basca\SpecialChar ~ 5821*0c56280aSSorin Basca\SpecialChar ~ 5822*0c56280aSSorin Basca\SpecialChar ~ 5823*0c56280aSSorin Basca\SpecialChar ~ 5824*0c56280aSSorin Basca\SpecialChar ~ 5825*0c56280aSSorin Basca\SpecialChar ~ 5826*0c56280aSSorin Basca\SpecialChar ~ 5827*0c56280aSSorin Basca\SpecialChar ~ 5828*0c56280aSSorin Basca\SpecialChar ~ 5829*0c56280aSSorin Basca\SpecialChar ~ 5830*0c56280aSSorin Basca\SpecialChar ~ 5831*0c56280aSSorin Basca\SpecialChar ~ 5832*0c56280aSSorin Basca\SpecialChar ~ 5833*0c56280aSSorin Basca\SpecialChar ~ 5834*0c56280aSSorin Basca\SpecialChar ~ 5835*0c56280aSSorin Basca\SpecialChar ~ 5836*0c56280aSSorin Basca\SpecialChar ~ 5837*0c56280aSSorin Basca\SpecialChar ~ 5838*0c56280aSSorin Basca\SpecialChar ~ 5839*0c56280aSSorin Basca\SpecialChar ~ 5840*0c56280aSSorin Basca\SpecialChar ~ 5841*0c56280aSSorin Basca\SpecialChar ~ 5842*0c56280aSSorin Basca\SpecialChar ~ 5843*0c56280aSSorin Basca\SpecialChar ~ 5844*0c56280aSSorin Basca\SpecialChar ~ 5845*0c56280aSSorin Basca\SpecialChar ~ 5846*0c56280aSSorin Basca\SpecialChar ~ 5847*0c56280aSSorin Basca\SpecialChar ~ 5848*0c56280aSSorin Basca\SpecialChar ~ 5849*0c56280aSSorin Basca\SpecialChar ~ 5850*0c56280aSSorin Basca\SpecialChar ~ 5851*0c56280aSSorin Basca; instance's argument is the stack top 5852*0c56280aSSorin Basca\layout Standard 5853*0c56280aSSorin Basca 5854*0c56280aSSorin Basca 5855*0c56280aSSorin Basca\family typewriter 5856*0c56280aSSorin Basca\size footnotesize 5857*0c56280aSSorin Basca15:\SpecialChar ~ 5858*0c56280aSSorin Bascaimul\SpecialChar ~ 5859*0c56280aSSorin Basca\SpecialChar ~ 5860*0c56280aSSorin Basca\SpecialChar ~ 5861*0c56280aSSorin Basca\SpecialChar ~ 5862*0c56280aSSorin Basca\SpecialChar ~ 5863*0c56280aSSorin Basca\SpecialChar ~ 5864*0c56280aSSorin Basca\SpecialChar ~ 5865*0c56280aSSorin Basca\SpecialChar ~ 5866*0c56280aSSorin Basca\SpecialChar ~ 5867*0c56280aSSorin Basca\SpecialChar ~ 5868*0c56280aSSorin Basca\SpecialChar ~ 5869*0c56280aSSorin Basca\SpecialChar ~ 5870*0c56280aSSorin Basca\SpecialChar ~ 5871*0c56280aSSorin Basca\SpecialChar ~ 5872*0c56280aSSorin Basca\SpecialChar ~ 5873*0c56280aSSorin Basca\SpecialChar ~ 5874*0c56280aSSorin Basca\SpecialChar ~ 5875*0c56280aSSorin Basca\SpecialChar ~ 5876*0c56280aSSorin Basca\SpecialChar ~ 5877*0c56280aSSorin Basca\SpecialChar ~ 5878*0c56280aSSorin Basca\SpecialChar ~ 5879*0c56280aSSorin Basca\SpecialChar ~ 5880*0c56280aSSorin Basca\SpecialChar ~ 5881*0c56280aSSorin Basca\SpecialChar ~ 5882*0c56280aSSorin Basca\SpecialChar ~ 5883*0c56280aSSorin Basca\SpecialChar ~ 5884*0c56280aSSorin Basca\SpecialChar ~ 5885*0c56280aSSorin Basca; multiply the return value with the 5886*0c56280aSSorin Basca\layout Standard 5887*0c56280aSSorin Basca 5888*0c56280aSSorin Basca 5889*0c56280aSSorin Basca\family typewriter 5890*0c56280aSSorin Basca\size footnotesize 5891*0c56280aSSorin Basca\SpecialChar ~ 5892*0c56280aSSorin Basca\SpecialChar ~ 5893*0c56280aSSorin Basca\SpecialChar ~ 5894*0c56280aSSorin Basca\SpecialChar ~ 5895*0c56280aSSorin Basca\SpecialChar ~ 5896*0c56280aSSorin Basca\SpecialChar ~ 5897*0c56280aSSorin Basca\SpecialChar ~ 5898*0c56280aSSorin Basca\SpecialChar ~ 5899*0c56280aSSorin Basca\SpecialChar ~ 5900*0c56280aSSorin Basca\SpecialChar ~ 5901*0c56280aSSorin Basca\SpecialChar ~ 5902*0c56280aSSorin Basca\SpecialChar ~ 5903*0c56280aSSorin Basca\SpecialChar ~ 5904*0c56280aSSorin Basca\SpecialChar ~ 5905*0c56280aSSorin Basca\SpecialChar ~ 5906*0c56280aSSorin Basca\SpecialChar ~ 5907*0c56280aSSorin Basca\SpecialChar ~ 5908*0c56280aSSorin Basca\SpecialChar ~ 5909*0c56280aSSorin Basca\SpecialChar ~ 5910*0c56280aSSorin Basca\SpecialChar ~ 5911*0c56280aSSorin Basca\SpecialChar ~ 5912*0c56280aSSorin Basca\SpecialChar ~ 5913*0c56280aSSorin Basca\SpecialChar ~ 5914*0c56280aSSorin Basca\SpecialChar ~ 5915*0c56280aSSorin Basca\SpecialChar ~ 5916*0c56280aSSorin Basca\SpecialChar ~ 5917*0c56280aSSorin Basca\SpecialChar ~ 5918*0c56280aSSorin Basca\SpecialChar ~ 5919*0c56280aSSorin Basca\SpecialChar ~ 5920*0c56280aSSorin Basca\SpecialChar ~ 5921*0c56280aSSorin Basca\SpecialChar ~ 5922*0c56280aSSorin Basca\SpecialChar ~ 5923*0c56280aSSorin Basca\SpecialChar ~ 5924*0c56280aSSorin Basca\SpecialChar ~ 5925*0c56280aSSorin Basca\SpecialChar ~ 5926*0c56280aSSorin Basca; argument given to the current 5927*0c56280aSSorin Basca\layout Standard 5928*0c56280aSSorin Basca 5929*0c56280aSSorin Basca 5930*0c56280aSSorin Basca\family typewriter 5931*0c56280aSSorin Basca\size footnotesize 5932*0c56280aSSorin Basca\SpecialChar ~ 5933*0c56280aSSorin Basca\SpecialChar ~ 5934*0c56280aSSorin Basca\SpecialChar ~ 5935*0c56280aSSorin Basca\SpecialChar ~ 5936*0c56280aSSorin Basca\SpecialChar ~ 5937*0c56280aSSorin Basca\SpecialChar ~ 5938*0c56280aSSorin Basca\SpecialChar ~ 5939*0c56280aSSorin Basca\SpecialChar ~ 5940*0c56280aSSorin Basca\SpecialChar ~ 5941*0c56280aSSorin Basca\SpecialChar ~ 5942*0c56280aSSorin Basca\SpecialChar ~ 5943*0c56280aSSorin Basca\SpecialChar ~ 5944*0c56280aSSorin Basca\SpecialChar ~ 5945*0c56280aSSorin Basca\SpecialChar ~ 5946*0c56280aSSorin Basca\SpecialChar ~ 5947*0c56280aSSorin Basca\SpecialChar ~ 5948*0c56280aSSorin Basca\SpecialChar ~ 5949*0c56280aSSorin Basca\SpecialChar ~ 5950*0c56280aSSorin Basca\SpecialChar ~ 5951*0c56280aSSorin Basca\SpecialChar ~ 5952*0c56280aSSorin Basca\SpecialChar ~ 5953*0c56280aSSorin Basca\SpecialChar ~ 5954*0c56280aSSorin Basca\SpecialChar ~ 5955*0c56280aSSorin Basca\SpecialChar ~ 5956*0c56280aSSorin Basca\SpecialChar ~ 5957*0c56280aSSorin Basca\SpecialChar ~ 5958*0c56280aSSorin Basca\SpecialChar ~ 5959*0c56280aSSorin Basca\SpecialChar ~ 5960*0c56280aSSorin Basca\SpecialChar ~ 5961*0c56280aSSorin Basca\SpecialChar ~ 5962*0c56280aSSorin Basca\SpecialChar ~ 5963*0c56280aSSorin Basca\SpecialChar ~ 5964*0c56280aSSorin Basca\SpecialChar ~ 5965*0c56280aSSorin Basca\SpecialChar ~ 5966*0c56280aSSorin Basca\SpecialChar ~ 5967*0c56280aSSorin Basca; invocation instance 5968*0c56280aSSorin Basca\layout Standard 5969*0c56280aSSorin Basca 5970*0c56280aSSorin Basca 5971*0c56280aSSorin Basca\family typewriter 5972*0c56280aSSorin Basca\size footnotesize 5973*0c56280aSSorin Basca16:\SpecialChar ~ 5974*0c56280aSSorin Bascaireturn\SpecialChar ~ 5975*0c56280aSSorin Basca\SpecialChar ~ 5976*0c56280aSSorin Basca\SpecialChar ~ 5977*0c56280aSSorin Basca\SpecialChar ~ 5978*0c56280aSSorin Basca\SpecialChar ~ 5979*0c56280aSSorin Basca\SpecialChar ~ 5980*0c56280aSSorin Basca\SpecialChar ~ 5981*0c56280aSSorin Basca\SpecialChar ~ 5982*0c56280aSSorin Basca\SpecialChar ~ 5983*0c56280aSSorin Basca\SpecialChar ~ 5984*0c56280aSSorin Basca\SpecialChar ~ 5985*0c56280aSSorin Basca\SpecialChar ~ 5986*0c56280aSSorin Basca\SpecialChar ~ 5987*0c56280aSSorin Basca\SpecialChar ~ 5988*0c56280aSSorin Basca\SpecialChar ~ 5989*0c56280aSSorin Basca\SpecialChar ~ 5990*0c56280aSSorin Basca\SpecialChar ~ 5991*0c56280aSSorin Basca\SpecialChar ~ 5992*0c56280aSSorin Basca\SpecialChar ~ 5993*0c56280aSSorin Basca\SpecialChar ~ 5994*0c56280aSSorin Basca\SpecialChar ~ 5995*0c56280aSSorin Basca\SpecialChar ~ 5996*0c56280aSSorin Basca\SpecialChar ~ 5997*0c56280aSSorin Basca\SpecialChar ~ 5998*0c56280aSSorin Basca; return value on top of the 5999*0c56280aSSorin Basca\layout Standard 6000*0c56280aSSorin Basca 6001*0c56280aSSorin Basca 6002*0c56280aSSorin Basca\family typewriter 6003*0c56280aSSorin Basca\size footnotesize 6004*0c56280aSSorin Basca\SpecialChar ~ 6005*0c56280aSSorin Basca\SpecialChar ~ 6006*0c56280aSSorin Basca\SpecialChar ~ 6007*0c56280aSSorin Basca\SpecialChar ~ 6008*0c56280aSSorin Basca\SpecialChar ~ 6009*0c56280aSSorin Basca\SpecialChar ~ 6010*0c56280aSSorin Basca\SpecialChar ~ 6011*0c56280aSSorin Basca\SpecialChar ~ 6012*0c56280aSSorin Basca\SpecialChar ~ 6013*0c56280aSSorin Basca\SpecialChar ~ 6014*0c56280aSSorin Basca\SpecialChar ~ 6015*0c56280aSSorin Basca\SpecialChar ~ 6016*0c56280aSSorin Basca\SpecialChar ~ 6017*0c56280aSSorin Basca\SpecialChar ~ 6018*0c56280aSSorin Basca\SpecialChar ~ 6019*0c56280aSSorin Basca\SpecialChar ~ 6020*0c56280aSSorin Basca\SpecialChar ~ 6021*0c56280aSSorin Basca\SpecialChar ~ 6022*0c56280aSSorin Basca\SpecialChar ~ 6023*0c56280aSSorin Basca\SpecialChar ~ 6024*0c56280aSSorin Basca\SpecialChar ~ 6025*0c56280aSSorin Basca\SpecialChar ~ 6026*0c56280aSSorin Basca\SpecialChar ~ 6027*0c56280aSSorin Basca\SpecialChar ~ 6028*0c56280aSSorin Basca\SpecialChar ~ 6029*0c56280aSSorin Basca\SpecialChar ~ 6030*0c56280aSSorin Basca\SpecialChar ~ 6031*0c56280aSSorin Basca\SpecialChar ~ 6032*0c56280aSSorin Basca\SpecialChar ~ 6033*0c56280aSSorin Basca\SpecialChar ~ 6034*0c56280aSSorin Basca\SpecialChar ~ 6035*0c56280aSSorin Basca\SpecialChar ~ 6036*0c56280aSSorin Basca\SpecialChar ~ 6037*0c56280aSSorin Basca\SpecialChar ~ 6038*0c56280aSSorin Basca\SpecialChar ~ 6039*0c56280aSSorin Basca; stack to the invoking method 6040*0c56280aSSorin Basca\end_float 6041*0c56280aSSorin Basca\layout Chapter 6042*0c56280aSSorin Basca 6043*0c56280aSSorin Basca 6044*0c56280aSSorin Basca\begin_inset LatexCommand \label{SpecPasses} 6045*0c56280aSSorin Basca 6046*0c56280aSSorin Basca\end_inset 6047*0c56280aSSorin Basca 6048*0c56280aSSorin BascaSpecification of the Verification Passes 6049*0c56280aSSorin Basca\layout Standard 6050*0c56280aSSorin Basca 6051*0c56280aSSorin BascaSun describes a four-pass class file verifier in The Java Virtual Machine 6052*0c56280aSSorin Basca Specification, Second Edition 6053*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6054*0c56280aSSorin Basca 6055*0c56280aSSorin Basca\end_inset 6056*0c56280aSSorin Basca 6057*0c56280aSSorin Basca. 6058*0c56280aSSorin Basca It is not necessary to implement the verification algorithms literally; 6059*0c56280aSSorin Basca and it is not possible anyway (see section 6060*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SpecSubroutines} 6061*0c56280aSSorin Basca 6062*0c56280aSSorin Basca\end_inset 6063*0c56280aSSorin Basca 6064*0c56280aSSorin Basca). 6065*0c56280aSSorin Basca However, implementing a verifier with a multiple-pass architecture makes 6066*0c56280aSSorin Basca sense. 6067*0c56280aSSorin Basca It is a good thing to stay close to the specification because it is well-known 6068*0c56280aSSorin Basca throughout the bytecode engineering community. 6069*0c56280aSSorin Basca Also, the boundaries between the passes are not arbitrary. 6070*0c56280aSSorin Basca They are drawn to improve the performance of the verifiers built into JVMs. 6071*0c56280aSSorin Basca For example, classes are not verified (completely) before they are actually 6072*0c56280aSSorin Basca used but they are loaded as soon as they are referenced in a certain way. 6073*0c56280aSSorin Basca Most verifiers use the traditional multiple-pass architecture, including 6074*0c56280aSSorin Basca Kimera 6075*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-WWW} 6076*0c56280aSSorin Basca 6077*0c56280aSSorin Basca\end_inset 6078*0c56280aSSorin Basca 6079*0c56280aSSorin Basca. 6080*0c56280aSSorin Basca Work in other directions (for instance, the one-pass-architecture proposed 6081*0c56280aSSorin Basca by Fong 6082*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong-WWW} 6083*0c56280aSSorin Basca 6084*0c56280aSSorin Basca\end_inset 6085*0c56280aSSorin Basca 6086*0c56280aSSorin Basca) did not yield lasting results. 6087*0c56280aSSorin Basca\layout Standard 6088*0c56280aSSorin Basca 6089*0c56280aSSorin BascaPass one is basically about loading a class file into the JVM in a sane 6090*0c56280aSSorin Basca way and pass two verifies that the loaded class file information is consistent. 6091*0c56280aSSorin Basca Pass three verifies that the program code is well-behaved; pass four verifies 6092*0c56280aSSorin Basca things that conceptually belong to pass three but are delayed to the run-time 6093*0c56280aSSorin Basca for performance reasons. 6094*0c56280aSSorin Basca\layout Standard 6095*0c56280aSSorin Basca 6096*0c56280aSSorin BascaSometimes implementation details are discussed in this chapter. 6097*0c56280aSSorin Basca Whenever the specification 6098*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6099*0c56280aSSorin Basca 6100*0c56280aSSorin Basca\end_inset 6101*0c56280aSSorin Basca 6102*0c56280aSSorin Basca was ambigous about some issue, the behaviour of Sun's JVM implementations 6103*0c56280aSSorin Basca was observed. 6104*0c56280aSSorin Basca The discussed details are part of the specification of the JustIce verifier. 6105*0c56280aSSorin Basca\layout Section 6106*0c56280aSSorin Basca 6107*0c56280aSSorin Basca 6108*0c56280aSSorin Basca\begin_inset LatexCommand \label{PassOneSpec} 6109*0c56280aSSorin Basca 6110*0c56280aSSorin Basca\end_inset 6111*0c56280aSSorin Basca 6112*0c56280aSSorin BascaPass One 6113*0c56280aSSorin Basca\layout Standard 6114*0c56280aSSorin Basca 6115*0c56280aSSorin BascaThe first pass of the verifier is only vaguely specified. 6116*0c56280aSSorin Basca It is there to assure a class file 6117*0c56280aSSorin Basca\begin_inset Quotes eld 6118*0c56280aSSorin Basca\end_inset 6119*0c56280aSSorin Basca 6120*0c56280aSSorin Basca 6121*0c56280aSSorin Basca\series bold 6122*0c56280aSSorin Bascahas the basic format of a class file. 6123*0c56280aSSorin Basca The first four bytes must contain the right magic number. 6124*0c56280aSSorin Basca All recognized attributes must be of the proper length. 6125*0c56280aSSorin Basca The class file must not be truncated or have any extra bytes at the end. 6126*0c56280aSSorin Basca The constant pool must not contain any superficially unrecognizable information 6127*0c56280aSSorin Basca\series default 6128*0c56280aSSorin Basca 6129*0c56280aSSorin Basca\begin_inset Quotes erd 6130*0c56280aSSorin Basca\end_inset 6131*0c56280aSSorin Basca 6132*0c56280aSSorin Basca ( 6133*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6134*0c56280aSSorin Basca 6135*0c56280aSSorin Basca\end_inset 6136*0c56280aSSorin Basca 6137*0c56280aSSorin Basca, page 141). 6138*0c56280aSSorin Basca\layout Standard 6139*0c56280aSSorin Basca 6140*0c56280aSSorin BascaThe right magic number is 0xCAFEBABE ( 6141*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6142*0c56280aSSorin Basca 6143*0c56280aSSorin Basca\end_inset 6144*0c56280aSSorin Basca 6145*0c56280aSSorin Basca, page 94), which is easy to assure. 6146*0c56280aSSorin Basca\layout Standard 6147*0c56280aSSorin Basca 6148*0c56280aSSorin BascaIt is not clear what 6149*0c56280aSSorin Basca\begin_inset Quotes eld 6150*0c56280aSSorin Basca\end_inset 6151*0c56280aSSorin Basca 6152*0c56280aSSorin Bascasuperficially unrecognizable information 6153*0c56280aSSorin Basca\begin_inset Quotes erd 6154*0c56280aSSorin Basca\end_inset 6155*0c56280aSSorin Basca 6156*0c56280aSSorin Basca exactly is, however. 6157*0c56280aSSorin Basca If an attribute is not known to the JVM (or verifier) implementation, it 6158*0c56280aSSorin Basca has to be ignored -- so this does not seem to be 6159*0c56280aSSorin Basca\begin_inset Quotes eld 6160*0c56280aSSorin Basca\end_inset 6161*0c56280aSSorin Basca 6162*0c56280aSSorin Bascasuperficially unrecognizable information 6163*0c56280aSSorin Basca\begin_inset Quotes erd 6164*0c56280aSSorin Basca\end_inset 6165*0c56280aSSorin Basca 6166*0c56280aSSorin Basca. 6167*0c56280aSSorin Basca Attributes that are not used cannot be detected in pass one. 6168*0c56280aSSorin Basca One would have to look at the bytecodes to decide whether an attribute 6169*0c56280aSSorin Basca is used or not (which is not the domain of pass one, but of pass three). 6170*0c56280aSSorin Basca\layout Standard 6171*0c56280aSSorin Basca 6172*0c56280aSSorin BascaObservations show that most existing JVM verifiers 6173*0c56280aSSorin Basca\begin_float footnote 6174*0c56280aSSorin Basca\layout Standard 6175*0c56280aSSorin Basca 6176*0c56280aSSorin BascaAn example of a verifier with this behaviour is the one implemented in Sun's 6177*0c56280aSSorin Basca Solaris port of the JVM, version 1.3.0_01. 6178*0c56280aSSorin Basca\end_float 6179*0c56280aSSorin Basca ignore 6180*0c56280aSSorin Basca\begin_inset Quotes eld 6181*0c56280aSSorin Basca\end_inset 6182*0c56280aSSorin Basca 6183*0c56280aSSorin Bascaextra bytes at the end 6184*0c56280aSSorin Basca\begin_inset Quotes erd 6185*0c56280aSSorin Basca\end_inset 6186*0c56280aSSorin Basca 6187*0c56280aSSorin Basca instead of rejecting class files bearing them. 6188*0c56280aSSorin Basca\layout Standard 6189*0c56280aSSorin Basca 6190*0c56280aSSorin BascaThe other two statements specify verification of the class file structure 6191*0c56280aSSorin Basca (and the structure of the attributes therein). 6192*0c56280aSSorin Basca But this is also the domain of pass two! Only by inspecting the way the 6193*0c56280aSSorin Basca JVM 6194*0c56280aSSorin Basca\emph on 6195*0c56280aSSorin Bascaloads 6196*0c56280aSSorin Basca\emph default 6197*0c56280aSSorin Basca, 6198*0c56280aSSorin Basca\emph on 6199*0c56280aSSorin Bascaresolves 6200*0c56280aSSorin Basca\emph default 6201*0c56280aSSorin Basca and 6202*0c56280aSSorin Basca\emph on 6203*0c56280aSSorin Bascaprepares 6204*0c56280aSSorin Basca\emph default 6205*0c56280aSSorin Basca classes one will understand the precise boundary between verification passes 6206*0c56280aSSorin Basca one and two 6207*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong-WWW} 6208*0c56280aSSorin Basca 6209*0c56280aSSorin Basca\end_inset 6210*0c56280aSSorin Basca 6211*0c56280aSSorin Basca. 6212*0c56280aSSorin Basca\layout Standard 6213*0c56280aSSorin Basca 6214*0c56280aSSorin Basca'Being careful when loading a class file' is a good definition for pass 6215*0c56280aSSorin Basca one: the structure of the file to load is untrusted. 6216*0c56280aSSorin Basca Every implicit statement such as 6217*0c56280aSSorin Basca\begin_inset Quotes eld 6218*0c56280aSSorin Basca\end_inset 6219*0c56280aSSorin Basca 6220*0c56280aSSorin Bascathis attribute has a length of 1234 bytes in total 6221*0c56280aSSorin Basca\begin_inset Quotes erd 6222*0c56280aSSorin Basca\end_inset 6223*0c56280aSSorin Basca 6224*0c56280aSSorin Basca is validated. 6225*0c56280aSSorin Basca\layout Standard 6226*0c56280aSSorin Basca 6227*0c56280aSSorin Basca 6228*0c56280aSSorin Basca\emph on 6229*0c56280aSSorin BascaResolution 6230*0c56280aSSorin Basca\emph default 6231*0c56280aSSorin Basca is the transformation of a symbolic reference to an actual reference -- 6232*0c56280aSSorin Basca i.e., as long as there is only a symbolic reference to an entity, this entity 6233*0c56280aSSorin Basca cannot be verified at all because it has not been loaded yet. 6234*0c56280aSSorin Basca Passes two and three are performed during the 6235*0c56280aSSorin Basca\emph on 6236*0c56280aSSorin Bascaresolution 6237*0c56280aSSorin Basca\emph default 6238*0c56280aSSorin Basca of a class file; while loading of the class file --pass one-- must have 6239*0c56280aSSorin Basca been performed before. 6240*0c56280aSSorin Basca 6241*0c56280aSSorin Basca\emph on 6242*0c56280aSSorin BascaResolution 6243*0c56280aSSorin Basca\emph default 6244*0c56280aSSorin Basca as such is meaningless to JustIce; the term is only used to draw the borders 6245*0c56280aSSorin Basca between the verification passes. 6246*0c56280aSSorin Basca\layout Section 6247*0c56280aSSorin Basca 6248*0c56280aSSorin Basca 6249*0c56280aSSorin Basca\begin_inset LatexCommand \label{SpecPassTwo} 6250*0c56280aSSorin Basca 6251*0c56280aSSorin Basca\end_inset 6252*0c56280aSSorin Basca 6253*0c56280aSSorin BascaPass Two 6254*0c56280aSSorin Basca\layout Standard 6255*0c56280aSSorin Basca 6256*0c56280aSSorin BascaThe checks performed in pass two enforce that the following constraints 6257*0c56280aSSorin Basca are satisfied. 6258*0c56280aSSorin Basca\layout Itemize 6259*0c56280aSSorin Basca 6260*0c56280aSSorin BascaEnsuring that final classes are not subclassed and that final methods are 6261*0c56280aSSorin Basca not overridden. 6262*0c56280aSSorin Basca\layout Itemize 6263*0c56280aSSorin Basca 6264*0c56280aSSorin BascaChecking that every class (except 6265*0c56280aSSorin Basca\family typewriter 6266*0c56280aSSorin Bascajava.lang.Object 6267*0c56280aSSorin Basca\family default 6268*0c56280aSSorin Basca) has a direct superclass. 6269*0c56280aSSorin Basca\layout Itemize 6270*0c56280aSSorin Basca 6271*0c56280aSSorin BascaEnsuring that the constant pool satisfies the documented static constraints: 6272*0c56280aSSorin Basca for example, that each 6273*0c56280aSSorin Basca\family typewriter 6274*0c56280aSSorin BascaCONSTANT_Class_info 6275*0c56280aSSorin Basca\family default 6276*0c56280aSSorin Basca structure in the constant pool contains in its 6277*0c56280aSSorin Basca\family typewriter 6278*0c56280aSSorin Bascaname_index 6279*0c56280aSSorin Basca\family default 6280*0c56280aSSorin Basca item a valid constant pool index for a 6281*0c56280aSSorin Basca\family typewriter 6282*0c56280aSSorin BascaCONSTANT_Utf8_info 6283*0c56280aSSorin Basca\family default 6284*0c56280aSSorin Basca structure. 6285*0c56280aSSorin Basca\layout Itemize 6286*0c56280aSSorin Basca 6287*0c56280aSSorin BascaChecking that all field references and method references in the constant 6288*0c56280aSSorin Basca pool have valid names, valid classes, and a valid type descriptor. 6289*0c56280aSSorin Basca\layout Standard 6290*0c56280aSSorin Basca 6291*0c56280aSSorin BascaAs Frank Yellin puts it 6292*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Yellin-WWW} 6293*0c56280aSSorin Basca 6294*0c56280aSSorin Basca\end_inset 6295*0c56280aSSorin Basca 6296*0c56280aSSorin Basca: pass two 6297*0c56280aSSorin Basca\begin_inset Quotes eld 6298*0c56280aSSorin Basca\end_inset 6299*0c56280aSSorin Basca 6300*0c56280aSSorin Bascaperforms all verification that can be performed without looking at the bytecodes 6301*0c56280aSSorin Basca\begin_inset Quotes erd 6302*0c56280aSSorin Basca\end_inset 6303*0c56280aSSorin Basca 6304*0c56280aSSorin Basca. 6305*0c56280aSSorin Basca Also, 6306*0c56280aSSorin Basca\begin_inset Quotes eld 6307*0c56280aSSorin Basca\end_inset 6308*0c56280aSSorin Basca 6309*0c56280aSSorin Bascathis pass does not actually check to make sure that the given field or method 6310*0c56280aSSorin Basca really exists in the given class; nor does it check that the type signatures 6311*0c56280aSSorin Basca given refer to real classes. 6312*0c56280aSSorin Basca\begin_inset Quotes erd 6313*0c56280aSSorin Basca\end_inset 6314*0c56280aSSorin Basca 6315*0c56280aSSorin Basca Note that again 6316*0c56280aSSorin Basca\emph on 6317*0c56280aSSorin Bascaresolution 6318*0c56280aSSorin Basca\emph default 6319*0c56280aSSorin Basca plays an important role to create the boundary between two passes; here 6320*0c56280aSSorin Basca it is the boundary between pass two and pass three. 6321*0c56280aSSorin Basca Because linking-time verification enhances the performance of the JVM, 6322*0c56280aSSorin Basca checks that basically belong to pass two are delayed to pass three. 6323*0c56280aSSorin Basca This leads to the obvious contradiction in the sentences cited above. 6324*0c56280aSSorin Basca\layout Standard 6325*0c56280aSSorin Basca 6326*0c56280aSSorin BascaThis performance enhancement has an ugly side effect. 6327*0c56280aSSorin Basca Consider a reference to a method m contained in a class file C that does 6328*0c56280aSSorin Basca not exist. 6329*0c56280aSSorin Basca As long as this reference is not 6330*0c56280aSSorin Basca\emph on 6331*0c56280aSSorin Bascaused 6332*0c56280aSSorin Basca\emph default 6333*0c56280aSSorin Basca, i.e., 6334*0c56280aSSorin Basca\emph on 6335*0c56280aSSorin Bascaresolved 6336*0c56280aSSorin Basca\emph default 6337*0c56280aSSorin Basca, the absence of C cannot be detected. 6338*0c56280aSSorin Basca Such a reference should in the author's opinion regarded as 6339*0c56280aSSorin Basca\begin_inset Quotes eld 6340*0c56280aSSorin Basca\end_inset 6341*0c56280aSSorin Basca 6342*0c56280aSSorin Bascasuperficially unrecognizable information 6343*0c56280aSSorin Basca\begin_inset Quotes erd 6344*0c56280aSSorin Basca\end_inset 6345*0c56280aSSorin Basca 6346*0c56280aSSorin Basca (see section 6347*0c56280aSSorin Basca\begin_inset LatexCommand \ref{PassOneSpec} 6348*0c56280aSSorin Basca 6349*0c56280aSSorin Basca\end_inset 6350*0c56280aSSorin Basca 6351*0c56280aSSorin Basca) and therefore be detected. 6352*0c56280aSSorin Basca\layout Standard 6353*0c56280aSSorin Basca 6354*0c56280aSSorin BascaThis pass has to verify the integrity of the clas file's data structures 6355*0c56280aSSorin Basca as explained in section 6356*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Classfile Structure} 6357*0c56280aSSorin Basca 6358*0c56280aSSorin Basca\end_inset 6359*0c56280aSSorin Basca 6360*0c56280aSSorin Basca. 6361*0c56280aSSorin Basca As an example, consider the Line\SpecialChar \- 6362*0c56280aSSorin BascaNumber\SpecialChar \- 6363*0c56280aSSorin BascaTable atribute. 6364*0c56280aSSorin Basca Sun did not specify there has to be exactly one 6365*0c56280aSSorin Basca\family typewriter 6366*0c56280aSSorin BascaLine\SpecialChar \- 6367*0c56280aSSorin BascaNumber\SpecialChar \- 6368*0c56280aSSorin BascaTable 6369*0c56280aSSorin Basca\family default 6370*0c56280aSSorin Basca attribute (or none at all) per method, so possibly there is more than one 6371*0c56280aSSorin Basca attribute of that kind. 6372*0c56280aSSorin Basca This lax specification is not necessary due to the fact that you can put 6373*0c56280aSSorin Basca all information in a single 6374*0c56280aSSorin Basca\family typewriter 6375*0c56280aSSorin BascaLine\SpecialChar \- 6376*0c56280aSSorin BascaNumber\SpecialChar \- 6377*0c56280aSSorin BascaTable_attri\SpecialChar \- 6378*0c56280aSSorin Bascabute 6379*0c56280aSSorin Basca\begin_float footnote 6380*0c56280aSSorin Basca\layout Standard 6381*0c56280aSSorin Basca 6382*0c56280aSSorin BascaAny number of 6383*0c56280aSSorin Basca\family typewriter 6384*0c56280aSSorin Bascaline_number_table 6385*0c56280aSSorin Basca\family default 6386*0c56280aSSorin Bascaarray entries fits nicely in a single 6387*0c56280aSSorin Basca\family typewriter 6388*0c56280aSSorin BascaLineNumberTable_attribute 6389*0c56280aSSorin Basca\family default 6390*0c56280aSSorin Basca attribute. 6391*0c56280aSSorin Basca\end_float 6392*0c56280aSSorin Basca, but Sun did specify it this way ( 6393*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6394*0c56280aSSorin Basca 6395*0c56280aSSorin Basca\end_inset 6396*0c56280aSSorin Basca 6397*0c56280aSSorin Basca, page 129). 6398*0c56280aSSorin Basca\layout Standard 6399*0c56280aSSorin Basca 6400*0c56280aSSorin BascaVerifiers are requested to reject class files with inconsistent information 6401*0c56280aSSorin Basca in their attributes. 6402*0c56280aSSorin Basca However, here it may be that only by looking at all 6403*0c56280aSSorin Basca\family typewriter 6404*0c56280aSSorin BascaLine\SpecialChar \- 6405*0c56280aSSorin BascaNumber\SpecialChar \- 6406*0c56280aSSorin BascaTable_attribute 6407*0c56280aSSorin Basca\family default 6408*0c56280aSSorin Bascas of a method, an inconsistency can be detected. 6409*0c56280aSSorin Basca JustIce does so and rejects class files with inconsistent 6410*0c56280aSSorin Basca\family typewriter 6411*0c56280aSSorin BascaLine\SpecialChar \- 6412*0c56280aSSorin BascaNumber\SpecialChar \- 6413*0c56280aSSorin BascaTable 6414*0c56280aSSorin Basca\family default 6415*0c56280aSSorin Basca information. 6416*0c56280aSSorin Basca\layout Standard 6417*0c56280aSSorin Basca 6418*0c56280aSSorin BascaFurthermore, it issues warnings if such an attribute is detected at all 6419*0c56280aSSorin Basca to discourage its use (see section 6420*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass2Impl} 6421*0c56280aSSorin Basca 6422*0c56280aSSorin Basca\end_inset 6423*0c56280aSSorin Basca 6424*0c56280aSSorin Basca). 6425*0c56280aSSorin Basca This is done because of possible different interpretations of the specification. 6426*0c56280aSSorin Basca\layout Standard 6427*0c56280aSSorin Basca 6428*0c56280aSSorin BascaIt should be noted that the use of attributes raises a few more problems 6429*0c56280aSSorin Basca to class file verification. 6430*0c56280aSSorin Basca A simple case is the presence of an unknown attribute that may safely be 6431*0c56280aSSorin Basca ignored. 6432*0c56280aSSorin Basca It is explicitly stated that such a class file must not be rejected. 6433*0c56280aSSorin Basca On the other hand, how should a verifier react if --for example-- a 6434*0c56280aSSorin Basca\family typewriter 6435*0c56280aSSorin Bascafield_info 6436*0c56280aSSorin Basca\family default 6437*0c56280aSSorin Basca (see section 6438*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Fields} 6439*0c56280aSSorin Basca 6440*0c56280aSSorin Basca\end_inset 6441*0c56280aSSorin Basca 6442*0c56280aSSorin Basca) structure encloses a 6443*0c56280aSSorin Basca\family typewriter 6444*0c56280aSSorin BascaCode_attribute 6445*0c56280aSSorin Basca\family default 6446*0c56280aSSorin Basca? JustIce will issue a warning but not reject the class file. 6447*0c56280aSSorin Basca\layout Section 6448*0c56280aSSorin Basca 6449*0c56280aSSorin Basca 6450*0c56280aSSorin Basca\begin_inset LatexCommand \label{Pass3Spec} 6451*0c56280aSSorin Basca 6452*0c56280aSSorin Basca\end_inset 6453*0c56280aSSorin Basca 6454*0c56280aSSorin BascaPass Three 6455*0c56280aSSorin Basca\layout Standard 6456*0c56280aSSorin Basca 6457*0c56280aSSorin BascaPerforming pass three basically means 6458*0c56280aSSorin Basca\emph on 6459*0c56280aSSorin Bascaverifying the bytecode 6460*0c56280aSSorin Basca\emph default 6461*0c56280aSSorin Basca. 6462*0c56280aSSorin Basca There are so-called 6463*0c56280aSSorin Basca\begin_inset Quotes eld 6464*0c56280aSSorin Basca\end_inset 6465*0c56280aSSorin Basca 6466*0c56280aSSorin Bascastatic constraints 6467*0c56280aSSorin Basca\begin_inset Quotes erd 6468*0c56280aSSorin Basca\end_inset 6469*0c56280aSSorin Basca 6470*0c56280aSSorin Basca on both the instructions in the code array and their operands. 6471*0c56280aSSorin Basca There are also so-called 6472*0c56280aSSorin Basca\begin_inset Quotes eld 6473*0c56280aSSorin Basca\end_inset 6474*0c56280aSSorin Basca 6475*0c56280aSSorin Bascastructural constraints 6476*0c56280aSSorin Basca\begin_inset Quotes erd 6477*0c56280aSSorin Basca\end_inset 6478*0c56280aSSorin Basca 6479*0c56280aSSorin Basca. 6480*0c56280aSSorin Basca The structural constraints specify constraints on relationships between 6481*0c56280aSSorin Basca JVM instructions, so some people (including the author) regard 6482*0c56280aSSorin Basca\begin_inset Quotes eld 6483*0c56280aSSorin Basca\end_inset 6484*0c56280aSSorin Basca 6485*0c56280aSSorin Bascastructural constraints 6486*0c56280aSSorin Basca\begin_inset Quotes erd 6487*0c56280aSSorin Basca\end_inset 6488*0c56280aSSorin Basca 6489*0c56280aSSorin Basca as a misnomer; they should be called 6490*0c56280aSSorin Basca\begin_inset Quotes eld 6491*0c56280aSSorin Basca\end_inset 6492*0c56280aSSorin Basca 6493*0c56280aSSorin Bascadynamic constraints 6494*0c56280aSSorin Basca\begin_inset Quotes erd 6495*0c56280aSSorin Basca\end_inset 6496*0c56280aSSorin Basca 6497*0c56280aSSorin Basca. 6498*0c56280aSSorin Basca\layout Standard 6499*0c56280aSSorin Basca 6500*0c56280aSSorin BascaStatic constraints are easily enforced using very simple checks. 6501*0c56280aSSorin Basca Here is an example for such a check: let there be a 6502*0c56280aSSorin Basca\family typewriter 6503*0c56280aSSorin BascaCode 6504*0c56280aSSorin Basca\family default 6505*0c56280aSSorin Basca (see section 6506*0c56280aSSorin Basca\begin_inset LatexCommand \ref{CodeAttribute} 6507*0c56280aSSorin Basca 6508*0c56280aSSorin Basca\end_inset 6509*0c56280aSSorin Basca 6510*0c56280aSSorin Basca) attribute with a 6511*0c56280aSSorin Basca\family typewriter 6512*0c56280aSSorin Bascamax_locals 6513*0c56280aSSorin Basca\family default 6514*0c56280aSSorin Basca value of 2. 6515*0c56280aSSorin Basca Only local variables number 0 and 1 may be accessed by the bytecode in 6516*0c56280aSSorin Basca this 6517*0c56280aSSorin Basca\family typewriter 6518*0c56280aSSorin BascaCode 6519*0c56280aSSorin Basca\family default 6520*0c56280aSSorin Basca attribute. 6521*0c56280aSSorin Basca For all instructions accessing local variables, make sure they do not access 6522*0c56280aSSorin Basca any other local variable. 6523*0c56280aSSorin Basca\layout Standard 6524*0c56280aSSorin Basca 6525*0c56280aSSorin BascaStructural constraints are enforced using an algorithm sketched by Sun; 6526*0c56280aSSorin Basca it implements a symbolic execution of a method's code, by means of data 6527*0c56280aSSorin Basca flow analysis including type inference ( 6528*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6529*0c56280aSSorin Basca 6530*0c56280aSSorin Basca\end_inset 6531*0c56280aSSorin Basca 6532*0c56280aSSorin Basca, pages 143-151). 6533*0c56280aSSorin Basca This algorithm is called the 6534*0c56280aSSorin Basca\emph on 6535*0c56280aSSorin Bascadata flow analyzer. 6536*0c56280aSSorin Basca 6537*0c56280aSSorin Basca\emph default 6538*0c56280aSSorin Basca It is intuitively easy to understand, but it is hard to prove its correctness. 6539*0c56280aSSorin Basca The reason for that is the very weak specification of its subtleties; especiall 6540*0c56280aSSorin Bascay 6541*0c56280aSSorin Basca\emph on 6542*0c56280aSSorin Bascasubroutines 6543*0c56280aSSorin Basca\emph default 6544*0c56280aSSorin Basca, 6545*0c56280aSSorin Basca\emph on 6546*0c56280aSSorin Bascawide date types 6547*0c56280aSSorin Basca\emph default 6548*0c56280aSSorin Basca and 6549*0c56280aSSorin Basca\emph on 6550*0c56280aSSorin Bascaobject initialization 6551*0c56280aSSorin Basca\emph default 6552*0c56280aSSorin Basca (see below). 6553*0c56280aSSorin Basca The general approach, however, is sound 6554*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCV-Soundness} 6555*0c56280aSSorin Basca 6556*0c56280aSSorin Basca\end_inset 6557*0c56280aSSorin Basca 6558*0c56280aSSorin Basca. 6559*0c56280aSSorin Basca Here is an example for a structural constraint enforced by this algorithm: 6560*0c56280aSSorin Basca during program execution, at any given point in the program the operand 6561*0c56280aSSorin Basca stack is always of the same height, no matter which code path was taken 6562*0c56280aSSorin Basca to reach that point. 6563*0c56280aSSorin Basca 6564*0c56280aSSorin Basca\layout Standard 6565*0c56280aSSorin Basca 6566*0c56280aSSorin BascaPass three is the core of the verifier. 6567*0c56280aSSorin Basca Note that we will split this pass up into two passes, namely a pass verifying 6568*0c56280aSSorin Basca the static constraints and a pass verifying the structural constraints 6569*0c56280aSSorin Basca of a method's code. 6570*0c56280aSSorin Basca We will call these passes 6571*0c56280aSSorin Basca\begin_inset Quotes eld 6572*0c56280aSSorin Basca\end_inset 6573*0c56280aSSorin Basca 6574*0c56280aSSorin Bascapass 3a 6575*0c56280aSSorin Basca\begin_inset Quotes erd 6576*0c56280aSSorin Basca\end_inset 6577*0c56280aSSorin Basca 6578*0c56280aSSorin Basca and 6579*0c56280aSSorin Basca\begin_inset Quotes eld 6580*0c56280aSSorin Basca\end_inset 6581*0c56280aSSorin Basca 6582*0c56280aSSorin Bascapass 3b 6583*0c56280aSSorin Basca\begin_inset Quotes erd 6584*0c56280aSSorin Basca\end_inset 6585*0c56280aSSorin Basca 6586*0c56280aSSorin Basca. 6587*0c56280aSSorin Basca In a way, they resemble pass one and pass two: the former pass carefully 6588*0c56280aSSorin Basca parses an entity, while the latter pass performs additional verification. 6589*0c56280aSSorin Basca 6590*0c56280aSSorin Basca\layout Standard 6591*0c56280aSSorin Basca 6592*0c56280aSSorin BascaBy defining pass four, the specification 6593*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6594*0c56280aSSorin Basca 6595*0c56280aSSorin Basca\end_inset 6596*0c56280aSSorin Basca 6597*0c56280aSSorin Basca implicitly excludes 6598*0c56280aSSorin Basca\begin_inset Quotes eld 6599*0c56280aSSorin Basca\end_inset 6600*0c56280aSSorin Basca 6601*0c56280aSSorin Bascacertain tests that could in principle be performed in Pass 3 6602*0c56280aSSorin Basca\begin_inset Quotes erd 6603*0c56280aSSorin Basca\end_inset 6604*0c56280aSSorin Basca 6605*0c56280aSSorin Basca, because they are 6606*0c56280aSSorin Basca\begin_inset Quotes eld 6607*0c56280aSSorin Basca\end_inset 6608*0c56280aSSorin Basca 6609*0c56280aSSorin Bascadelayed until the first time the code for the method is actually invoked 6610*0c56280aSSorin Basca\begin_inset Quotes erd 6611*0c56280aSSorin Basca\end_inset 6612*0c56280aSSorin Basca 6613*0c56280aSSorin Basca. 6614*0c56280aSSorin Basca On the other hand, verifiers are allowed to perform pass four partially 6615*0c56280aSSorin Basca or completely as a part of pass three. 6616*0c56280aSSorin Basca JustIce performs the pass four checks in pass 3a. 6617*0c56280aSSorin Basca\layout Subsection 6618*0c56280aSSorin Basca 6619*0c56280aSSorin BascaStatic Constraints: Pass 3a 6620*0c56280aSSorin Basca\layout Standard 6621*0c56280aSSorin Basca 6622*0c56280aSSorin BascaSun gives examples of what the verifier does before starting the data flow 6623*0c56280aSSorin Basca analyzer ( 6624*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6625*0c56280aSSorin Basca 6626*0c56280aSSorin Basca\end_inset 6627*0c56280aSSorin Basca 6628*0c56280aSSorin Basca, pages 143-144): 6629*0c56280aSSorin Basca\layout Itemize 6630*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6631*0c56280aSSorin Basca 6632*0c56280aSSorin Basca 6633*0c56280aSSorin Basca\series bold 6634*0c56280aSSorin BascaBranches must be within the bounds of the code array for the method. 6635*0c56280aSSorin Basca\layout Itemize 6636*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6637*0c56280aSSorin Basca 6638*0c56280aSSorin Basca 6639*0c56280aSSorin Basca\series bold 6640*0c56280aSSorin BascaThe targets of all control-flow instructions are each the start of an instructio 6641*0c56280aSSorin Bascan. 6642*0c56280aSSorin Basca In the case of a 6643*0c56280aSSorin Basca\latex latex 6644*0c56280aSSorin Basca 6645*0c56280aSSorin Basca\backslash 6646*0c56280aSSorin Bascatexttt{wide} 6647*0c56280aSSorin Basca\latex default 6648*0c56280aSSorin Basca instruction the 6649*0c56280aSSorin Basca\latex latex 6650*0c56280aSSorin Basca 6651*0c56280aSSorin Basca\backslash 6652*0c56280aSSorin Bascatexttt{wide} 6653*0c56280aSSorin Basca\latex default 6654*0c56280aSSorin Bascaopcode is considered the start of the instruction, and the opcode giving 6655*0c56280aSSorin Basca the operation modified by that 6656*0c56280aSSorin Basca\latex latex 6657*0c56280aSSorin Basca 6658*0c56280aSSorin Basca\backslash 6659*0c56280aSSorin Bascatexttt{wide} 6660*0c56280aSSorin Basca\latex default 6661*0c56280aSSorin Basca instruction is not considered to start an instruction. 6662*0c56280aSSorin Basca Branches into the middle of an instruction are disallowed. 6663*0c56280aSSorin Basca\layout Itemize 6664*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6665*0c56280aSSorin Basca 6666*0c56280aSSorin Basca 6667*0c56280aSSorin Basca\series bold 6668*0c56280aSSorin BascaNo instruction can access or modify a local variable at an index greater 6669*0c56280aSSorin Basca than or equal to the number of local variables that its method indicates 6670*0c56280aSSorin Basca it allocates. 6671*0c56280aSSorin Basca\layout Itemize 6672*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6673*0c56280aSSorin Basca 6674*0c56280aSSorin Basca 6675*0c56280aSSorin Basca\series bold 6676*0c56280aSSorin BascaAll references to the constant pool must be an entry of the appropriate 6677*0c56280aSSorin Basca type. 6678*0c56280aSSorin Basca For example: the instruction 6679*0c56280aSSorin Basca\latex latex 6680*0c56280aSSorin Basca 6681*0c56280aSSorin Basca\backslash 6682*0c56280aSSorin Bascatexttt{ldc} 6683*0c56280aSSorin Basca\latex default 6684*0c56280aSSorin Basca can be used only for data of type int or float or for instances of class 6685*0c56280aSSorin Basca String; the instruction 6686*0c56280aSSorin Basca\latex latex 6687*0c56280aSSorin Basca 6688*0c56280aSSorin Basca\backslash 6689*0c56280aSSorin Bascatexttt{getfield} 6690*0c56280aSSorin Basca\latex default 6691*0c56280aSSorin Basca must reference a field. 6692*0c56280aSSorin Basca\layout Itemize 6693*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6694*0c56280aSSorin Basca 6695*0c56280aSSorin Basca 6696*0c56280aSSorin Basca\series bold 6697*0c56280aSSorin BascaThe code does not end in the middle of an instruction. 6698*0c56280aSSorin Basca\layout Itemize 6699*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6700*0c56280aSSorin Basca 6701*0c56280aSSorin Basca 6702*0c56280aSSorin Basca\series bold 6703*0c56280aSSorin BascaExecution cannot fall off the end of the code. 6704*0c56280aSSorin Basca\layout Itemize 6705*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6706*0c56280aSSorin Basca 6707*0c56280aSSorin Basca 6708*0c56280aSSorin Basca\series bold 6709*0c56280aSSorin BascaFor each exception handler, the starting and ending point of the code protected 6710*0c56280aSSorin Basca by the handler must be at the beginning of an instruction or, in the case 6711*0c56280aSSorin Basca of the ending point, immediately past the end of the code. 6712*0c56280aSSorin Basca The starting point must be before the ending point. 6713*0c56280aSSorin Basca The exception handler code must start at a valid instruction, and it may 6714*0c56280aSSorin Basca not start at an opcode being modified by the 6715*0c56280aSSorin Basca\latex latex 6716*0c56280aSSorin Basca 6717*0c56280aSSorin Basca\backslash 6718*0c56280aSSorin Bascatexttt{wide} 6719*0c56280aSSorin Basca\latex default 6720*0c56280aSSorin Basca instruction. 6721*0c56280aSSorin Basca\layout Standard 6722*0c56280aSSorin Basca 6723*0c56280aSSorin BascaMost of these constraints are either static constraints on instructions 6724*0c56280aSSorin Basca or on their operands. 6725*0c56280aSSorin Basca A full list of constraints can be found in the Java Virtual Machine Specificati 6726*0c56280aSSorin Bascaon, Second Edition ( 6727*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6728*0c56280aSSorin Basca 6729*0c56280aSSorin Basca\end_inset 6730*0c56280aSSorin Basca 6731*0c56280aSSorin Basca, pages 133-137). 6732*0c56280aSSorin Basca\layout Standard 6733*0c56280aSSorin Basca 6734*0c56280aSSorin BascaThe check for execution falling off the end of the code is an exception: 6735*0c56280aSSorin Basca this is a structural constraint and should therefore be performed in pass 6736*0c56280aSSorin Basca 3b. 6737*0c56280aSSorin Basca Sun's verifiers, however, reject code that has an unreachable 6738*0c56280aSSorin Basca\latex latex 6739*0c56280aSSorin Basca 6740*0c56280aSSorin Basca\backslash 6741*0c56280aSSorin Bascatexttt{nop} 6742*0c56280aSSorin Basca\latex default 6743*0c56280aSSorin Bascaat the end of the code array. 6744*0c56280aSSorin Basca Obviously, they reject the code before performing data flow analysis. 6745*0c56280aSSorin Basca For the sake of compatibility, JustIce performs this check in pass 3a. 6746*0c56280aSSorin Basca\layout Standard 6747*0c56280aSSorin Basca 6748*0c56280aSSorin BascaNote that the JVM's instructions differ in length. 6749*0c56280aSSorin Basca Some instructions occupy only one byte (such as 6750*0c56280aSSorin Basca\family typewriter 6751*0c56280aSSorin Bascanop 6752*0c56280aSSorin Basca\family default 6753*0c56280aSSorin Basca), others occupy three bytes (such as 6754*0c56280aSSorin Basca\family typewriter 6755*0c56280aSSorin Bascagoto 6756*0c56280aSSorin Basca\family default 6757*0c56280aSSorin Basca). 6758*0c56280aSSorin Basca Branch instructions could therefore target operands of instructions. 6759*0c56280aSSorin Basca For example, line 1 of algorithm 6760*0c56280aSSorin Basca\begin_inset LatexCommand \ref{facjavabytecode} 6761*0c56280aSSorin Basca 6762*0c56280aSSorin Basca\end_inset 6763*0c56280aSSorin Basca 6764*0c56280aSSorin Basca reads 6765*0c56280aSSorin Basca\begin_inset Quotes eld 6766*0c56280aSSorin Basca\end_inset 6767*0c56280aSSorin Basca 6768*0c56280aSSorin Basca 6769*0c56280aSSorin Basca\family typewriter 6770*0c56280aSSorin Basca1: ifne #8 6771*0c56280aSSorin Basca\family default 6772*0c56280aSSorin Basca 6773*0c56280aSSorin Basca\begin_inset Quotes erd 6774*0c56280aSSorin Basca\end_inset 6775*0c56280aSSorin Basca 6776*0c56280aSSorin Basca. 6777*0c56280aSSorin Basca If it would read 6778*0c56280aSSorin Basca\begin_inset Quotes eld 6779*0c56280aSSorin Basca\end_inset 6780*0c56280aSSorin Basca 6781*0c56280aSSorin Basca 6782*0c56280aSSorin Basca\family typewriter 6783*0c56280aSSorin Basca1: ifne #7 6784*0c56280aSSorin Basca\family default 6785*0c56280aSSorin Basca 6786*0c56280aSSorin Basca\begin_inset Quotes erd 6787*0c56280aSSorin Basca\end_inset 6788*0c56280aSSorin Basca 6789*0c56280aSSorin Basca, this code was malformed. 6790*0c56280aSSorin Basca A special case is the instruction 6791*0c56280aSSorin Basca\family typewriter 6792*0c56280aSSorin Bascawide 6793*0c56280aSSorin Basca\family default 6794*0c56280aSSorin Basca. 6795*0c56280aSSorin Basca This instruction takes another instruction 6796*0c56280aSSorin Basca\emph on 6797*0c56280aSSorin Bascaas its operand 6798*0c56280aSSorin Basca\emph default 6799*0c56280aSSorin Basca, so one could be misguided into thinking this embedded instruction was 6800*0c56280aSSorin Basca a valid target for branches. 6801*0c56280aSSorin Basca It is not. 6802*0c56280aSSorin Basca\layout Standard 6803*0c56280aSSorin Basca 6804*0c56280aSSorin BascaThe checks Sun delays until pass four are performed in pass 3a by JustIce. 6805*0c56280aSSorin Basca These are checks to ensure allowed and possible access to a referenced 6806*0c56280aSSorin Basca type, listed below. 6807*0c56280aSSorin Basca 6808*0c56280aSSorin Basca\layout Itemize 6809*0c56280aSSorin Basca 6810*0c56280aSSorin BascaIs the type (class or interface) currently under examination allowed to 6811*0c56280aSSorin Basca reference the type 6812*0c56280aSSorin Basca\begin_float footnote 6813*0c56280aSSorin Basca\layout Standard 6814*0c56280aSSorin Basca 6815*0c56280aSSorin BascaInterfaces may contain code, this is normally used for static initialization 6816*0c56280aSSorin Basca of 6817*0c56280aSSorin Basca\family typewriter 6818*0c56280aSSorin Bascafinal 6819*0c56280aSSorin Basca\family default 6820*0c56280aSSorin Basca variables. 6821*0c56280aSSorin Basca\end_float 6822*0c56280aSSorin Basca? 6823*0c56280aSSorin Basca\layout Itemize 6824*0c56280aSSorin Basca 6825*0c56280aSSorin BascaDoes the referenced method or field exist in the given class? 6826*0c56280aSSorin Basca\layout Itemize 6827*0c56280aSSorin Basca 6828*0c56280aSSorin BascaDoes the referenced method or field have the indicated descriptor (signature)? 6829*0c56280aSSorin Basca\layout Itemize 6830*0c56280aSSorin Basca 6831*0c56280aSSorin BascaDoes the method currently under examination have access to the referenced 6832*0c56280aSSorin Basca method or field? 6833*0c56280aSSorin Basca\layout Subsection 6834*0c56280aSSorin Basca 6835*0c56280aSSorin BascaStructural Constraints: Pass 3b 6836*0c56280aSSorin Basca\layout Standard 6837*0c56280aSSorin Basca 6838*0c56280aSSorin BascaThe structural constraints of JVM instructions are enforced by a data flow 6839*0c56280aSSorin Basca analyzer. 6840*0c56280aSSorin Basca This algorithm ensures the following constraints ( 6841*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6842*0c56280aSSorin Basca 6843*0c56280aSSorin Basca\end_inset 6844*0c56280aSSorin Basca 6845*0c56280aSSorin Basca, page 142). 6846*0c56280aSSorin Basca\layout Itemize 6847*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6848*0c56280aSSorin Basca 6849*0c56280aSSorin Basca 6850*0c56280aSSorin Basca\series bold 6851*0c56280aSSorin BascaThe operand stack is always the same size and contains the same types of 6852*0c56280aSSorin Basca values. 6853*0c56280aSSorin Basca\layout Itemize 6854*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6855*0c56280aSSorin Basca 6856*0c56280aSSorin Basca 6857*0c56280aSSorin Basca\series bold 6858*0c56280aSSorin BascaNo local variable is accessed unless it is known to contain a value of an 6859*0c56280aSSorin Basca appropriate type. 6860*0c56280aSSorin Basca\layout Itemize 6861*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6862*0c56280aSSorin Basca 6863*0c56280aSSorin Basca 6864*0c56280aSSorin Basca\series bold 6865*0c56280aSSorin BascaMethods are invoked with the appropriate arguments. 6866*0c56280aSSorin Basca\layout Itemize 6867*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6868*0c56280aSSorin Basca 6869*0c56280aSSorin Basca 6870*0c56280aSSorin Basca\series bold 6871*0c56280aSSorin BascaFields are assigned only using values of appropriate types. 6872*0c56280aSSorin Basca\layout Itemize 6873*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6874*0c56280aSSorin Basca 6875*0c56280aSSorin Basca 6876*0c56280aSSorin Basca\series bold 6877*0c56280aSSorin BascaAll opcodes have appropriate type arguments on the operand stack and in 6878*0c56280aSSorin Basca the local variable array. 6879*0c56280aSSorin Basca\layout Standard 6880*0c56280aSSorin Basca 6881*0c56280aSSorin BascaA full list of structural constraints can be found in The Java Virtual Machine 6882*0c56280aSSorin Basca Specification, Second Edition ( 6883*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6884*0c56280aSSorin Basca 6885*0c56280aSSorin Basca\end_inset 6886*0c56280aSSorin Basca 6887*0c56280aSSorin Basca, pages 137-139). 6888*0c56280aSSorin Basca\layout Subsubsection 6889*0c56280aSSorin Basca 6890*0c56280aSSorin Basca 6891*0c56280aSSorin Basca\begin_inset LatexCommand \label{SunCoreAlgo} 6892*0c56280aSSorin Basca 6893*0c56280aSSorin Basca\end_inset 6894*0c56280aSSorin Basca 6895*0c56280aSSorin BascaSun's Verification Algorithm 6896*0c56280aSSorin Basca\layout Standard 6897*0c56280aSSorin Basca 6898*0c56280aSSorin BascaSun specifies the data flow analyzer by giving an informal algorithm ( 6899*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 6900*0c56280aSSorin Basca 6901*0c56280aSSorin Basca\end_inset 6902*0c56280aSSorin Basca 6903*0c56280aSSorin Basca, pages 144-146). 6904*0c56280aSSorin Basca This algorithm it cited here completely because it is the very core of 6905*0c56280aSSorin Basca the verifier. 6906*0c56280aSSorin Basca According to this algorithm, every bytecode instruction has a 6907*0c56280aSSorin Basca\begin_inset Quotes eld 6908*0c56280aSSorin Basca\end_inset 6909*0c56280aSSorin Basca 6910*0c56280aSSorin Bascachanged 6911*0c56280aSSorin Basca\begin_inset Quotes erd 6912*0c56280aSSorin Basca\end_inset 6913*0c56280aSSorin Basca 6914*0c56280aSSorin Basca bit. 6915*0c56280aSSorin Basca Initially, only the 6916*0c56280aSSorin Basca\begin_inset Quotes eld 6917*0c56280aSSorin Basca\end_inset 6918*0c56280aSSorin Basca 6919*0c56280aSSorin Bascachanged 6920*0c56280aSSorin Basca\begin_inset Quotes erd 6921*0c56280aSSorin Basca\end_inset 6922*0c56280aSSorin Basca 6923*0c56280aSSorin Basca bit of the first instruction is set. 6924*0c56280aSSorin Basca\layout Enumerate 6925*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6926*0c56280aSSorin Basca 6927*0c56280aSSorin Basca 6928*0c56280aSSorin Basca\series bold 6929*0c56280aSSorin BascaSelect a virtual machine instruction whose "changed" bit is set. 6930*0c56280aSSorin Basca If no instruction remains whose "changed" bit is set, the method has successful 6931*0c56280aSSorin Bascaly been verified. 6932*0c56280aSSorin Basca Otherwise, turn off the "changed" bit of the selected instruction. 6933*0c56280aSSorin Basca\layout Enumerate 6934*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6935*0c56280aSSorin Basca 6936*0c56280aSSorin Basca 6937*0c56280aSSorin Basca\series bold 6938*0c56280aSSorin BascaModel the effect of the instruction on the operand stack and local variable 6939*0c56280aSSorin Basca array by doing the following: 6940*0c56280aSSorin Basca\newline 6941*0c56280aSSorin Basca 6942*0c56280aSSorin Basca\latex latex 6943*0c56280aSSorin Basca 6944*0c56280aSSorin Basca\backslash 6945*0c56280aSSorin Bascatextbullet\SpecialChar ~ 6946*0c56280aSSorin Basca 6947*0c56280aSSorin Basca\latex default 6948*0c56280aSSorin BascaIf the instruction uses values from the operand stack, ensure that there 6949*0c56280aSSorin Basca are a sufficient number of values on the stack and that the top values 6950*0c56280aSSorin Basca on the stack are of an appropriate type. 6951*0c56280aSSorin Basca Otherwise, verification fails. 6952*0c56280aSSorin Basca\newline 6953*0c56280aSSorin Basca 6954*0c56280aSSorin Basca\latex latex 6955*0c56280aSSorin Basca 6956*0c56280aSSorin Basca\backslash 6957*0c56280aSSorin Bascatextbullet\SpecialChar ~ 6958*0c56280aSSorin Basca 6959*0c56280aSSorin Basca\latex default 6960*0c56280aSSorin BascaIf the instruction uses a local variable, ensure that the specified local 6961*0c56280aSSorin Basca variable contains a value of the appropriate type. 6962*0c56280aSSorin Basca Otherwise, verification fails. 6963*0c56280aSSorin Basca\newline 6964*0c56280aSSorin Basca 6965*0c56280aSSorin Basca\latex latex 6966*0c56280aSSorin Basca 6967*0c56280aSSorin Basca\backslash 6968*0c56280aSSorin Bascatextbullet\SpecialChar ~ 6969*0c56280aSSorin Basca 6970*0c56280aSSorin Basca\latex default 6971*0c56280aSSorin BascaIf the instruction pushes values onto the operand stack, ensure that there 6972*0c56280aSSorin Basca is sufficient room on the operand stack for the new values. 6973*0c56280aSSorin Basca Add the indicated types to the top of the modeled operand stack. 6974*0c56280aSSorin Basca\newline 6975*0c56280aSSorin Basca 6976*0c56280aSSorin Basca\latex latex 6977*0c56280aSSorin Basca 6978*0c56280aSSorin Basca\backslash 6979*0c56280aSSorin Bascatextbullet\SpecialChar ~ 6980*0c56280aSSorin Basca 6981*0c56280aSSorin Basca\latex default 6982*0c56280aSSorin BascaIf the instruction modifies a local variable, record that the local variable 6983*0c56280aSSorin Basca now contains the new type. 6984*0c56280aSSorin Basca\layout Enumerate 6985*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 6986*0c56280aSSorin Basca 6987*0c56280aSSorin Basca 6988*0c56280aSSorin Basca\series bold 6989*0c56280aSSorin BascaDetermine the instructions that can follow the current instruction. 6990*0c56280aSSorin Basca Successor instructions can be one of the following: 6991*0c56280aSSorin Basca\newline 6992*0c56280aSSorin Basca 6993*0c56280aSSorin Basca\latex latex 6994*0c56280aSSorin Basca 6995*0c56280aSSorin Basca\backslash 6996*0c56280aSSorin Bascatextbullet\SpecialChar ~ 6997*0c56280aSSorin Basca 6998*0c56280aSSorin Basca\latex default 6999*0c56280aSSorin BascaThe next instruction, if the current instruction is not an unconditional 7000*0c56280aSSorin Basca control transfer instruction (for instance goto, return, or athrow). 7001*0c56280aSSorin Basca Verification fails if it is possible to "fall off" the last instruction 7002*0c56280aSSorin Basca of the method. 7003*0c56280aSSorin Basca\newline 7004*0c56280aSSorin Basca 7005*0c56280aSSorin Basca\latex latex 7006*0c56280aSSorin Basca 7007*0c56280aSSorin Basca\backslash 7008*0c56280aSSorin Bascatextbullet\SpecialChar ~ 7009*0c56280aSSorin Basca 7010*0c56280aSSorin Basca\latex default 7011*0c56280aSSorin BascaThe target(s) of a conditional or unconditional branch or switch. 7012*0c56280aSSorin Basca\newline 7013*0c56280aSSorin Basca 7014*0c56280aSSorin Basca\latex latex 7015*0c56280aSSorin Basca 7016*0c56280aSSorin Basca\backslash 7017*0c56280aSSorin Bascatextbullet\SpecialChar ~ 7018*0c56280aSSorin Basca 7019*0c56280aSSorin Basca\latex default 7020*0c56280aSSorin BascaAny exception handlers for this instruction. 7021*0c56280aSSorin Basca 7022*0c56280aSSorin Basca\layout Enumerate 7023*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 7024*0c56280aSSorin Basca 7025*0c56280aSSorin Basca 7026*0c56280aSSorin Basca\series bold 7027*0c56280aSSorin BascaMerge the state of the operand stack and local variable array at the end 7028*0c56280aSSorin Basca of the execution of the current instruction into each of the successor 7029*0c56280aSSorin Basca instructions. 7030*0c56280aSSorin Basca In the special case of control transfer to an exception handler, the operand 7031*0c56280aSSorin Basca stack is set to contain a single object of the exception type indicated 7032*0c56280aSSorin Basca by the exception handler information. 7033*0c56280aSSorin Basca\newline 7034*0c56280aSSorin Basca 7035*0c56280aSSorin Basca\latex latex 7036*0c56280aSSorin Basca 7037*0c56280aSSorin Basca\backslash 7038*0c56280aSSorin Bascatextbullet\SpecialChar ~ 7039*0c56280aSSorin Basca 7040*0c56280aSSorin Basca\latex default 7041*0c56280aSSorin BascaIf this is the first time the successor instruction has been visited, record 7042*0c56280aSSorin Basca that the operand stack and local variable values calculated in steps 2 7043*0c56280aSSorin Basca and 3 are the state of the operand stack and local variable array prior 7044*0c56280aSSorin Basca to executing the successor instruction. 7045*0c56280aSSorin Basca Set the "changed" bit for the successor instruction. 7046*0c56280aSSorin Basca\newline 7047*0c56280aSSorin Basca 7048*0c56280aSSorin Basca\latex latex 7049*0c56280aSSorin Basca 7050*0c56280aSSorin Basca\backslash 7051*0c56280aSSorin Bascatextbullet\SpecialChar ~ 7052*0c56280aSSorin Basca 7053*0c56280aSSorin Basca\latex default 7054*0c56280aSSorin BascaIf the successor instruction has been seen before, merge the operand stack 7055*0c56280aSSorin Basca and local variable values calculated in steps 2 and 3 into the values already 7056*0c56280aSSorin Basca there. 7057*0c56280aSSorin Basca Set the "changed" bit if there is any modification to the values. 7058*0c56280aSSorin Basca\layout Enumerate 7059*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 7060*0c56280aSSorin Basca 7061*0c56280aSSorin Basca 7062*0c56280aSSorin Basca\series bold 7063*0c56280aSSorin BascaContinue at step 1. 7064*0c56280aSSorin Basca 7065*0c56280aSSorin Basca\layout Standard 7066*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 7067*0c56280aSSorin Basca 7068*0c56280aSSorin Basca 7069*0c56280aSSorin Basca\series bold 7070*0c56280aSSorin BascaTo merge two operand stacks, the number of values on each stack must be 7071*0c56280aSSorin Basca identical. 7072*0c56280aSSorin Basca The types of values on the stacks must also be identical, except that different 7073*0c56280aSSorin Bascaly typed reference values may appear at corresponding places on the two 7074*0c56280aSSorin Basca stacks. 7075*0c56280aSSorin Basca In this case, the merged operand stack contains a reference to an instance 7076*0c56280aSSorin Basca of the first common superclass of the two types. 7077*0c56280aSSorin Basca Such a reference type always exists because the type Object is a superclass 7078*0c56280aSSorin Basca of all class and interface types. 7079*0c56280aSSorin Basca If the operand stacks cannot be merged, verification of the method fails. 7080*0c56280aSSorin Basca\layout Standard 7081*0c56280aSSorin Basca\pextra_type 1 \pextra_width 10mm 7082*0c56280aSSorin Basca 7083*0c56280aSSorin Basca 7084*0c56280aSSorin Basca\series bold 7085*0c56280aSSorin BascaTo merge two local variable array states, corresponding pairs of local variables 7086*0c56280aSSorin Basca are compared. 7087*0c56280aSSorin Basca If the two types are not identical, then unless both contain reference 7088*0c56280aSSorin Basca values, the verifier records that the local variable contains an unusable 7089*0c56280aSSorin Basca value. 7090*0c56280aSSorin Basca If both of the pair of local variables contain reference values, the merged 7091*0c56280aSSorin Basca state contains a reference to an instance of the first common superclass 7092*0c56280aSSorin Basca of the two types. 7093*0c56280aSSorin Basca\layout Standard 7094*0c56280aSSorin Basca 7095*0c56280aSSorin BascaCertain instructions and data types complicate the data flow analyzer, most 7096*0c56280aSSorin Basca notably the instruction 7097*0c56280aSSorin Basca\latex latex 7098*0c56280aSSorin Basca 7099*0c56280aSSorin Basca\backslash 7100*0c56280aSSorin Bascatexttt{ret} 7101*0c56280aSSorin Basca\latex default 7102*0c56280aSSorin Basca (see section 7103*0c56280aSSorin Basca\begin_inset LatexCommand \ref{RetDesc} 7104*0c56280aSSorin Basca 7105*0c56280aSSorin Basca\end_inset 7106*0c56280aSSorin Basca 7107*0c56280aSSorin Basca). 7108*0c56280aSSorin Basca The algorithm above even uses a special definition of 7109*0c56280aSSorin Basca\emph on 7110*0c56280aSSorin Bascamerging 7111*0c56280aSSorin Basca\emph default 7112*0c56280aSSorin Basca for the 7113*0c56280aSSorin Basca\latex latex 7114*0c56280aSSorin Basca 7115*0c56280aSSorin Basca\backslash 7116*0c56280aSSorin Bascatexttt{ret} 7117*0c56280aSSorin Basca\latex default 7118*0c56280aSSorin Basca instruction (see 7119*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 7120*0c56280aSSorin Basca 7121*0c56280aSSorin Basca\end_inset 7122*0c56280aSSorin Basca 7123*0c56280aSSorin Basca, page 151). 7124*0c56280aSSorin Basca The 7125*0c56280aSSorin Basca\latex latex 7126*0c56280aSSorin Basca 7127*0c56280aSSorin Basca\backslash 7128*0c56280aSSorin Bascatexttt{ret} 7129*0c56280aSSorin Basca\latex default 7130*0c56280aSSorin Basca instruction is parameterized with a value of type 7131*0c56280aSSorin Basca\family typewriter 7132*0c56280aSSorin Bascareturnaddress 7133*0c56280aSSorin Basca\family default 7134*0c56280aSSorin Basca which is read from a local variable and used as a branching target. 7135*0c56280aSSorin Basca The 7136*0c56280aSSorin Basca\latex latex 7137*0c56280aSSorin Basca 7138*0c56280aSSorin Basca\backslash 7139*0c56280aSSorin Bascatexttt{ret} 7140*0c56280aSSorin Basca\latex default 7141*0c56280aSSorin Basca instruction is there to implement a (control flow) return from a 7142*0c56280aSSorin Basca\emph on 7143*0c56280aSSorin Bascasubroutine 7144*0c56280aSSorin Basca\emph default 7145*0c56280aSSorin Basca. 7146*0c56280aSSorin Basca\layout Subsubsection 7147*0c56280aSSorin Basca 7148*0c56280aSSorin BascaReachability of Instructions 7149*0c56280aSSorin Basca\layout Standard 7150*0c56280aSSorin Basca 7151*0c56280aSSorin BascaFor the data flow analysis algorithm, you need to know all the possible 7152*0c56280aSSorin Basca control flow successors of every instruction, i.e., you need to build a 7153*0c56280aSSorin Basca\emph on 7154*0c56280aSSorin Bascacontrol flow graph 7155*0c56280aSSorin Basca\emph default 7156*0c56280aSSorin Basca (see below). 7157*0c56280aSSorin Basca Without the instructions 7158*0c56280aSSorin Basca\latex latex 7159*0c56280aSSorin Basca 7160*0c56280aSSorin Basca\backslash 7161*0c56280aSSorin Bascatexttt{jsr} 7162*0c56280aSSorin Basca\begin_float footnote 7163*0c56280aSSorin Basca\layout Standard 7164*0c56280aSSorin Basca 7165*0c56280aSSorin BascaRemember, a 7166*0c56280aSSorin Basca\latex latex 7167*0c56280aSSorin Basca 7168*0c56280aSSorin Basca\backslash 7169*0c56280aSSorin Bascatexttt{jsr} 7170*0c56280aSSorin Basca\latex default 7171*0c56280aSSorin Basca or 7172*0c56280aSSorin Basca\latex latex 7173*0c56280aSSorin Basca 7174*0c56280aSSorin Basca\backslash 7175*0c56280aSSorin Bascatexttt{jsr 7176*0c56280aSSorin Basca\backslash 7177*0c56280aSSorin Basca_w} 7178*0c56280aSSorin Basca\latex default 7179*0c56280aSSorin Basca instruction is an unconditional branch instruction that jumps into a 7180*0c56280aSSorin Basca\emph on 7181*0c56280aSSorin Bascasubroutine 7182*0c56280aSSorin Basca\emph default 7183*0c56280aSSorin Basca. 7184*0c56280aSSorin Basca Usually a 7185*0c56280aSSorin Basca\latex latex 7186*0c56280aSSorin Basca 7187*0c56280aSSorin Basca\backslash 7188*0c56280aSSorin Bascatexttt{ret} 7189*0c56280aSSorin Basca\latex default 7190*0c56280aSSorin Basca instruction leaves the 7191*0c56280aSSorin Basca\emph on 7192*0c56280aSSorin Bascasubroutine 7193*0c56280aSSorin Basca\emph default 7194*0c56280aSSorin Basca. 7195*0c56280aSSorin Basca\end_float 7196*0c56280aSSorin Basca, 7197*0c56280aSSorin Basca\latex latex 7198*0c56280aSSorin Basca 7199*0c56280aSSorin Basca\backslash 7200*0c56280aSSorin Bascatexttt{jsr 7201*0c56280aSSorin Basca\backslash 7202*0c56280aSSorin Basca_w} 7203*0c56280aSSorin Basca\latex default 7204*0c56280aSSorin Basca and 7205*0c56280aSSorin Basca\latex latex 7206*0c56280aSSorin Basca 7207*0c56280aSSorin Basca\backslash 7208*0c56280aSSorin Bascatexttt{ret} 7209*0c56280aSSorin Basca\latex default 7210*0c56280aSSorin Basca this calculation would be easy. 7211*0c56280aSSorin Basca But to calculate successors of a 7212*0c56280aSSorin Basca\latex latex 7213*0c56280aSSorin Basca 7214*0c56280aSSorin Basca\backslash 7215*0c56280aSSorin Bascatexttt{ret} 7216*0c56280aSSorin Basca\latex default 7217*0c56280aSSorin Basca instruction, you need a complete control flow graph: you need to find out 7218*0c56280aSSorin Basca which 7219*0c56280aSSorin Basca\latex latex 7220*0c56280aSSorin Basca 7221*0c56280aSSorin Basca\backslash 7222*0c56280aSSorin Bascatexttt{jsr} 7223*0c56280aSSorin Basca\latex default 7224*0c56280aSSorin Basca or 7225*0c56280aSSorin Basca\latex latex 7226*0c56280aSSorin Basca 7227*0c56280aSSorin Basca\backslash 7228*0c56280aSSorin Bascatexttt{jsr 7229*0c56280aSSorin Basca\backslash 7230*0c56280aSSorin Basca_w} 7231*0c56280aSSorin Basca\latex default 7232*0c56280aSSorin Basca and 7233*0c56280aSSorin Basca\latex latex 7234*0c56280aSSorin Basca 7235*0c56280aSSorin Basca\backslash 7236*0c56280aSSorin Bascatexttt{ret} 7237*0c56280aSSorin Basca\latex default 7238*0c56280aSSorin Basca pairs belong together. 7239*0c56280aSSorin Basca Therefore, a cycle of self-dependency is created that has to be broken 7240*0c56280aSSorin Basca somewhere. 7241*0c56280aSSorin Basca This is explained in detail below. 7242*0c56280aSSorin Basca\layout Standard 7243*0c56280aSSorin Basca 7244*0c56280aSSorin BascaThis was also an issue that led to the definition of the term 7245*0c56280aSSorin Basca\emph on 7246*0c56280aSSorin Basca subroutine 7247*0c56280aSSorin Basca\emph default 7248*0c56280aSSorin Basca that JustIce uses. 7249*0c56280aSSorin Basca This definition allows the prediction of a 7250*0c56280aSSorin Basca\latex latex 7251*0c56280aSSorin Basca 7252*0c56280aSSorin Basca\backslash 7253*0c56280aSSorin Bascatexttt{ret} 7254*0c56280aSSorin Basca\latex default 7255*0c56280aSSorin Basca instruction's target without performing control flow analysis. 7256*0c56280aSSorin Basca\layout Subsubsection 7257*0c56280aSSorin Basca 7258*0c56280aSSorin Basca 7259*0c56280aSSorin Basca\begin_inset LatexCommand \label{SpecSubroutines} 7260*0c56280aSSorin Basca 7261*0c56280aSSorin Basca\end_inset 7262*0c56280aSSorin Basca 7263*0c56280aSSorin BascaSubroutines 7264*0c56280aSSorin Basca\layout Standard 7265*0c56280aSSorin Basca 7266*0c56280aSSorin BascaSubroutines make the verification algorithm extremely difficult. 7267*0c56280aSSorin Basca They are harshly underspecified. 7268*0c56280aSSorin Basca Although 7269*0c56280aSSorin Basca\begin_inset Quotes eld 7270*0c56280aSSorin Basca\end_inset 7271*0c56280aSSorin Basca 7272*0c56280aSSorin Bascathe Java virtual machine has no guarantee that any file it is asked to load 7273*0c56280aSSorin Basca was generated by that compiler 7274*0c56280aSSorin Basca\begin_inset Quotes erd 7275*0c56280aSSorin Basca\end_inset 7276*0c56280aSSorin Basca 7277*0c56280aSSorin Basca, the subroutine specification explains how 7278*0c56280aSSorin Basca\emph on 7279*0c56280aSSorin Bascajavac 7280*0c56280aSSorin Basca\emph default 7281*0c56280aSSorin Bascatransforms 7282*0c56280aSSorin Basca\begin_inset Quotes eld 7283*0c56280aSSorin Basca\end_inset 7284*0c56280aSSorin Basca 7285*0c56280aSSorin Basca 7286*0c56280aSSorin Basca\latex latex 7287*0c56280aSSorin Basca 7288*0c56280aSSorin Basca\backslash 7289*0c56280aSSorin Bascatexttt{try} 7290*0c56280aSSorin Basca\latex default 7291*0c56280aSSorin Basca/ 7292*0c56280aSSorin Basca\latex latex 7293*0c56280aSSorin Basca 7294*0c56280aSSorin Basca\backslash 7295*0c56280aSSorin Bascatexttt{catch} 7296*0c56280aSSorin Basca\latex default 7297*0c56280aSSorin Basca/ 7298*0c56280aSSorin Basca\latex latex 7299*0c56280aSSorin Basca 7300*0c56280aSSorin Basca\backslash 7301*0c56280aSSorin Bascatexttt{finally} 7302*0c56280aSSorin Basca\latex default 7303*0c56280aSSorin Basca 7304*0c56280aSSorin Basca\begin_inset Quotes erd 7305*0c56280aSSorin Basca\end_inset 7306*0c56280aSSorin Basca 7307*0c56280aSSorin Basca clauses into subroutines 7308*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 7309*0c56280aSSorin Basca 7310*0c56280aSSorin Basca\end_inset 7311*0c56280aSSorin Basca 7312*0c56280aSSorin Basca. 7313*0c56280aSSorin Basca Intuitively, one gets the idea that a subroutine starts with some jump 7314*0c56280aSSorin Basca target of a 7315*0c56280aSSorin Basca\latex latex 7316*0c56280aSSorin Basca 7317*0c56280aSSorin Basca\backslash 7318*0c56280aSSorin Bascatexttt{jsr} 7319*0c56280aSSorin Basca\latex default 7320*0c56280aSSorin Basca or 7321*0c56280aSSorin Basca\latex latex 7322*0c56280aSSorin Basca 7323*0c56280aSSorin Basca\backslash 7324*0c56280aSSorin Bascatexttt{jsr 7325*0c56280aSSorin Basca\backslash 7326*0c56280aSSorin Basca_w} 7327*0c56280aSSorin Basca\latex default 7328*0c56280aSSorin Basca instruction and ends with a 7329*0c56280aSSorin Basca\latex latex 7330*0c56280aSSorin Basca 7331*0c56280aSSorin Basca\backslash 7332*0c56280aSSorin Bascatexttt{ret} 7333*0c56280aSSorin Basca\latex default 7334*0c56280aSSorin Basca instruction. 7335*0c56280aSSorin Basca But the specification fails to correctly specify what subroutines exactly 7336*0c56280aSSorin Basca are at machine instruction level. 7337*0c56280aSSorin Basca Consider algorithm 7338*0c56280aSSorin Basca\begin_inset LatexCommand \ref{jsrpopalgo} 7339*0c56280aSSorin Basca 7340*0c56280aSSorin Basca\end_inset 7341*0c56280aSSorin Basca 7342*0c56280aSSorin Basca. 7343*0c56280aSSorin Basca\layout Standard 7344*0c56280aSSorin Basca 7345*0c56280aSSorin Basca\begin_float alg 7346*0c56280aSSorin Basca\layout Standard 7347*0c56280aSSorin Basca 7348*0c56280aSSorin Basca 7349*0c56280aSSorin Basca\family typewriter 7350*0c56280aSSorin Basca00 jsr\SpecialChar ~ 7351*0c56280aSSorin Basca03\SpecialChar ~ 7352*0c56280aSSorin Basca\SpecialChar ~ 7353*0c56280aSSorin Basca\SpecialChar ~ 7354*0c56280aSSorin Basca; Jump to 7355*0c56280aSSorin Basca\begin_inset Quotes eld 7356*0c56280aSSorin Basca\end_inset 7357*0c56280aSSorin Basca 7358*0c56280aSSorin Bascasubroutine 7359*0c56280aSSorin Basca\begin_inset Quotes erd 7360*0c56280aSSorin Basca\end_inset 7361*0c56280aSSorin Basca 7362*0c56280aSSorin Basca at offset 03; push return 7363*0c56280aSSorin Basca\layout Standard 7364*0c56280aSSorin Basca 7365*0c56280aSSorin Basca 7366*0c56280aSSorin Basca\family typewriter 7367*0c56280aSSorin Basca\SpecialChar ~ 7368*0c56280aSSorin Basca\SpecialChar ~ 7369*0c56280aSSorin Basca\SpecialChar ~ 7370*0c56280aSSorin Basca\SpecialChar ~ 7371*0c56280aSSorin Basca\SpecialChar ~ 7372*0c56280aSSorin Basca\SpecialChar ~ 7373*0c56280aSSorin Basca\SpecialChar ~ 7374*0c56280aSSorin Basca\SpecialChar ~ 7375*0c56280aSSorin Basca\SpecialChar ~ 7376*0c56280aSSorin Basca\SpecialChar ~ 7377*0c56280aSSorin Basca\SpecialChar ~ 7378*0c56280aSSorin Basca\SpecialChar ~ 7379*0c56280aSSorin Basca; address 03 onto stack. 7380*0c56280aSSorin Basca\layout Standard 7381*0c56280aSSorin Basca 7382*0c56280aSSorin Basca 7383*0c56280aSSorin Basca\family typewriter 7384*0c56280aSSorin Basca03 pop\SpecialChar ~ 7385*0c56280aSSorin Basca\SpecialChar ~ 7386*0c56280aSSorin Basca\SpecialChar ~ 7387*0c56280aSSorin Basca\SpecialChar ~ 7388*0c56280aSSorin Basca\SpecialChar ~ 7389*0c56280aSSorin Basca\SpecialChar ~ 7390*0c56280aSSorin Basca; Pop the return address off the stack. 7391*0c56280aSSorin Basca\layout Standard 7392*0c56280aSSorin Basca 7393*0c56280aSSorin Basca 7394*0c56280aSSorin Basca\family typewriter 7395*0c56280aSSorin Basca04 nop\SpecialChar ~ 7396*0c56280aSSorin Basca\SpecialChar ~ 7397*0c56280aSSorin Basca\SpecialChar ~ 7398*0c56280aSSorin Basca\SpecialChar ~ 7399*0c56280aSSorin Basca\SpecialChar ~ 7400*0c56280aSSorin Basca\SpecialChar ~ 7401*0c56280aSSorin Basca; No operation. 7402*0c56280aSSorin Basca\layout Caption 7403*0c56280aSSorin Basca 7404*0c56280aSSorin Basca 7405*0c56280aSSorin Basca\begin_inset LatexCommand \label{jsrpopalgo} 7406*0c56280aSSorin Basca 7407*0c56280aSSorin Basca\end_inset 7408*0c56280aSSorin Basca 7409*0c56280aSSorin BascaIs This a Subroutine? 7410*0c56280aSSorin Basca\end_float 7411*0c56280aSSorin Basca\layout Standard 7412*0c56280aSSorin Basca 7413*0c56280aSSorin BascaWhat is this? Is the 7414*0c56280aSSorin Basca\emph on 7415*0c56280aSSorin BascaNOP 7416*0c56280aSSorin Basca\emph default 7417*0c56280aSSorin Basca instruction part of a subroutine or not? Algorithm 7418*0c56280aSSorin Basca\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7419*0c56280aSSorin Basca 7420*0c56280aSSorin Basca\end_inset 7421*0c56280aSSorin Basca 7422*0c56280aSSorin Basca shows another example. 7423*0c56280aSSorin Basca\layout Standard 7424*0c56280aSSorin Basca 7425*0c56280aSSorin Basca\begin_float alg 7426*0c56280aSSorin Basca\layout Caption 7427*0c56280aSSorin Basca 7428*0c56280aSSorin Basca 7429*0c56280aSSorin Basca\begin_inset LatexCommand \label{OneOrTwoSubroutinesAlgo} 7430*0c56280aSSorin Basca 7431*0c56280aSSorin Basca\end_inset 7432*0c56280aSSorin Basca 7433*0c56280aSSorin BascaOne or Two Subroutines? 7434*0c56280aSSorin Basca\layout Standard 7435*0c56280aSSorin Basca 7436*0c56280aSSorin Basca 7437*0c56280aSSorin Basca\family typewriter 7438*0c56280aSSorin Basca00 iload_0\SpecialChar ~ 7439*0c56280aSSorin Basca\SpecialChar ~ 7440*0c56280aSSorin Basca; Load a numerical 0 onto the stack. 7441*0c56280aSSorin Basca\layout Standard 7442*0c56280aSSorin Basca 7443*0c56280aSSorin Basca 7444*0c56280aSSorin Basca\family typewriter 7445*0c56280aSSorin Basca01 jsr\SpecialChar ~ 7446*0c56280aSSorin Basca05\SpecialChar ~ 7447*0c56280aSSorin Basca\SpecialChar ~ 7448*0c56280aSSorin Basca\SpecialChar ~ 7449*0c56280aSSorin Basca; Jump to "subroutine" at offset 05; push return 7450*0c56280aSSorin Basca\layout Standard 7451*0c56280aSSorin Basca 7452*0c56280aSSorin Basca 7453*0c56280aSSorin Basca\family typewriter 7454*0c56280aSSorin Basca\SpecialChar ~ 7455*0c56280aSSorin Basca\SpecialChar ~ 7456*0c56280aSSorin Basca\SpecialChar ~ 7457*0c56280aSSorin Basca\SpecialChar ~ 7458*0c56280aSSorin Basca\SpecialChar ~ 7459*0c56280aSSorin Basca\SpecialChar ~ 7460*0c56280aSSorin Basca\SpecialChar ~ 7461*0c56280aSSorin Basca\SpecialChar ~ 7462*0c56280aSSorin Basca\SpecialChar ~ 7463*0c56280aSSorin Basca\SpecialChar ~ 7464*0c56280aSSorin Basca\SpecialChar ~ 7465*0c56280aSSorin Basca\SpecialChar ~ 7466*0c56280aSSorin Basca; address 04 onto stack. 7467*0c56280aSSorin Basca\layout Standard 7468*0c56280aSSorin Basca 7469*0c56280aSSorin Basca 7470*0c56280aSSorin Basca\family typewriter 7471*0c56280aSSorin Basca04 return\SpecialChar ~ 7472*0c56280aSSorin Basca\SpecialChar ~ 7473*0c56280aSSorin Basca\SpecialChar ~ 7474*0c56280aSSorin Basca; Leave the method. 7475*0c56280aSSorin Basca\layout Standard 7476*0c56280aSSorin Basca 7477*0c56280aSSorin Basca 7478*0c56280aSSorin Basca\family typewriter 7479*0c56280aSSorin Basca05 dup\SpecialChar ~ 7480*0c56280aSSorin Basca\SpecialChar ~ 7481*0c56280aSSorin Basca\SpecialChar ~ 7482*0c56280aSSorin Basca\SpecialChar ~ 7483*0c56280aSSorin Basca\SpecialChar ~ 7484*0c56280aSSorin Basca\SpecialChar ~ 7485*0c56280aSSorin Basca; Duplicate the stack's top. 7486*0c56280aSSorin Basca\layout Standard 7487*0c56280aSSorin Basca 7488*0c56280aSSorin Basca 7489*0c56280aSSorin Basca\family typewriter 7490*0c56280aSSorin Basca06 astore\SpecialChar ~ 7491*0c56280aSSorin Basca0\SpecialChar ~ 7492*0c56280aSSorin Basca; Store the return address from the stack into 7493*0c56280aSSorin Basca\layout Standard 7494*0c56280aSSorin Basca 7495*0c56280aSSorin Basca 7496*0c56280aSSorin Basca\family typewriter 7497*0c56280aSSorin Basca\SpecialChar ~ 7498*0c56280aSSorin Basca\SpecialChar ~ 7499*0c56280aSSorin Basca\SpecialChar ~ 7500*0c56280aSSorin Basca\SpecialChar ~ 7501*0c56280aSSorin Basca\SpecialChar ~ 7502*0c56280aSSorin Basca\SpecialChar ~ 7503*0c56280aSSorin Basca\SpecialChar ~ 7504*0c56280aSSorin Basca\SpecialChar ~ 7505*0c56280aSSorin Basca\SpecialChar ~ 7506*0c56280aSSorin Basca\SpecialChar ~ 7507*0c56280aSSorin Basca\SpecialChar ~ 7508*0c56280aSSorin Basca\SpecialChar ~ 7509*0c56280aSSorin Basca; local variable 0. 7510*0c56280aSSorin Basca\layout Standard 7511*0c56280aSSorin Basca 7512*0c56280aSSorin Basca 7513*0c56280aSSorin Basca\family typewriter 7514*0c56280aSSorin Basca07 astore\SpecialChar ~ 7515*0c56280aSSorin Basca1\SpecialChar ~ 7516*0c56280aSSorin Basca; Store the return address from the stack into 7517*0c56280aSSorin Basca\layout Standard 7518*0c56280aSSorin Basca 7519*0c56280aSSorin Basca 7520*0c56280aSSorin Basca\family typewriter 7521*0c56280aSSorin Basca\SpecialChar ~ 7522*0c56280aSSorin Basca\SpecialChar ~ 7523*0c56280aSSorin Basca\SpecialChar ~ 7524*0c56280aSSorin Basca\SpecialChar ~ 7525*0c56280aSSorin Basca\SpecialChar ~ 7526*0c56280aSSorin Basca\SpecialChar ~ 7527*0c56280aSSorin Basca\SpecialChar ~ 7528*0c56280aSSorin Basca\SpecialChar ~ 7529*0c56280aSSorin Basca\SpecialChar ~ 7530*0c56280aSSorin Basca\SpecialChar ~ 7531*0c56280aSSorin Basca\SpecialChar ~ 7532*0c56280aSSorin Basca\SpecialChar ~ 7533*0c56280aSSorin Basca; local variable 1. 7534*0c56280aSSorin Basca\layout Standard 7535*0c56280aSSorin Basca 7536*0c56280aSSorin Basca 7537*0c56280aSSorin Basca\family typewriter 7538*0c56280aSSorin Basca08 ifeq\SpecialChar ~ 7539*0c56280aSSorin Basca12\SpecialChar ~ 7540*0c56280aSSorin Basca\SpecialChar ~ 7541*0c56280aSSorin Basca; If there is a 0 on top of the stack, jump to 7542*0c56280aSSorin Basca\layout Standard 7543*0c56280aSSorin Basca 7544*0c56280aSSorin Basca 7545*0c56280aSSorin Basca\family typewriter 7546*0c56280aSSorin Basca\SpecialChar ~ 7547*0c56280aSSorin Basca\SpecialChar ~ 7548*0c56280aSSorin Basca\SpecialChar ~ 7549*0c56280aSSorin Basca\SpecialChar ~ 7550*0c56280aSSorin Basca\SpecialChar ~ 7551*0c56280aSSorin Basca\SpecialChar ~ 7552*0c56280aSSorin Basca\SpecialChar ~ 7553*0c56280aSSorin Basca\SpecialChar ~ 7554*0c56280aSSorin Basca\SpecialChar ~ 7555*0c56280aSSorin Basca\SpecialChar ~ 7556*0c56280aSSorin Basca\SpecialChar ~ 7557*0c56280aSSorin Basca\SpecialChar ~ 7558*0c56280aSSorin Basca; offset 12. 7559*0c56280aSSorin Basca\layout Standard 7560*0c56280aSSorin Basca 7561*0c56280aSSorin Basca 7562*0c56280aSSorin Basca\family typewriter 7563*0c56280aSSorin Basca11 ret\SpecialChar ~ 7564*0c56280aSSorin Basca0\SpecialChar ~ 7565*0c56280aSSorin Basca\SpecialChar ~ 7566*0c56280aSSorin Basca\SpecialChar ~ 7567*0c56280aSSorin Basca\SpecialChar ~ 7568*0c56280aSSorin Basca; Return to offset 4 (because this is in local 7569*0c56280aSSorin Basca\layout Standard 7570*0c56280aSSorin Basca 7571*0c56280aSSorin Basca 7572*0c56280aSSorin Basca\family typewriter 7573*0c56280aSSorin Basca\SpecialChar ~ 7574*0c56280aSSorin Basca\SpecialChar ~ 7575*0c56280aSSorin Basca\SpecialChar ~ 7576*0c56280aSSorin Basca\SpecialChar ~ 7577*0c56280aSSorin Basca\SpecialChar ~ 7578*0c56280aSSorin Basca\SpecialChar ~ 7579*0c56280aSSorin Basca\SpecialChar ~ 7580*0c56280aSSorin Basca\SpecialChar ~ 7581*0c56280aSSorin Basca\SpecialChar ~ 7582*0c56280aSSorin Basca\SpecialChar ~ 7583*0c56280aSSorin Basca\SpecialChar ~ 7584*0c56280aSSorin Basca\SpecialChar ~ 7585*0c56280aSSorin Basca; variable 0 here). 7586*0c56280aSSorin Basca\layout Standard 7587*0c56280aSSorin Basca 7588*0c56280aSSorin Basca 7589*0c56280aSSorin Basca\family typewriter 7590*0c56280aSSorin Basca12 nop\SpecialChar ~ 7591*0c56280aSSorin Basca\SpecialChar ~ 7592*0c56280aSSorin Basca\SpecialChar ~ 7593*0c56280aSSorin Basca\SpecialChar ~ 7594*0c56280aSSorin Basca\SpecialChar ~ 7595*0c56280aSSorin Basca\SpecialChar ~ 7596*0c56280aSSorin Basca; No operation. 7597*0c56280aSSorin Basca\layout Standard 7598*0c56280aSSorin Basca 7599*0c56280aSSorin Basca 7600*0c56280aSSorin Basca\family typewriter 7601*0c56280aSSorin Basca13 ret\SpecialChar ~ 7602*0c56280aSSorin Basca1\SpecialChar ~ 7603*0c56280aSSorin Basca\SpecialChar ~ 7604*0c56280aSSorin Basca\SpecialChar ~ 7605*0c56280aSSorin Basca\SpecialChar ~ 7606*0c56280aSSorin Basca; Return to offset 4 (because this is in local 7607*0c56280aSSorin Basca\layout Standard 7608*0c56280aSSorin Basca 7609*0c56280aSSorin Basca 7610*0c56280aSSorin Basca\family typewriter 7611*0c56280aSSorin Basca\SpecialChar ~ 7612*0c56280aSSorin Basca\SpecialChar ~ 7613*0c56280aSSorin Basca\SpecialChar ~ 7614*0c56280aSSorin Basca\SpecialChar ~ 7615*0c56280aSSorin Basca\SpecialChar ~ 7616*0c56280aSSorin Basca\SpecialChar ~ 7617*0c56280aSSorin Basca\SpecialChar ~ 7618*0c56280aSSorin Basca\SpecialChar ~ 7619*0c56280aSSorin Basca\SpecialChar ~ 7620*0c56280aSSorin Basca\SpecialChar ~ 7621*0c56280aSSorin Basca\SpecialChar ~ 7622*0c56280aSSorin Basca\SpecialChar ~ 7623*0c56280aSSorin Basca; variable 1 here). 7624*0c56280aSSorin Basca\end_float 7625*0c56280aSSorin Basca\layout Standard 7626*0c56280aSSorin Basca 7627*0c56280aSSorin BascaDo we deal with one subroutine (which is the case if you define subroutines 7628*0c56280aSSorin Basca to start with a 7629*0c56280aSSorin Basca\latex latex 7630*0c56280aSSorin Basca 7631*0c56280aSSorin Basca\backslash 7632*0c56280aSSorin Bascatexttt{jsr} 7633*0c56280aSSorin Basca\latex default 7634*0c56280aSSorin Basca or 7635*0c56280aSSorin Basca\latex latex 7636*0c56280aSSorin Basca 7637*0c56280aSSorin Basca\backslash 7638*0c56280aSSorin Bascatexttt{jsr 7639*0c56280aSSorin Basca\backslash 7640*0c56280aSSorin Basca_w} 7641*0c56280aSSorin Basca\latex default 7642*0c56280aSSorin Basca's target) or are these two subroutines (which is the case if you count 7643*0c56280aSSorin Basca the 7644*0c56280aSSorin Basca\latex latex 7645*0c56280aSSorin Basca 7646*0c56280aSSorin Basca\backslash 7647*0c56280aSSorin Bascatexttt{ret} 7648*0c56280aSSorin Basca\latex default 7649*0c56280aSSorin Basca instructions and believe that there must be exactly one 7650*0c56280aSSorin Basca\latex latex 7651*0c56280aSSorin Basca 7652*0c56280aSSorin Basca\backslash 7653*0c56280aSSorin Bascatexttt{ret} 7654*0c56280aSSorin Basca\latex default 7655*0c56280aSSorin Basca per subroutine)? 7656*0c56280aSSorin Basca\layout Standard 7657*0c56280aSSorin Basca 7658*0c56280aSSorin BascaRecursive calls to subroutines are forbidden by the specification; however, 7659*0c56280aSSorin Basca Sun's verifier implementations are not consequently deciding which recursive 7660*0c56280aSSorin Basca calls to reject 7661*0c56280aSSorin Basca\begin_float footnote 7662*0c56280aSSorin Basca\layout Standard 7663*0c56280aSSorin Basca 7664*0c56280aSSorin BascaThis was experimentally found by the author and also published in 7665*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JBook} 7666*0c56280aSSorin Basca 7667*0c56280aSSorin Basca\end_inset 7668*0c56280aSSorin Basca 7669*0c56280aSSorin Basca. 7670*0c56280aSSorin Basca\end_float 7671*0c56280aSSorin Basca. 7672*0c56280aSSorin Basca This is a failure due to a missing definition of the term 7673*0c56280aSSorin Basca\emph on 7674*0c56280aSSorin Bascasubroutine 7675*0c56280aSSorin Basca\emph default 7676*0c56280aSSorin Basca. 7677*0c56280aSSorin Basca\layout Standard 7678*0c56280aSSorin Basca 7679*0c56280aSSorin BascaWhile the first example passes Sun's verifier, the second example is rejected. 7680*0c56280aSSorin Basca The exact definition of the term 7681*0c56280aSSorin Basca\emph on 7682*0c56280aSSorin Bascasubroutine 7683*0c56280aSSorin Basca\emph default 7684*0c56280aSSorin Basca cannot be deducted from ther behaviour of Sun's verifier. 7685*0c56280aSSorin Basca\layout Standard 7686*0c56280aSSorin Basca 7687*0c56280aSSorin BascaA new, clean specification had to be defined. 7688*0c56280aSSorin Basca Such a specification can of course not be compatible with the behaviour 7689*0c56280aSSorin Basca of Sun's verifier in all corner cases. 7690*0c56280aSSorin Basca\layout Subsubsection 7691*0c56280aSSorin Basca 7692*0c56280aSSorin Basca 7693*0c56280aSSorin Basca\begin_inset LatexCommand \label{Subroutines_Def} 7694*0c56280aSSorin Basca 7695*0c56280aSSorin Basca\end_inset 7696*0c56280aSSorin Basca 7697*0c56280aSSorin BascaA Precise Definition of the Term 7698*0c56280aSSorin Basca\emph on 7699*0c56280aSSorin BascaSubroutine 7700*0c56280aSSorin Basca\layout Standard 7701*0c56280aSSorin Basca 7702*0c56280aSSorin BascaBecause Sun --inappropriately-- describes how 7703*0c56280aSSorin Basca\emph on 7704*0c56280aSSorin Bascajavac 7705*0c56280aSSorin Basca\emph default 7706*0c56280aSSorin Basca creates subroutines, the definition presented here is based on the observation 7707*0c56280aSSorin Basca of 7708*0c56280aSSorin Basca\emph on 7709*0c56280aSSorin Bascajavac 7710*0c56280aSSorin Basca\emph default 7711*0c56280aSSorin Basca's behaviour. 7712*0c56280aSSorin Basca This makes the definition compatible with a lot of existing code, but without 7713*0c56280aSSorin Basca violating the validity of far-reaching conclusions earned by exploiting 7714*0c56280aSSorin Basca a clean definition 7715*0c56280aSSorin Basca\begin_float footnote 7716*0c56280aSSorin Basca\layout Standard 7717*0c56280aSSorin Basca 7718*0c56280aSSorin BascaUnfortunately, in some rare cases, 7719*0c56280aSSorin Basca\emph on 7720*0c56280aSSorin Bascajavac 7721*0c56280aSSorin Basca\emph default 7722*0c56280aSSorin Basca produces code that is incompatible with the constraints related to our 7723*0c56280aSSorin Basca definition of 7724*0c56280aSSorin Basca\emph on 7725*0c56280aSSorin Bascasubroutine 7726*0c56280aSSorin Basca\emph default 7727*0c56280aSSorin Basca. 7728*0c56280aSSorin Basca However, 7729*0c56280aSSorin Basca\emph on 7730*0c56280aSSorin Bascajavac 7731*0c56280aSSorin Basca\emph default 7732*0c56280aSSorin Basca also produces code which is incompatible with Sun's verifier (see section 7733*0c56280aSSorin Basca 7734*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StaerkJreject} 7735*0c56280aSSorin Basca 7736*0c56280aSSorin Basca\end_inset 7737*0c56280aSSorin Basca 7738*0c56280aSSorin Basca). 7739*0c56280aSSorin Basca\end_float 7740*0c56280aSSorin Basca. 7741*0c56280aSSorin Basca 7742*0c56280aSSorin Basca\layout Itemize 7743*0c56280aSSorin Basca 7744*0c56280aSSorin BascaEvery instruction of a method is part of exactly one subroutine (or the 7745*0c56280aSSorin Basca top-level). 7746*0c56280aSSorin Basca\layout Itemize 7747*0c56280aSSorin Basca 7748*0c56280aSSorin BascaThe first instruction of a subroutine is an 7749*0c56280aSSorin Basca\latex latex 7750*0c56280aSSorin Basca 7751*0c56280aSSorin Basca\backslash 7752*0c56280aSSorin Bascatexttt{astore N} 7753*0c56280aSSorin Basca\latex default 7754*0c56280aSSorin Basca instruction that stores the return address in local variable number 7755*0c56280aSSorin Basca\emph on 7756*0c56280aSSorin BascaN 7757*0c56280aSSorin Basca\emph default 7758*0c56280aSSorin Basca. 7759*0c56280aSSorin Basca\layout Itemize 7760*0c56280aSSorin Basca 7761*0c56280aSSorin BascaThere must be exactly one 7762*0c56280aSSorin Basca\latex latex 7763*0c56280aSSorin Basca 7764*0c56280aSSorin Basca\backslash 7765*0c56280aSSorin Bascatexttt{ret} 7766*0c56280aSSorin Basca\latex default 7767*0c56280aSSorin Basca instruction per subroutine. 7768*0c56280aSSorin Basca This instruction must work on the local variable 7769*0c56280aSSorin Basca\emph on 7770*0c56280aSSorin BascaN 7771*0c56280aSSorin Basca\emph default 7772*0c56280aSSorin Basca; i.e., it is a 7773*0c56280aSSorin Basca\latex latex 7774*0c56280aSSorin Basca 7775*0c56280aSSorin Basca\backslash 7776*0c56280aSSorin Bascatexttt{ret N} 7777*0c56280aSSorin Basca\latex default 7778*0c56280aSSorin Basca instruction. 7779*0c56280aSSorin Basca\layout Itemize 7780*0c56280aSSorin Basca 7781*0c56280aSSorin BascaSubroutines are not protected by exception handlers. 7782*0c56280aSSorin Basca\layout Itemize 7783*0c56280aSSorin Basca 7784*0c56280aSSorin BascaNo instruction that is part of a subroutine is the target of an exception 7785*0c56280aSSorin Basca handler. 7786*0c56280aSSorin Basca\layout Itemize 7787*0c56280aSSorin Basca 7788*0c56280aSSorin BascaSubroutines of a subroutine do not access local variable 7789*0c56280aSSorin Basca\emph on 7790*0c56280aSSorin BascaN 7791*0c56280aSSorin Basca\emph default 7792*0c56280aSSorin Basca. 7793*0c56280aSSorin Basca A subsubroutine of a subroutine is also considered a subroutine here, in 7794*0c56280aSSorin Basca a recursive sense. 7795*0c56280aSSorin Basca\layout Standard 7796*0c56280aSSorin Basca 7797*0c56280aSSorin BascaAs we can see, a subroutine can be characterized by its set of instructions, 7798*0c56280aSSorin Basca the most important instruction being the target of some 7799*0c56280aSSorin Basca\latex latex 7800*0c56280aSSorin Basca 7801*0c56280aSSorin Basca\backslash 7802*0c56280aSSorin Bascatexttt{jsr} 7803*0c56280aSSorin Basca\latex default 7804*0c56280aSSorin Basca or 7805*0c56280aSSorin Basca\latex latex 7806*0c56280aSSorin Basca 7807*0c56280aSSorin Basca\backslash 7808*0c56280aSSorin Bascatexttt{jsr 7809*0c56280aSSorin Basca\backslash 7810*0c56280aSSorin Basca_w} 7811*0c56280aSSorin Basca\latex default 7812*0c56280aSSorin Basca instruction that is not part of the subroutine itself. 7813*0c56280aSSorin Basca Another important property is the local variable 7814*0c56280aSSorin Basca\emph on 7815*0c56280aSSorin BascaN 7816*0c56280aSSorin Basca\emph default 7817*0c56280aSSorin Basca the 7818*0c56280aSSorin Basca\latex latex 7819*0c56280aSSorin Basca 7820*0c56280aSSorin Basca\backslash 7821*0c56280aSSorin Bascatexttt{ret} 7822*0c56280aSSorin Basca\latex default 7823*0c56280aSSorin Basca instruction is working on. 7824*0c56280aSSorin Basca\layout Standard 7825*0c56280aSSorin Basca 7826*0c56280aSSorin BascaThis way, we can make sure subroutines are properly nested, so that JustIce 7827*0c56280aSSorin Basca would reject both the example bytecodes in algorithms 7828*0c56280aSSorin Basca\begin_inset LatexCommand \ref{jsrpopalgo} 7829*0c56280aSSorin Basca 7830*0c56280aSSorin Basca\end_inset 7831*0c56280aSSorin Basca 7832*0c56280aSSorin Basca and 7833*0c56280aSSorin Basca\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7834*0c56280aSSorin Basca 7835*0c56280aSSorin Basca\end_inset 7836*0c56280aSSorin Basca 7837*0c56280aSSorin Basca. 7838*0c56280aSSorin Basca\layout Standard 7839*0c56280aSSorin Basca 7840*0c56280aSSorin BascaThe 7841*0c56280aSSorin Basca\latex latex 7842*0c56280aSSorin Basca 7843*0c56280aSSorin Basca\backslash 7844*0c56280aSSorin Bascatexttt{astore} 7845*0c56280aSSorin Basca\latex default 7846*0c56280aSSorin Basca instruction mentioned above is so important because there is no JVM instruction 7847*0c56280aSSorin Basca that can read values of a 7848*0c56280aSSorin Basca\latex latex 7849*0c56280aSSorin Basca 7850*0c56280aSSorin Basca\backslash 7851*0c56280aSSorin Bascatexttt{returnaddress} 7852*0c56280aSSorin Basca\latex default 7853*0c56280aSSorin Basca type from local variables. 7854*0c56280aSSorin Basca After entering a subroutine, the 7855*0c56280aSSorin Basca\latex latex 7856*0c56280aSSorin Basca 7857*0c56280aSSorin Basca\backslash 7858*0c56280aSSorin Bascatexttt{astore} 7859*0c56280aSSorin Basca\latex default 7860*0c56280aSSorin Basca instruction pops the return address off the operand stack and writes it 7861*0c56280aSSorin Basca into local variable number 7862*0c56280aSSorin Basca\emph on 7863*0c56280aSSorin BascaN 7864*0c56280aSSorin Basca\emph default 7865*0c56280aSSorin Basca. 7866*0c56280aSSorin Basca Therefore we can be sure it will not be duplicated or deleted as in algorithms 7867*0c56280aSSorin Basca 7868*0c56280aSSorin Basca\begin_inset LatexCommand \ref{jsrpopalgo} 7869*0c56280aSSorin Basca 7870*0c56280aSSorin Basca\end_inset 7871*0c56280aSSorin Basca 7872*0c56280aSSorin Basca and 7873*0c56280aSSorin Basca\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7874*0c56280aSSorin Basca 7875*0c56280aSSorin Basca\end_inset 7876*0c56280aSSorin Basca 7877*0c56280aSSorin Basca. 7878*0c56280aSSorin Basca\layout Standard 7879*0c56280aSSorin Basca 7880*0c56280aSSorin BascaThe constraints concerning exception handlers are defined to make sure that 7881*0c56280aSSorin Basca we can observe the control flow statically. 7882*0c56280aSSorin Basca If an exception is thrown from within a subroutine, the method simply 7883*0c56280aSSorin Basca\begin_inset Quotes eld 7884*0c56280aSSorin Basca\end_inset 7885*0c56280aSSorin Basca 7886*0c56280aSSorin Basca 7887*0c56280aSSorin Basca\emph on 7888*0c56280aSSorin Bascacompletes abruptly 7889*0c56280aSSorin Basca\emph default 7890*0c56280aSSorin Basca 7891*0c56280aSSorin Basca\begin_inset Quotes erd 7892*0c56280aSSorin Basca\end_inset 7893*0c56280aSSorin Basca 7894*0c56280aSSorin Basca ( 7895*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 7896*0c56280aSSorin Basca 7897*0c56280aSSorin Basca\end_inset 7898*0c56280aSSorin Basca 7899*0c56280aSSorin Basca, page 74). 7900*0c56280aSSorin Basca If we would allow subroutine instructions to be protected by exception 7901*0c56280aSSorin Basca handlers, it would not be clear if the handling instructions are part of 7902*0c56280aSSorin Basca the subroutine or not. 7903*0c56280aSSorin Basca\layout Standard 7904*0c56280aSSorin Basca 7905*0c56280aSSorin BascaWe can also derive subsubroutines of subroutines recursively by exploiting 7906*0c56280aSSorin Basca the properly-nested property explained above. 7907*0c56280aSSorin Basca\layout Subsubsection 7908*0c56280aSSorin Basca 7909*0c56280aSSorin BascaThe Control Flow Graph 7910*0c56280aSSorin Basca\layout Standard 7911*0c56280aSSorin Basca 7912*0c56280aSSorin BascaA control flow graph is a directed graph with edges that represent possible 7913*0c56280aSSorin Basca branches of control flow. 7914*0c56280aSSorin Basca Similarly, the nodes describe groups of physically adjacent instructions 7915*0c56280aSSorin Basca that have to be executed one after another -- without any possible control 7916*0c56280aSSorin Basca flow branch to another instruction but the physical successor 7917*0c56280aSSorin Basca\begin_float footnote 7918*0c56280aSSorin Basca\layout Standard 7919*0c56280aSSorin Basca 7920*0c56280aSSorin BascaMore information about control flow graphs can be found in 7921*0c56280aSSorin Basca\begin_inset LatexCommand \cite{DragonBook} 7922*0c56280aSSorin Basca 7923*0c56280aSSorin Basca\end_inset 7924*0c56280aSSorin Basca 7925*0c56280aSSorin Basca. 7926*0c56280aSSorin Basca\end_float 7927*0c56280aSSorin Basca. 7928*0c56280aSSorin Basca Figure 7929*0c56280aSSorin Basca\begin_inset LatexCommand \ref{convcfg} 7930*0c56280aSSorin Basca 7931*0c56280aSSorin Basca\end_inset 7932*0c56280aSSorin Basca 7933*0c56280aSSorin Basca shows such a control flow graph for algorithm 7934*0c56280aSSorin Basca\begin_inset LatexCommand \ref{facjavabytecode} 7935*0c56280aSSorin Basca 7936*0c56280aSSorin Basca\end_inset 7937*0c56280aSSorin Basca 7938*0c56280aSSorin Basca, the implementation of the faculty function discussed earlier. 7939*0c56280aSSorin Basca\layout Standard 7940*0c56280aSSorin Basca 7941*0c56280aSSorin Basca\begin_float fig 7942*0c56280aSSorin Basca\layout Standard 7943*0c56280aSSorin Basca\align center 7944*0c56280aSSorin Basca 7945*0c56280aSSorin Basca\begin_inset Figure size 595 368 7946*0c56280aSSorin Bascafile conventcfg.eps 7947*0c56280aSSorin Bascawidth 3 100 7948*0c56280aSSorin Bascaflags 9 7949*0c56280aSSorin Basca 7950*0c56280aSSorin Basca\end_inset 7951*0c56280aSSorin Basca 7952*0c56280aSSorin Basca 7953*0c56280aSSorin Basca\layout Caption 7954*0c56280aSSorin Basca 7955*0c56280aSSorin Basca 7956*0c56280aSSorin Basca\begin_inset LatexCommand \label{convcfg} 7957*0c56280aSSorin Basca 7958*0c56280aSSorin Basca\end_inset 7959*0c56280aSSorin Basca 7960*0c56280aSSorin BascaA Conventional Control Flow Graph 7961*0c56280aSSorin Basca\end_float 7962*0c56280aSSorin Basca\layout Standard 7963*0c56280aSSorin Basca 7964*0c56280aSSorin BascaThe JVM defines a sort of control flow orthogonal to the common execution 7965*0c56280aSSorin Basca of instructions, namely, the exception mechanism. 7966*0c56280aSSorin Basca Because every instruction could possibly throw an exception (say, a 7967*0c56280aSSorin Basca\family typewriter 7968*0c56280aSSorin Bascajava.lang.VirtualMachineError 7969*0c56280aSSorin Basca\family default 7970*0c56280aSSorin Basca) during its execution, the control flow graph calculated by JustIce always 7971*0c56280aSSorin Basca uses only one instruction per node. 7972*0c56280aSSorin Basca This also reflects the original verification algorithm given by Sun Microsystem 7973*0c56280aSSorin Bascas. 7974*0c56280aSSorin Basca Figure 7975*0c56280aSSorin Basca\begin_inset LatexCommand \ref{justicecfg} 7976*0c56280aSSorin Basca 7977*0c56280aSSorin Basca\end_inset 7978*0c56280aSSorin Basca 7979*0c56280aSSorin Basca shows an example for such a control flow graph. 7980*0c56280aSSorin Basca\layout Standard 7981*0c56280aSSorin Basca 7982*0c56280aSSorin Basca\begin_float fig 7983*0c56280aSSorin Basca\layout Standard 7984*0c56280aSSorin Basca\align center 7985*0c56280aSSorin Basca 7986*0c56280aSSorin Basca\begin_inset Figure size 595 473 7987*0c56280aSSorin Bascafile justicecfg.eps 7988*0c56280aSSorin Bascawidth 3 100 7989*0c56280aSSorin Bascaflags 9 7990*0c56280aSSorin Basca 7991*0c56280aSSorin Basca\end_inset 7992*0c56280aSSorin Basca 7993*0c56280aSSorin Basca 7994*0c56280aSSorin Basca\layout Caption 7995*0c56280aSSorin Basca 7996*0c56280aSSorin Basca 7997*0c56280aSSorin Basca\begin_inset LatexCommand \label{justicecfg} 7998*0c56280aSSorin Basca 7999*0c56280aSSorin Basca\end_inset 8000*0c56280aSSorin Basca 8001*0c56280aSSorin BascaA Control Flow Graph as Used by JustIce 8002*0c56280aSSorin Basca\end_float 8003*0c56280aSSorin Basca\layout Standard 8004*0c56280aSSorin Basca 8005*0c56280aSSorin BascaInstruction nodes are augmented with a data structure that represents the 8006*0c56280aSSorin Basca simulated operand stack and the simulated local variables array. 8007*0c56280aSSorin Basca When running the core verification algorithm, these nodes are put into 8008*0c56280aSSorin Basca a queue which is equivalent to tagging them with a 8009*0c56280aSSorin Basca\emph on 8010*0c56280aSSorin Bascachanged 8011*0c56280aSSorin Basca\emph default 8012*0c56280aSSorin Basca bit as Sun describes 8013*0c56280aSSorin Basca\begin_float footnote 8014*0c56280aSSorin Basca\layout Standard 8015*0c56280aSSorin Basca 8016*0c56280aSSorin BascaAs explained later, JustIce uses a queue that allows duplicates: this is 8017*0c56280aSSorin Basca a slight semantical change. 8018*0c56280aSSorin Basca\end_float 8019*0c56280aSSorin Basca. 8020*0c56280aSSorin Basca\layout Subsubsection 8021*0c56280aSSorin Basca 8022*0c56280aSSorin BascaSubroutines Revisited: Interplay With the Data Flow Analyzer 8023*0c56280aSSorin Basca\layout Standard 8024*0c56280aSSorin Basca 8025*0c56280aSSorin BascaThere is another problem concerning subroutines. 8026*0c56280aSSorin Basca Normally, when merging the type information of two simulated local variables, 8027*0c56280aSSorin Basca the common type is recorded as 8028*0c56280aSSorin Basca\emph on 8029*0c56280aSSorin Bascaunusable 8030*0c56280aSSorin Basca\emph default 8031*0c56280aSSorin Basca if the types differ. 8032*0c56280aSSorin Basca This 8033*0c56280aSSorin Basca\emph on 8034*0c56280aSSorin Bascaunusable 8035*0c56280aSSorin Basca\emph default 8036*0c56280aSSorin Basca value is then propagated to subsequent instructions to prevent read access. 8037*0c56280aSSorin Basca\layout Standard 8038*0c56280aSSorin Basca 8039*0c56280aSSorin BascaThis is not the case with the successors of the 8040*0c56280aSSorin Basca\latex latex 8041*0c56280aSSorin Basca 8042*0c56280aSSorin Basca\backslash 8043*0c56280aSSorin Bascatexttt{ret} 8044*0c56280aSSorin Basca\latex default 8045*0c56280aSSorin Basca instruction. 8046*0c56280aSSorin Basca These successors are physical successors of some 8047*0c56280aSSorin Basca\latex latex 8048*0c56280aSSorin Basca 8049*0c56280aSSorin Basca\backslash 8050*0c56280aSSorin Bascatexttt{jsr} 8051*0c56280aSSorin Basca\latex default 8052*0c56280aSSorin Basca or 8053*0c56280aSSorin Basca\latex latex 8054*0c56280aSSorin Basca 8055*0c56280aSSorin Basca\backslash 8056*0c56280aSSorin Bascatexttt{jsr 8057*0c56280aSSorin Basca\backslash 8058*0c56280aSSorin Basca_w} 8059*0c56280aSSorin Basca\latex default 8060*0c56280aSSorin Basca instructions. 8061*0c56280aSSorin Basca\layout Standard 8062*0c56280aSSorin Basca 8063*0c56280aSSorin BascaSubroutines are said to be 8064*0c56280aSSorin Basca\emph on 8065*0c56280aSSorin Bascapolymorphic 8066*0c56280aSSorin Basca\emph default 8067*0c56280aSSorin Basca with respect to their local variables arrays. 8068*0c56280aSSorin Basca As an example, consider algorithm 8069*0c56280aSSorin Basca\begin_inset LatexCommand \ref{lvpolymorphalgo} 8070*0c56280aSSorin Basca 8071*0c56280aSSorin Basca\end_inset 8072*0c56280aSSorin Basca 8073*0c56280aSSorin Basca. 8074*0c56280aSSorin Basca This algorithm shows legal JVM code. 8075*0c56280aSSorin Basca In line 11, local variable 0 may contain a value of the 8076*0c56280aSSorin Basca\family typewriter 8077*0c56280aSSorin Bascainteger 8078*0c56280aSSorin Basca\family default 8079*0c56280aSSorin Basca or the 8080*0c56280aSSorin Basca\family typewriter 8081*0c56280aSSorin Bascafloat 8082*0c56280aSSorin Basca\family default 8083*0c56280aSSorin Basca type; depending on the 8084*0c56280aSSorin Basca\latex latex 8085*0c56280aSSorin Basca 8086*0c56280aSSorin Basca\backslash 8087*0c56280aSSorin Bascatexttt{jsr} 8088*0c56280aSSorin Basca\latex default 8089*0c56280aSSorin Basca instruction that entered the subroutine. 8090*0c56280aSSorin Basca Normally, this would cause the verifier to mark local variable 0 as 8091*0c56280aSSorin Basca\emph on 8092*0c56280aSSorin Bascaunusable 8093*0c56280aSSorin Basca\emph default 8094*0c56280aSSorin Bascaand propagate this information. 8095*0c56280aSSorin Basca The successors of the 8096*0c56280aSSorin Basca\latex latex 8097*0c56280aSSorin Basca 8098*0c56280aSSorin Basca\backslash 8099*0c56280aSSorin Bascatexttt{ret} 8100*0c56280aSSorin Basca\latex default 8101*0c56280aSSorin Basca instruction are the instructions in lines 5 and 10. 8102*0c56280aSSorin Basca However, a correct verifier does 8103*0c56280aSSorin Basca\emph on 8104*0c56280aSSorin Bascanot 8105*0c56280aSSorin Basca\emph default 8106*0c56280aSSorin Basca mark local variable 0 as 8107*0c56280aSSorin Basca\emph on 8108*0c56280aSSorin Bascaunusable 8109*0c56280aSSorin Basca\emph default 8110*0c56280aSSorin Basca for them, because the local variable 0 was not accessed or modified in 8111*0c56280aSSorin Basca the subroutine. 8112*0c56280aSSorin Basca\layout Standard 8113*0c56280aSSorin Basca 8114*0c56280aSSorin Basca\begin_float alg 8115*0c56280aSSorin Basca\layout Caption 8116*0c56280aSSorin Basca 8117*0c56280aSSorin Basca 8118*0c56280aSSorin Basca\begin_inset LatexCommand \label{lvpolymorphalgo} 8119*0c56280aSSorin Basca 8120*0c56280aSSorin Basca\end_inset 8121*0c56280aSSorin Basca 8122*0c56280aSSorin BascaLocal Variables are Polymorphic in Subroutines 8123*0c56280aSSorin Basca\layout Standard 8124*0c56280aSSorin Basca 8125*0c56280aSSorin Basca 8126*0c56280aSSorin Basca\family typewriter 8127*0c56280aSSorin Basca0 : iconst_0\SpecialChar ~ 8128*0c56280aSSorin Basca\SpecialChar ~ 8129*0c56280aSSorin Basca\SpecialChar ~ 8130*0c56280aSSorin Basca; load integer constant 0 onto stack 8131*0c56280aSSorin Basca\layout Standard 8132*0c56280aSSorin Basca 8133*0c56280aSSorin Basca 8134*0c56280aSSorin Basca\family typewriter 8135*0c56280aSSorin Basca1 : istore 0\SpecialChar ~ 8136*0c56280aSSorin Basca\SpecialChar ~ 8137*0c56280aSSorin Basca\SpecialChar ~ 8138*0c56280aSSorin Basca; move it into local variable 0 8139*0c56280aSSorin Basca\layout Standard 8140*0c56280aSSorin Basca 8141*0c56280aSSorin Basca 8142*0c56280aSSorin Basca\family typewriter 8143*0c56280aSSorin Basca2 : jsr 11\SpecialChar ~ 8144*0c56280aSSorin Basca\SpecialChar ~ 8145*0c56280aSSorin Basca\SpecialChar ~ 8146*0c56280aSSorin Basca\SpecialChar ~ 8147*0c56280aSSorin Basca\SpecialChar ~ 8148*0c56280aSSorin Basca; enter subroutine 8149*0c56280aSSorin Basca\layout Standard 8150*0c56280aSSorin Basca 8151*0c56280aSSorin Basca 8152*0c56280aSSorin Basca\family typewriter 8153*0c56280aSSorin Basca5 : fconst 0.0\SpecialChar ~ 8154*0c56280aSSorin Basca; load float constant 0.0 onto stack 8155*0c56280aSSorin Basca\layout Standard 8156*0c56280aSSorin Basca 8157*0c56280aSSorin Basca 8158*0c56280aSSorin Basca\family typewriter 8159*0c56280aSSorin Basca6 : fstore 0\SpecialChar ~ 8160*0c56280aSSorin Basca\SpecialChar ~ 8161*0c56280aSSorin Basca\SpecialChar ~ 8162*0c56280aSSorin Basca; move it into local variable 0 8163*0c56280aSSorin Basca\layout Standard 8164*0c56280aSSorin Basca 8165*0c56280aSSorin Basca 8166*0c56280aSSorin Basca\family typewriter 8167*0c56280aSSorin Basca7 : jsr 11\SpecialChar ~ 8168*0c56280aSSorin Basca\SpecialChar ~ 8169*0c56280aSSorin Basca\SpecialChar ~ 8170*0c56280aSSorin Basca\SpecialChar ~ 8171*0c56280aSSorin Basca\SpecialChar ~ 8172*0c56280aSSorin Basca; enter subroutine again 8173*0c56280aSSorin Basca\layout Standard 8174*0c56280aSSorin Basca 8175*0c56280aSSorin Basca 8176*0c56280aSSorin Basca\family typewriter 8177*0c56280aSSorin Basca10: return\SpecialChar ~ 8178*0c56280aSSorin Basca\SpecialChar ~ 8179*0c56280aSSorin Basca\SpecialChar ~ 8180*0c56280aSSorin Basca\SpecialChar ~ 8181*0c56280aSSorin Basca\SpecialChar ~ 8182*0c56280aSSorin Basca; complete method 8183*0c56280aSSorin Basca\layout Standard 8184*0c56280aSSorin Basca 8185*0c56280aSSorin Basca 8186*0c56280aSSorin Basca\family typewriter 8187*0c56280aSSorin Basca11: astore 1\SpecialChar ~ 8188*0c56280aSSorin Basca\SpecialChar ~ 8189*0c56280aSSorin Basca\SpecialChar ~ 8190*0c56280aSSorin Basca; Subroutine entry: move return address 8191*0c56280aSSorin Basca\layout Standard 8192*0c56280aSSorin Basca 8193*0c56280aSSorin Basca 8194*0c56280aSSorin Basca\family typewriter 8195*0c56280aSSorin Basca\SpecialChar ~ 8196*0c56280aSSorin Basca\SpecialChar ~ 8197*0c56280aSSorin Basca\SpecialChar ~ 8198*0c56280aSSorin Basca\SpecialChar ~ 8199*0c56280aSSorin Basca\SpecialChar ~ 8200*0c56280aSSorin Basca\SpecialChar ~ 8201*0c56280aSSorin Basca\SpecialChar ~ 8202*0c56280aSSorin Basca\SpecialChar ~ 8203*0c56280aSSorin Basca\SpecialChar ~ 8204*0c56280aSSorin Basca\SpecialChar ~ 8205*0c56280aSSorin Basca\SpecialChar ~ 8206*0c56280aSSorin Basca\SpecialChar ~ 8207*0c56280aSSorin Basca\SpecialChar ~ 8208*0c56280aSSorin Basca\SpecialChar ~ 8209*0c56280aSSorin Basca\SpecialChar ~ 8210*0c56280aSSorin Basca; into local variable 1 8211*0c56280aSSorin Basca\layout Standard 8212*0c56280aSSorin Basca 8213*0c56280aSSorin Basca 8214*0c56280aSSorin Basca\family typewriter 8215*0c56280aSSorin Basca12: nop\SpecialChar ~ 8216*0c56280aSSorin Basca\SpecialChar ~ 8217*0c56280aSSorin Basca\SpecialChar ~ 8218*0c56280aSSorin Basca\SpecialChar ~ 8219*0c56280aSSorin Basca\SpecialChar ~ 8220*0c56280aSSorin Basca\SpecialChar ~ 8221*0c56280aSSorin Basca\SpecialChar ~ 8222*0c56280aSSorin Basca\SpecialChar ~ 8223*0c56280aSSorin Basca; do nothing 8224*0c56280aSSorin Basca\layout Standard 8225*0c56280aSSorin Basca 8226*0c56280aSSorin Basca 8227*0c56280aSSorin Basca\family typewriter 8228*0c56280aSSorin Basca13: ret 1\SpecialChar ~ 8229*0c56280aSSorin Basca\SpecialChar ~ 8230*0c56280aSSorin Basca\SpecialChar ~ 8231*0c56280aSSorin Basca\SpecialChar ~ 8232*0c56280aSSorin Basca\SpecialChar ~ 8233*0c56280aSSorin Basca\SpecialChar ~ 8234*0c56280aSSorin Basca; return from subroutine 8235*0c56280aSSorin Basca\end_float 8236*0c56280aSSorin Basca\layout Standard 8237*0c56280aSSorin Basca 8238*0c56280aSSorin BascaBasically, only the local variables accessed in the called subroutine (and 8239*0c56280aSSorin Basca the subroutines called from there, recursively) are merged with the correspondi 8240*0c56280aSSorin Bascang successor of a 8241*0c56280aSSorin Basca\latex latex 8242*0c56280aSSorin Basca 8243*0c56280aSSorin Basca\backslash 8244*0c56280aSSorin Bascatexttt{ret} 8245*0c56280aSSorin Basca\latex default 8246*0c56280aSSorin Basca instruction. 8247*0c56280aSSorin Basca This means that in this special case, three sources are used to construct 8248*0c56280aSSorin Basca the merged array of local variables type information (instead of only two): 8249*0c56280aSSorin Basca the 8250*0c56280aSSorin Basca\latex latex 8251*0c56280aSSorin Basca 8252*0c56280aSSorin Basca\backslash 8253*0c56280aSSorin Bascatexttt{jsr} 8254*0c56280aSSorin Basca\latex default 8255*0c56280aSSorin Basca/ 8256*0c56280aSSorin Basca\latex latex 8257*0c56280aSSorin Basca 8258*0c56280aSSorin Basca\backslash 8259*0c56280aSSorin Bascatexttt{jsr 8260*0c56280aSSorin Basca\backslash 8261*0c56280aSSorin Basca_w} 8262*0c56280aSSorin Basca\latex default 8263*0c56280aSSorin Basca instruction, the 8264*0c56280aSSorin Basca\latex latex 8265*0c56280aSSorin Basca 8266*0c56280aSSorin Basca\backslash 8267*0c56280aSSorin Bascatexttt{ret} 8268*0c56280aSSorin Basca\latex default 8269*0c56280aSSorin Basca instruction and the "old" type information of the 8270*0c56280aSSorin Basca\latex latex 8271*0c56280aSSorin Basca 8272*0c56280aSSorin Basca\backslash 8273*0c56280aSSorin Bascatexttt{ret} 8274*0c56280aSSorin Basca\latex default 8275*0c56280aSSorin Basca instruction's target (which is the physical successor of the 8276*0c56280aSSorin Basca\latex latex 8277*0c56280aSSorin Basca 8278*0c56280aSSorin Basca\backslash 8279*0c56280aSSorin Bascatexttt{jsr} 8280*0c56280aSSorin Basca\latex default 8281*0c56280aSSorin Basca/ 8282*0c56280aSSorin Basca\latex latex 8283*0c56280aSSorin Basca 8284*0c56280aSSorin Basca\backslash 8285*0c56280aSSorin Bascatexttt{jsr 8286*0c56280aSSorin Basca\backslash 8287*0c56280aSSorin Basca_w} 8288*0c56280aSSorin Basca\latex default 8289*0c56280aSSorin Bascainstruction). 8290*0c56280aSSorin Basca\layout Standard 8291*0c56280aSSorin Basca 8292*0c56280aSSorin BascaOne possibility to deal with this situation is 8293*0c56280aSSorin Basca\emph on 8294*0c56280aSSorin Bascainlining 8295*0c56280aSSorin Basca\emph default 8296*0c56280aSSorin Basca. 8297*0c56280aSSorin Basca For instance, the verifier of the ElectricalFire JVM 8298*0c56280aSSorin Basca\begin_inset LatexCommand \cite{EF} 8299*0c56280aSSorin Basca 8300*0c56280aSSorin Basca\end_inset 8301*0c56280aSSorin Basca 8302*0c56280aSSorin Basca uses this approach: instruction nodes of subroutines are duplicated for 8303*0c56280aSSorin Basca every calling 8304*0c56280aSSorin Basca\latex latex 8305*0c56280aSSorin Basca 8306*0c56280aSSorin Basca\backslash 8307*0c56280aSSorin Bascatexttt{jsr} 8308*0c56280aSSorin Basca\latex default 8309*0c56280aSSorin Basca or 8310*0c56280aSSorin Basca\latex latex 8311*0c56280aSSorin Basca 8312*0c56280aSSorin Basca\backslash 8313*0c56280aSSorin Bascatexttt{jsr 8314*0c56280aSSorin Basca\backslash 8315*0c56280aSSorin Basca_w} 8316*0c56280aSSorin Basca\latex default 8317*0c56280aSSorin Basca instruction. 8318*0c56280aSSorin Basca This approach is equivalent to the one sketched by Sun (see 8319*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8320*0c56280aSSorin Basca 8321*0c56280aSSorin Basca\end_inset 8322*0c56280aSSorin Basca 8323*0c56280aSSorin Basca, page 151). 8324*0c56280aSSorin Basca 8325*0c56280aSSorin Basca\layout Standard 8326*0c56280aSSorin Basca 8327*0c56280aSSorin BascaJustIce uses a variant of this approach: instruction nodes are augmented 8328*0c56280aSSorin Basca with sets of local variables arrays. 8329*0c56280aSSorin Basca The local variables array used for merging a 8330*0c56280aSSorin Basca\latex latex 8331*0c56280aSSorin Basca 8332*0c56280aSSorin Basca\backslash 8333*0c56280aSSorin Bascatexttt{ret} 8334*0c56280aSSorin Basca\latex default 8335*0c56280aSSorin Basca's type information with the physical successor of some 8336*0c56280aSSorin Basca\latex latex 8337*0c56280aSSorin Basca 8338*0c56280aSSorin Basca\backslash 8339*0c56280aSSorin Bascatexttt{jsr} 8340*0c56280aSSorin Basca\latex default 8341*0c56280aSSorin Basca/ 8342*0c56280aSSorin Basca\latex latex 8343*0c56280aSSorin Basca 8344*0c56280aSSorin Basca\backslash 8345*0c56280aSSorin Bascatexttt{jsr 8346*0c56280aSSorin Basca\backslash 8347*0c56280aSSorin Basca_w} 8348*0c56280aSSorin Basca\latex default 8349*0c56280aSSorin Basca instruction is keyed by that 8350*0c56280aSSorin Basca\latex latex 8351*0c56280aSSorin Basca 8352*0c56280aSSorin Basca\backslash 8353*0c56280aSSorin Bascatexttt{jsr} 8354*0c56280aSSorin Basca\latex default 8355*0c56280aSSorin Basca/ 8356*0c56280aSSorin Basca\latex latex 8357*0c56280aSSorin Basca 8358*0c56280aSSorin Basca\backslash 8359*0c56280aSSorin Bascatexttt{jsr 8360*0c56280aSSorin Basca\backslash 8361*0c56280aSSorin Basca_w} 8362*0c56280aSSorin Basca\latex default 8363*0c56280aSSorin Basca instruction itself. 8364*0c56280aSSorin Basca This still implies a special merging mechanism for the 8365*0c56280aSSorin Basca\latex latex 8366*0c56280aSSorin Basca 8367*0c56280aSSorin Basca\backslash 8368*0c56280aSSorin Bascatexttt{ret} 8369*0c56280aSSorin Basca\latex default 8370*0c56280aSSorin Basca instruction: only the physical successor of one 8371*0c56280aSSorin Basca\latex latex 8372*0c56280aSSorin Basca 8373*0c56280aSSorin Basca\backslash 8374*0c56280aSSorin Bascatexttt{jsr} 8375*0c56280aSSorin Basca\latex default 8376*0c56280aSSorin Basca/ 8377*0c56280aSSorin Basca\latex latex 8378*0c56280aSSorin Basca 8379*0c56280aSSorin Basca\backslash 8380*0c56280aSSorin Bascatexttt{jsr 8381*0c56280aSSorin Basca\backslash 8382*0c56280aSSorin Basca_w} 8383*0c56280aSSorin Basca\latex default 8384*0c56280aSSorin Basca instruction can be merged with the 8385*0c56280aSSorin Basca\latex latex 8386*0c56280aSSorin Basca 8387*0c56280aSSorin Basca\backslash 8388*0c56280aSSorin Bascatexttt{ret} 8389*0c56280aSSorin Basca\latex default 8390*0c56280aSSorin Basca at a time, because other 8391*0c56280aSSorin Basca\latex latex 8392*0c56280aSSorin Basca 8393*0c56280aSSorin Basca\backslash 8394*0c56280aSSorin Bascatexttt{jsr} 8395*0c56280aSSorin Basca\latex default 8396*0c56280aSSorin Basca/ 8397*0c56280aSSorin Basca\latex latex 8398*0c56280aSSorin Basca 8399*0c56280aSSorin Basca\backslash 8400*0c56280aSSorin Bascatexttt{jsr 8401*0c56280aSSorin Basca\backslash 8402*0c56280aSSorin Basca_w} 8403*0c56280aSSorin Basca\latex default 8404*0c56280aSSorin Basca instructions have possibly not been symbolically executed yet and thus 8405*0c56280aSSorin Basca bear no type information at the time of merging. 8406*0c56280aSSorin Basca In this scenario, an instruction in a subroutine plays multiple roles; 8407*0c56280aSSorin Basca one for each occurence of a 8408*0c56280aSSorin Basca\latex latex 8409*0c56280aSSorin Basca 8410*0c56280aSSorin Basca\backslash 8411*0c56280aSSorin Bascatexttt{jsr} 8412*0c56280aSSorin Basca\latex default 8413*0c56280aSSorin Basca/ 8414*0c56280aSSorin Basca\latex latex 8415*0c56280aSSorin Basca 8416*0c56280aSSorin Basca\backslash 8417*0c56280aSSorin Bascatexttt{jsr 8418*0c56280aSSorin Basca\backslash 8419*0c56280aSSorin Basca_w} 8420*0c56280aSSorin Basca\latex default 8421*0c56280aSSorin Basca that is calling the subroutine. 8422*0c56280aSSorin Basca The queue holding the instructions to symbolically execute is therefore 8423*0c56280aSSorin Basca required to allow duplicates. 8424*0c56280aSSorin Basca\layout Subsubsection 8425*0c56280aSSorin Basca 8426*0c56280aSSorin BascaWide Data Types 8427*0c56280aSSorin Basca\layout Standard 8428*0c56280aSSorin Basca 8429*0c56280aSSorin BascaThe types 8430*0c56280aSSorin Basca\family typewriter 8431*0c56280aSSorin Bascalong 8432*0c56280aSSorin Basca\family default 8433*0c56280aSSorin Basca and 8434*0c56280aSSorin Basca\family typewriter 8435*0c56280aSSorin Bascadouble 8436*0c56280aSSorin Basca\family default 8437*0c56280aSSorin Bascause two consecutive local variables if written to or read from a local variables 8438*0c56280aSSorin Basca array. 8439*0c56280aSSorin Basca Similarly, they use two operand stack slots. 8440*0c56280aSSorin Basca This makes type verification a bit more difficult because of subtle special 8441*0c56280aSSorin Basca cases. 8442*0c56280aSSorin Basca For example, when a method uses three local variables at maximum (local 8443*0c56280aSSorin Basca variables 0, 1 and 2), the code is not allowed to store a 8444*0c56280aSSorin Basca\family typewriter 8445*0c56280aSSorin Bascadouble 8446*0c56280aSSorin Basca\family default 8447*0c56280aSSorin Basca value in local variable 2 (because local variable 3 would have to be occupied, 8448*0c56280aSSorin Basca too). 8449*0c56280aSSorin Basca\layout Subsubsection 8450*0c56280aSSorin Basca 8451*0c56280aSSorin BascaInstance Initialization and Newly Created Objects 8452*0c56280aSSorin Basca\layout Standard 8453*0c56280aSSorin Basca 8454*0c56280aSSorin BascaIt would be difficult to verify that a newly created instance is initialized 8455*0c56280aSSorin Basca exactly once, given all possible paths of execution flow in a method. 8456*0c56280aSSorin Basca Fortunately (from a verifier implementor's view), Sun puts constraints 8457*0c56280aSSorin Basca on object initialization that match the behaviour of the verifier --- instead 8458*0c56280aSSorin Basca of putting sane constraints on object initialization and actually verifying 8459*0c56280aSSorin Basca them. 8460*0c56280aSSorin Basca\layout Standard 8461*0c56280aSSorin Basca 8462*0c56280aSSorin Basca 8463*0c56280aSSorin Basca\begin_inset Quotes eld 8464*0c56280aSSorin Basca\end_inset 8465*0c56280aSSorin Basca 8466*0c56280aSSorin BascaA valid instruction sequence must not have an uninitialized object on the 8467*0c56280aSSorin Basca operand stack or in a local variable during a backwards branch [\SpecialChar \ldots{} 8468*0c56280aSSorin Basca]. 8469*0c56280aSSorin Basca Otherwise, a devious piece of code might fool the verifier into thinking 8470*0c56280aSSorin Basca it had initialized a class instance when it had, in fact, initialized a 8471*0c56280aSSorin Basca class instance created in a previous pass through a loop 8472*0c56280aSSorin Basca\begin_inset Quotes erd 8473*0c56280aSSorin Basca\end_inset 8474*0c56280aSSorin Basca 8475*0c56280aSSorin Basca ( 8476*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8477*0c56280aSSorin Basca 8478*0c56280aSSorin Basca\end_inset 8479*0c56280aSSorin Basca 8480*0c56280aSSorin Basca, page 148). 8481*0c56280aSSorin Basca\layout Section 8482*0c56280aSSorin Basca 8483*0c56280aSSorin Basca 8484*0c56280aSSorin Basca\begin_inset LatexCommand \label{Pass4Spec} 8485*0c56280aSSorin Basca 8486*0c56280aSSorin Basca\end_inset 8487*0c56280aSSorin Basca 8488*0c56280aSSorin BascaPass Four 8489*0c56280aSSorin Basca\layout Standard 8490*0c56280aSSorin Basca 8491*0c56280aSSorin BascaPass four performs 8492*0c56280aSSorin Basca\begin_inset Quotes eld 8493*0c56280aSSorin Basca\end_inset 8494*0c56280aSSorin Basca 8495*0c56280aSSorin Bascacertain tests that could in principle be performed in Pass 3 8496*0c56280aSSorin Basca\begin_inset Quotes erd 8497*0c56280aSSorin Basca\end_inset 8498*0c56280aSSorin Basca 8499*0c56280aSSorin Basca ( 8500*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8501*0c56280aSSorin Basca 8502*0c56280aSSorin Basca\end_inset 8503*0c56280aSSorin Basca 8504*0c56280aSSorin Basca, page 142). 8505*0c56280aSSorin Basca These tests are usually delayed by JVM implementations until run-time, 8506*0c56280aSSorin Basca because they possibly trigger the loading of referenced class file definitions. 8507*0c56280aSSorin Basca This is a performance enhancement. 8508*0c56280aSSorin Basca However, 8509*0c56280aSSorin Basca\begin_inset Quotes eld 8510*0c56280aSSorin Basca\end_inset 8511*0c56280aSSorin Basca 8512*0c56280aSSorin BascaA Java virtual machine implementation is allowed to perform any or all of 8513*0c56280aSSorin Basca the Pass 4 steps as part of Pass 3 8514*0c56280aSSorin Basca\begin_inset Quotes erd 8515*0c56280aSSorin Basca\end_inset 8516*0c56280aSSorin Basca 8517*0c56280aSSorin Basca ( 8518*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8519*0c56280aSSorin Basca 8520*0c56280aSSorin Basca\end_inset 8521*0c56280aSSorin Basca 8522*0c56280aSSorin Basca, page 143). 8523*0c56280aSSorin Basca The tests 8524*0c56280aSSorin Basca\layout Itemize 8525*0c56280aSSorin Basca 8526*0c56280aSSorin Bascaensure that the referenced method or field exists in the given class 8527*0c56280aSSorin Basca\layout Itemize 8528*0c56280aSSorin Basca 8529*0c56280aSSorin Bascacheck that the referenced method or field has the indicated descriptor (signatur 8530*0c56280aSSorin Bascae) 8531*0c56280aSSorin Basca\layout Itemize 8532*0c56280aSSorin Basca 8533*0c56280aSSorin Bascacheck that the currently executing method has access to the referenced method 8534*0c56280aSSorin Basca or field. 8535*0c56280aSSorin Basca\layout Standard 8536*0c56280aSSorin Basca 8537*0c56280aSSorin BascaJustIce has no run-time system and so the tests of pass four are performed 8538*0c56280aSSorin Basca in pass 3a. 8539*0c56280aSSorin Basca\layout Standard 8540*0c56280aSSorin Basca 8541*0c56280aSSorin BascaThere are tests that have to be performed at run-time: for example, if an 8542*0c56280aSSorin Basca object referenced by an object reference on top of the operand stack implements 8543*0c56280aSSorin Basca a certain interface or not 8544*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong2-WWW} 8545*0c56280aSSorin Basca 8546*0c56280aSSorin Basca\end_inset 8547*0c56280aSSorin Basca 8548*0c56280aSSorin Basca. 8549*0c56280aSSorin Basca These are not considered part of the pass four verification. 8550*0c56280aSSorin Basca\layout Chapter 8551*0c56280aSSorin Basca 8552*0c56280aSSorin BascaImplementation of the Verification Passes 8553*0c56280aSSorin Basca\layout Standard 8554*0c56280aSSorin Basca 8555*0c56280aSSorin BascaOccasionally, the behaviour of other verifier implementations was explained 8556*0c56280aSSorin Basca in section 8557*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SpecPasses} 8558*0c56280aSSorin Basca 8559*0c56280aSSorin Basca\end_inset 8560*0c56280aSSorin Basca 8561*0c56280aSSorin Basca 8562*0c56280aSSorin Basca\emph on 8563*0c56280aSSorin Basca. 8564*0c56280aSSorin Basca 8565*0c56280aSSorin Basca\emph default 8566*0c56280aSSorin BascaThis is not a mistake; the Java Virtual Machine Specification, Second Edition 8567*0c56280aSSorin Basca 8568*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8569*0c56280aSSorin Basca 8570*0c56280aSSorin Basca\end_inset 8571*0c56280aSSorin Basca 8572*0c56280aSSorin Basca is unfortunately not detailed enough to make a clean-room implementation 8573*0c56280aSSorin Basca of the JVM verifier possible. 8574*0c56280aSSorin Basca Having a close look at the behaviour of existing verifier implementations 8575*0c56280aSSorin Basca is sometimes necessary to interpret the specification correctly. 8576*0c56280aSSorin Basca For that reason, the behaviour of these implementations is part of the 8577*0c56280aSSorin Basca specification of JustIce whereever appropriate. 8578*0c56280aSSorin Basca Still, there are some minor differences in behaviour between JustIce and 8579*0c56280aSSorin Basca the traditional JVM built-in verifiers. 8580*0c56280aSSorin Basca These differences were observed by using the traditional verifiers, not 8581*0c56280aSSorin Basca by inspecting their source code. 8582*0c56280aSSorin Basca\layout Standard 8583*0c56280aSSorin Basca 8584*0c56280aSSorin BascaJustIce is implemented in the Java programming language 8585*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 8586*0c56280aSSorin Basca 8587*0c56280aSSorin Basca\end_inset 8588*0c56280aSSorin Basca 8589*0c56280aSSorin Basca using the Byte Code Engineering Library 8590*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 8591*0c56280aSSorin Basca 8592*0c56280aSSorin Basca\end_inset 8593*0c56280aSSorin Basca 8594*0c56280aSSorin Basca. 8595*0c56280aSSorin Basca\layout Section 8596*0c56280aSSorin Basca 8597*0c56280aSSorin BascaPass One 8598*0c56280aSSorin Basca\layout Standard 8599*0c56280aSSorin Basca 8600*0c56280aSSorin BascaThe Byte Code Engineering Library (BCEL) presents an object oriented view 8601*0c56280aSSorin Basca of the class file structure. 8602*0c56280aSSorin Basca Therefore, an integral part of that library is parsing class files. 8603*0c56280aSSorin Basca JustIce uses the BCEL, so there was nothing left to do to load a class 8604*0c56280aSSorin Basca file in. 8605*0c56280aSSorin Basca Only minor changes were made to the BCEL to make it more verbose when exception 8606*0c56280aSSorin Bascaal situations occur; i.e., when a garbled class file is loaded in. 8607*0c56280aSSorin Basca The BCEL uses Java's exception mechanism to signal these situations; JustIce 8608*0c56280aSSorin Basca transforms this behaviour into the behaviour expected by users of the Verificat 8609*0c56280aSSorin Bascaion API (see section 8610*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Verification API} 8611*0c56280aSSorin Basca 8612*0c56280aSSorin Basca\end_inset 8613*0c56280aSSorin Basca 8614*0c56280aSSorin Basca). 8615*0c56280aSSorin Basca\layout Subsubsection 8616*0c56280aSSorin Basca 8617*0c56280aSSorin BascaComparison to Sun's Implementation 8618*0c56280aSSorin Basca\layout Standard 8619*0c56280aSSorin Basca 8620*0c56280aSSorin BascaThere does not seem to be any difference in behaviour between JustIce and 8621*0c56280aSSorin Basca the traditional verifiers. 8622*0c56280aSSorin Basca Still, this conviction is a result of black box tests so it might not be 8623*0c56280aSSorin Basca true in corner cases. 8624*0c56280aSSorin Basca\layout Standard 8625*0c56280aSSorin Basca 8626*0c56280aSSorin BascaUnknown attributes are ignored (though JustIce records a warning message, 8627*0c56280aSSorin Basca where the traditional verifiers don't). 8628*0c56280aSSorin Basca\layout Standard 8629*0c56280aSSorin Basca 8630*0c56280aSSorin BascaTrailing bytes at the end of the class file are ignored in both versions, 8631*0c56280aSSorin Basca contradicting the specification. 8632*0c56280aSSorin Basca This was necessary because some Java run-time environments are broken concernin 8633*0c56280aSSorin Bascag the handling of .JAR archive files. 8634*0c56280aSSorin Basca The mechanism of loading class files from these archives files using the 8635*0c56280aSSorin Basca Java Platform's API is used by BCEL and probably by Sun's JVM, too. 8636*0c56280aSSorin Basca It is possible that this is the reason why Sun's verifier itself does not 8637*0c56280aSSorin Basca enforce this constraint. 8638*0c56280aSSorin Basca However, it does not really pose a threat to the integrity of any JVM known 8639*0c56280aSSorin Basca to the author. 8640*0c56280aSSorin Basca There is no entry in the 8641*0c56280aSSorin Basca\family typewriter 8642*0c56280aSSorin BascaClassFile 8643*0c56280aSSorin Basca\family default 8644*0c56280aSSorin Basca structure (see section 8645*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Classfile Structure} 8646*0c56280aSSorin Basca 8647*0c56280aSSorin Basca\end_inset 8648*0c56280aSSorin Basca 8649*0c56280aSSorin Basca) stating how long the class file is in its entirety, so a JVM implementor 8650*0c56280aSSorin Basca cannot possibly base a wrong decision on that. 8651*0c56280aSSorin Basca 8652*0c56280aSSorin Basca\layout Section 8653*0c56280aSSorin Basca 8654*0c56280aSSorin Basca 8655*0c56280aSSorin Basca\begin_inset LatexCommand \label{Pass2Impl} 8656*0c56280aSSorin Basca 8657*0c56280aSSorin Basca\end_inset 8658*0c56280aSSorin Basca 8659*0c56280aSSorin BascaPass Two 8660*0c56280aSSorin Basca\layout Standard 8661*0c56280aSSorin Basca 8662*0c56280aSSorin BascaJustIce does perform 8663*0c56280aSSorin Basca\begin_inset Quotes eld 8664*0c56280aSSorin Basca\end_inset 8665*0c56280aSSorin Basca 8666*0c56280aSSorin Bascaall verification that can be performed without looking at the bytecodes 8667*0c56280aSSorin Basca\begin_inset Quotes erd 8668*0c56280aSSorin Basca\end_inset 8669*0c56280aSSorin Basca 8670*0c56280aSSorin Basca in pass two. 8671*0c56280aSSorin Basca For some reasons (like determining a valid ancestor hierarchy of a class), 8672*0c56280aSSorin Basca pass two of JustIce has to load referenced classes. 8673*0c56280aSSorin Basca Of course, this is done in a careful way: by pass-one-verifying them. 8674*0c56280aSSorin Basca If loading of a referenced class should fail (i.e., verification pass one 8675*0c56280aSSorin Basca fails on this class), the referencing class is rejected by JustIce's pass 8676*0c56280aSSorin Basca two. 8677*0c56280aSSorin Basca Pass two of JustIce does not pass-two-verify any referenced classes. 8678*0c56280aSSorin Basca\layout Standard 8679*0c56280aSSorin Basca 8680*0c56280aSSorin BascaAlso, JustIce's pass two emits a wealth of (warning) messages. 8681*0c56280aSSorin Basca Their target is to guide a bytecode engineer to create class files that 8682*0c56280aSSorin Basca are indistinguishable from those created by Sun's 8683*0c56280aSSorin Basca\emph on 8684*0c56280aSSorin Bascajavac 8685*0c56280aSSorin Basca\emph default 8686*0c56280aSSorin Basca compiler with no debugging output. 8687*0c56280aSSorin Basca For example, the use of 8688*0c56280aSSorin Basca\family typewriter 8689*0c56280aSSorin BascaLineNumberTable 8690*0c56280aSSorin Basca\family default 8691*0c56280aSSorin Basca attributes (see section 8692*0c56280aSSorin Basca\begin_inset LatexCommand \ref{LineNumberTableAttribute} 8693*0c56280aSSorin Basca 8694*0c56280aSSorin Basca\end_inset 8695*0c56280aSSorin Basca 8696*0c56280aSSorin Basca) is discouraged, because these atributes are only useful for debugging 8697*0c56280aSSorin Basca purposes. 8698*0c56280aSSorin Basca Still, they can be the reason for a class file to be rejected -- to be 8699*0c56280aSSorin Basca on the safe side, finished applications for the JVM should not be shipped 8700*0c56280aSSorin Basca with this debug information. 8701*0c56280aSSorin Basca\layout Standard 8702*0c56280aSSorin Basca 8703*0c56280aSSorin BascaMost of the checks of pass two were implemented using the Visitor programming 8704*0c56280aSSorin Basca pattern 8705*0c56280aSSorin Basca\begin_inset LatexCommand \cite{DesignPatterns} 8706*0c56280aSSorin Basca 8707*0c56280aSSorin Basca\end_inset 8708*0c56280aSSorin Basca 8709*0c56280aSSorin Basca provided by the BCEL's 8710*0c56280aSSorin Basca\emph on 8711*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 8712*0c56280aSSorin Bascacode.class\SpecialChar \- 8713*0c56280aSSorin Bascafile 8714*0c56280aSSorin Basca\emph default 8715*0c56280aSSorin Basca API. 8716*0c56280aSSorin Basca This made it possible to have all the verification split into several methods 8717*0c56280aSSorin Basca without having to define artificial boundaries. 8718*0c56280aSSorin Basca For instance, a 8719*0c56280aSSorin Basca\family typewriter 8720*0c56280aSSorin BascaConstantValue 8721*0c56280aSSorin Basca\family default 8722*0c56280aSSorin Basca attribute is verified in a method called 8723*0c56280aSSorin Basca\emph on 8724*0c56280aSSorin BascavisitConstantValue(ConstantValue) 8725*0c56280aSSorin Basca\emph default 8726*0c56280aSSorin Basca. 8727*0c56280aSSorin Basca This is a use of the object oriented view of class files the BCEL offers. 8728*0c56280aSSorin Basca\layout Subsubsection 8729*0c56280aSSorin Basca 8730*0c56280aSSorin BascaComparison to Sun's Implementation 8731*0c56280aSSorin Basca\layout Standard 8732*0c56280aSSorin Basca 8733*0c56280aSSorin BascaJustIce does not distinguish between run-time or link-time because it was 8734*0c56280aSSorin Basca not intended to implement a JVM. 8735*0c56280aSSorin Basca Therefore, the notion of 8736*0c56280aSSorin Basca\emph on 8737*0c56280aSSorin Bascaresolving 8738*0c56280aSSorin Basca\emph default 8739*0c56280aSSorin Basca(see section 8740*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SpecPassTwo} 8741*0c56280aSSorin Basca 8742*0c56280aSSorin Basca\end_inset 8743*0c56280aSSorin Basca 8744*0c56280aSSorin Basca) is useless for JustIce. 8745*0c56280aSSorin Basca The author believes that the specification of pass two given by Sun closely 8746*0c56280aSSorin Basca reflects their implementation (or the other way around) 8747*0c56280aSSorin Basca\begin_float footnote 8748*0c56280aSSorin Basca\layout Standard 8749*0c56280aSSorin Basca 8750*0c56280aSSorin BascaThe Java Virtual Machine Specification, Second Edition, began as an internal 8751*0c56280aSSorin Basca project documentation ( 8752*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 8753*0c56280aSSorin Basca 8754*0c56280aSSorin Basca\end_inset 8755*0c56280aSSorin Basca 8756*0c56280aSSorin Basca, page xiv). 8757*0c56280aSSorin Basca Unfortunately, this can still be felt sometimes. 8758*0c56280aSSorin Basca\end_float 8759*0c56280aSSorin Basca. 8760*0c56280aSSorin Basca\layout Standard 8761*0c56280aSSorin Basca 8762*0c56280aSSorin BascaSometimes, there are ambiguities in the specification. 8763*0c56280aSSorin Basca For instance, it is said that 8764*0c56280aSSorin Basca\begin_inset Quotes eld 8765*0c56280aSSorin Basca\end_inset 8766*0c56280aSSorin Basca 8767*0c56280aSSorin BascaIf the constant pool of a class or interface refers to any class or interface 8768*0c56280aSSorin Basca that is not a member of a package, its 8769*0c56280aSSorin Basca\family typewriter 8770*0c56280aSSorin BascaClassFile 8771*0c56280aSSorin Basca\family default 8772*0c56280aSSorin Basca structure must have exactly one 8773*0c56280aSSorin Basca\family typewriter 8774*0c56280aSSorin BascaInnerClasses 8775*0c56280aSSorin Basca\family default 8776*0c56280aSSorin Basca attribute in its 8777*0c56280aSSorin Basca\family typewriter 8778*0c56280aSSorin Bascaattributes 8779*0c56280aSSorin Basca\family default 8780*0c56280aSSorin Basca table 8781*0c56280aSSorin Basca\begin_inset Quotes erd 8782*0c56280aSSorin Basca\end_inset 8783*0c56280aSSorin Basca 8784*0c56280aSSorin Basca. 8785*0c56280aSSorin Basca A class or interface that is 8786*0c56280aSSorin Basca\begin_inset Quotes eld 8787*0c56280aSSorin Basca\end_inset 8788*0c56280aSSorin Basca 8789*0c56280aSSorin Bascanot member of a package 8790*0c56280aSSorin Basca\begin_inset Quotes erd 8791*0c56280aSSorin Basca\end_inset 8792*0c56280aSSorin Basca 8793*0c56280aSSorin Basca is better known as a 8794*0c56280aSSorin Basca\emph on 8795*0c56280aSSorin Bascanested class 8796*0c56280aSSorin Basca\emph default 8797*0c56280aSSorin Basca or 8798*0c56280aSSorin Basca\emph on 8799*0c56280aSSorin Bascainner class 8800*0c56280aSSorin Basca\emph default 8801*0c56280aSSorin Basca 8802*0c56280aSSorin Basca\begin_inset LatexCommand \cite{InnerSpec} 8803*0c56280aSSorin Basca 8804*0c56280aSSorin Basca\end_inset 8805*0c56280aSSorin Basca 8806*0c56280aSSorin Basca, but this is something specific to the Java language. 8807*0c56280aSSorin Basca The 8808*0c56280aSSorin Basca\emph on 8809*0c56280aSSorin Bascajavac 8810*0c56280aSSorin Basca\emph default 8811*0c56280aSSorin Basca compiler creates multiple, often funny-named 8812*0c56280aSSorin Basca\begin_float footnote 8813*0c56280aSSorin Basca\layout Standard 8814*0c56280aSSorin Basca 8815*0c56280aSSorin BascaFor anonymous classes defined in a class 8816*0c56280aSSorin Basca\emph on 8817*0c56280aSSorin BascaX 8818*0c56280aSSorin Basca\emph default 8819*0c56280aSSorin Basca the names are 8820*0c56280aSSorin Basca\emph on 8821*0c56280aSSorin BascaX$1 8822*0c56280aSSorin Basca\emph default 8823*0c56280aSSorin Basca, 8824*0c56280aSSorin Basca\emph on 8825*0c56280aSSorin BascaX$2 8826*0c56280aSSorin Basca\emph default 8827*0c56280aSSorin Basca and so on. 8828*0c56280aSSorin Basca For a named inner class 8829*0c56280aSSorin Basca\emph on 8830*0c56280aSSorin BascaI 8831*0c56280aSSorin Basca\emph default 8832*0c56280aSSorin Basca defined in class 8833*0c56280aSSorin Basca\emph on 8834*0c56280aSSorin BascaC 8835*0c56280aSSorin Basca\emph default 8836*0c56280aSSorin Basca the name is 8837*0c56280aSSorin Basca\emph on 8838*0c56280aSSorin BascaC$I 8839*0c56280aSSorin Basca\emph default 8840*0c56280aSSorin Basca. 8841*0c56280aSSorin Basca There is, however, no guarantee for that: this is only observed behaviour 8842*0c56280aSSorin Basca of javac. 8843*0c56280aSSorin Basca Please see section 8844*0c56280aSSorin Basca\begin_inset LatexCommand \ref{InnerBug} 8845*0c56280aSSorin Basca 8846*0c56280aSSorin Basca\end_inset 8847*0c56280aSSorin Basca 8848*0c56280aSSorin Basca for an example how this behaviour can lead to unexpected problems. 8849*0c56280aSSorin Basca\end_float 8850*0c56280aSSorin Basca class files that are otherwise indistinguishable from normal class files. 8851*0c56280aSSorin Basca\layout Standard 8852*0c56280aSSorin Basca 8853*0c56280aSSorin BascaTherefore, it is generally not possible to decide if such an attribute is 8854*0c56280aSSorin Basca missing; therefore Sun's implementation does not check this constraint. 8855*0c56280aSSorin Basca JustIce, in contrast, uses its warning mechanism if the name of a referenced 8856*0c56280aSSorin Basca class or interface could be a name of an inner class created by the 8857*0c56280aSSorin Basca\emph on 8858*0c56280aSSorin Bascajavac 8859*0c56280aSSorin Basca\emph default 8860*0c56280aSSorin Basca compiler and the 8861*0c56280aSSorin Basca\family typewriter 8862*0c56280aSSorin BascaInnerClass 8863*0c56280aSSorin Basca\family default 8864*0c56280aSSorin Basca attribute is missing. 8865*0c56280aSSorin Basca\layout Standard 8866*0c56280aSSorin Basca 8867*0c56280aSSorin BascaThe sets of accepted or rejected class files concerning pass two are equal 8868*0c56280aSSorin Basca using both Sun's implementation and JustIce, as exhaustive tests show. 8869*0c56280aSSorin Basca This can, however, not be proven because one would need to analyze Sun's 8870*0c56280aSSorin Basca source code for that (which is not intended: as already mentioned, JustIce 8871*0c56280aSSorin Basca is a clean-room implementation). 8872*0c56280aSSorin Basca\layout Section 8873*0c56280aSSorin Basca 8874*0c56280aSSorin BascaPass Three 8875*0c56280aSSorin Basca\layout Subsection 8876*0c56280aSSorin Basca 8877*0c56280aSSorin BascaPass 3a 8878*0c56280aSSorin Basca\layout Standard 8879*0c56280aSSorin Basca 8880*0c56280aSSorin BascaOne feature of the BCEL's 8881*0c56280aSSorin Basca\emph on 8882*0c56280aSSorin Bascade.fub.bytecode.generic 8883*0c56280aSSorin Basca\emph default 8884*0c56280aSSorin Basca package is parsing code attributes of methods and transforming them into 8885*0c56280aSSorin Basca so-called 8886*0c56280aSSorin Basca\family typewriter 8887*0c56280aSSorin BascaInstruction\SpecialChar \- 8888*0c56280aSSorin BascaList 8889*0c56280aSSorin Basca\family default 8890*0c56280aSSorin Basca objects. 8891*0c56280aSSorin Basca Consequently, this feature is used to implement pass 3a; a few additional 8892*0c56280aSSorin Basca checks have been implemented where BCEL is too 8893*0c56280aSSorin Basca\begin_inset Quotes eld 8894*0c56280aSSorin Basca\end_inset 8895*0c56280aSSorin Basca 8896*0c56280aSSorin Bascatrustful 8897*0c56280aSSorin Basca\begin_inset Quotes erd 8898*0c56280aSSorin Basca\end_inset 8899*0c56280aSSorin Basca 8900*0c56280aSSorin Basca when parsing, i.e., where BCEL relies on the correctness of the class file. 8901*0c56280aSSorin Basca\layout Standard 8902*0c56280aSSorin Basca 8903*0c56280aSSorin BascaPass 3a consists of the checking of static constraints on instructions and 8904*0c56280aSSorin Basca static constraints on operands of these instructions. 8905*0c56280aSSorin Basca The successful creation an an 8906*0c56280aSSorin Basca\family typewriter 8907*0c56280aSSorin BascaInstruction\SpecialChar \- 8908*0c56280aSSorin BascaList 8909*0c56280aSSorin Basca\family default 8910*0c56280aSSorin Basca object already implies that the static constraints on instructions are 8911*0c56280aSSorin Basca satisfied. 8912*0c56280aSSorin Basca Similar to pass one, JustIce transforms the behaviour of BCEL's exception 8913*0c56280aSSorin Basca mechanism into the behaviour expected by users of the Verification API 8914*0c56280aSSorin Basca (see section 8915*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Verification API} 8916*0c56280aSSorin Basca 8917*0c56280aSSorin Basca\end_inset 8918*0c56280aSSorin Basca 8919*0c56280aSSorin Basca). 8920*0c56280aSSorin Basca\layout Standard 8921*0c56280aSSorin Basca 8922*0c56280aSSorin BascaThe 8923*0c56280aSSorin Basca\emph on 8924*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 8925*0c56280aSSorin Bascacode.ge\SpecialChar \- 8926*0c56280aSSorin Bascane\SpecialChar \- 8927*0c56280aSSorin Bascaric 8928*0c56280aSSorin Basca\emph default 8929*0c56280aSSorin BascaAPI provided by BCEL offers a Visitor design pattern similar to the one 8930*0c56280aSSorin Basca of the 8931*0c56280aSSorin Basca\emph on 8932*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 8933*0c56280aSSorin Bascacode.class\SpecialChar \- 8934*0c56280aSSorin Bascafile 8935*0c56280aSSorin Basca\emph default 8936*0c56280aSSorin Basca API. 8937*0c56280aSSorin Basca The tests for the static constraints on operands of instructions are implemente 8938*0c56280aSSorin Bascad by using it. 8939*0c56280aSSorin Basca For example, the constraints put on the operands of any 8940*0c56280aSSorin Basca\latex latex 8941*0c56280aSSorin Basca 8942*0c56280aSSorin Basca\backslash 8943*0c56280aSSorin Bascatexttt{iload} 8944*0c56280aSSorin Basca\latex default 8945*0c56280aSSorin Basca instruction are verified using a 8946*0c56280aSSorin Basca\emph on 8947*0c56280aSSorin BascavisitILOAD(ILOAD) 8948*0c56280aSSorin Basca\emph default 8949*0c56280aSSorin Basca method defined in a Visitor class. 8950*0c56280aSSorin Basca This Visitor class implements all the checks for integrity of all instruction's 8951*0c56280aSSorin Basca operands. 8952*0c56280aSSorin Basca Algorithm 8953*0c56280aSSorin Basca\begin_inset LatexCommand \ref{visitILOADstaticoperands} 8954*0c56280aSSorin Basca 8955*0c56280aSSorin Basca\end_inset 8956*0c56280aSSorin Basca 8957*0c56280aSSorin Basca shows the impementation of the 8958*0c56280aSSorin Basca\emph on 8959*0c56280aSSorin BascavisitILOAD(ILOAD) 8960*0c56280aSSorin Basca\emph default 8961*0c56280aSSorin Basca method. 8962*0c56280aSSorin Basca\begin_float alg 8963*0c56280aSSorin Basca\layout Caption 8964*0c56280aSSorin Basca 8965*0c56280aSSorin Basca 8966*0c56280aSSorin Basca\begin_inset LatexCommand \label{visitILOADstaticoperands} 8967*0c56280aSSorin Basca 8968*0c56280aSSorin Basca\end_inset 8969*0c56280aSSorin Basca 8970*0c56280aSSorin BascavisitILOAD, Visitor ensuring static constraints on operands of instructions 8971*0c56280aSSorin Basca\layout Standard 8972*0c56280aSSorin Basca 8973*0c56280aSSorin Basca 8974*0c56280aSSorin Basca\family typewriter 8975*0c56280aSSorin Basca\SpecialChar \- 8976*0c56280aSSorin Basca\SpecialChar ~ 8977*0c56280aSSorin Basca/** Checks if the constraints of operands of the said instruction(s) are 8978*0c56280aSSorin Basca satisfied. 8979*0c56280aSSorin Basca */ 8980*0c56280aSSorin Basca\newline 8981*0c56280aSSorin Basca\SpecialChar \- 8982*0c56280aSSorin Bascapublic void visitILOAD(ILOAD o){ 8983*0c56280aSSorin Basca\newline 8984*0c56280aSSorin Basca\SpecialChar \- 8985*0c56280aSSorin Basca\SpecialChar ~ 8986*0c56280aSSorin Basca\SpecialChar ~ 8987*0c56280aSSorin Bascaint idx = o.getIndex(); 8988*0c56280aSSorin Basca\newline 8989*0c56280aSSorin Basca\SpecialChar \- 8990*0c56280aSSorin Basca\SpecialChar ~ 8991*0c56280aSSorin Basca\SpecialChar ~ 8992*0c56280aSSorin Bascaif (idx < 0){ 8993*0c56280aSSorin Basca\newline 8994*0c56280aSSorin Basca\SpecialChar \- 8995*0c56280aSSorin Basca\SpecialChar ~ 8996*0c56280aSSorin Basca\SpecialChar ~ 8997*0c56280aSSorin Basca\SpecialChar ~ 8998*0c56280aSSorin Basca\SpecialChar ~ 8999*0c56280aSSorin BascaconstraintViolated(o, "Index '"+idx+"' must be non-negative."); 9000*0c56280aSSorin Basca\newline 9001*0c56280aSSorin Basca\SpecialChar \- 9002*0c56280aSSorin Basca\SpecialChar ~ 9003*0c56280aSSorin Basca\SpecialChar ~ 9004*0c56280aSSorin Basca} 9005*0c56280aSSorin Basca\newline 9006*0c56280aSSorin Basca\SpecialChar \- 9007*0c56280aSSorin Basca\SpecialChar ~ 9008*0c56280aSSorin Basca\SpecialChar ~ 9009*0c56280aSSorin Bascaelse{ 9010*0c56280aSSorin Basca\newline 9011*0c56280aSSorin Basca\SpecialChar \- 9012*0c56280aSSorin Basca\SpecialChar ~ 9013*0c56280aSSorin Basca\SpecialChar ~ 9014*0c56280aSSorin Basca\SpecialChar ~ 9015*0c56280aSSorin Basca\SpecialChar ~ 9016*0c56280aSSorin Bascaint maxminus1 = max_locals()-1; 9017*0c56280aSSorin Basca\newline 9018*0c56280aSSorin Basca\SpecialChar \- 9019*0c56280aSSorin Basca\SpecialChar ~ 9020*0c56280aSSorin Basca\SpecialChar ~ 9021*0c56280aSSorin Basca\SpecialChar ~ 9022*0c56280aSSorin Basca\SpecialChar ~ 9023*0c56280aSSorin Bascaif (idx > maxminus1){ 9024*0c56280aSSorin Basca\newline 9025*0c56280aSSorin Basca\SpecialChar \- 9026*0c56280aSSorin Basca\SpecialChar ~ 9027*0c56280aSSorin Basca\SpecialChar ~ 9028*0c56280aSSorin Basca\SpecialChar ~ 9029*0c56280aSSorin Basca\SpecialChar ~ 9030*0c56280aSSorin Basca\SpecialChar ~ 9031*0c56280aSSorin Basca\SpecialChar ~ 9032*0c56280aSSorin BascaconstraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 9033*0c56280aSSorin Basca '"+maxminus1+"'."); 9034*0c56280aSSorin Basca\newline 9035*0c56280aSSorin Basca\SpecialChar \- 9036*0c56280aSSorin Basca\SpecialChar ~ 9037*0c56280aSSorin Basca\SpecialChar ~ 9038*0c56280aSSorin Basca\SpecialChar ~ 9039*0c56280aSSorin Basca\SpecialChar ~ 9040*0c56280aSSorin Basca} 9041*0c56280aSSorin Basca\newline 9042*0c56280aSSorin Basca\SpecialChar \- 9043*0c56280aSSorin Basca\SpecialChar ~ 9044*0c56280aSSorin Basca\SpecialChar ~ 9045*0c56280aSSorin Basca} 9046*0c56280aSSorin Basca\newline 9047*0c56280aSSorin Basca} 9048*0c56280aSSorin Basca\end_float 9049*0c56280aSSorin Basca\layout Standard 9050*0c56280aSSorin Basca 9051*0c56280aSSorin BascaJustIce does not provide any run-time, so the tests of pass four (see section 9052*0c56280aSSorin Basca 9053*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass4Spec} 9054*0c56280aSSorin Basca 9055*0c56280aSSorin Basca\end_inset 9056*0c56280aSSorin Basca 9057*0c56280aSSorin Basca) are not delayed until run-time, but performed here. 9058*0c56280aSSorin Basca\layout Subsubsection 9059*0c56280aSSorin Basca 9060*0c56280aSSorin BascaComparison to Sun's Implementation 9061*0c56280aSSorin Basca\layout Standard 9062*0c56280aSSorin Basca 9063*0c56280aSSorin BascaSun does not distinguish pass 3a and pass 3b. 9064*0c56280aSSorin Basca However, Sun's verifiers also have to ensure that the static constraints 9065*0c56280aSSorin Basca on instructions are satisfied before starting data flow analysis. 9066*0c56280aSSorin Basca\layout Standard 9067*0c56280aSSorin Basca 9068*0c56280aSSorin BascaThis is obvious because a data structure has to be built before the data 9069*0c56280aSSorin Basca flow analyzer can be run; and this data structure has to be built carefully 9070*0c56280aSSorin Basca\begin_float footnote 9071*0c56280aSSorin Basca\layout Standard 9072*0c56280aSSorin Basca 9073*0c56280aSSorin BascaThis actually means verifying the structural integrity of the bytecodes. 9074*0c56280aSSorin Basca\end_float 9075*0c56280aSSorin Basca because passes one and two did not look at the bytecodes before. 9076*0c56280aSSorin Basca\layout Standard 9077*0c56280aSSorin Basca 9078*0c56280aSSorin BascaJustIce does implement pass four checks in pass 3a which Sun's verifiers 9079*0c56280aSSorin Basca do not. 9080*0c56280aSSorin Basca Because JustIce provides no run-time, the outcome of a verification failure 9081*0c56280aSSorin Basca is reported instantly. 9082*0c56280aSSorin Basca Traditional JVMs are required to silently delay the actions triggered by 9083*0c56280aSSorin Basca that knowledge until run-time. 9084*0c56280aSSorin Basca\layout Subsection 9085*0c56280aSSorin Basca 9086*0c56280aSSorin BascaPass 3b 9087*0c56280aSSorin Basca\layout Standard 9088*0c56280aSSorin Basca 9089*0c56280aSSorin BascaJustIce aims at implementing Sun's data flow analyzing algorithm as closely 9090*0c56280aSSorin Basca as possible. 9091*0c56280aSSorin Basca First, a control flow graph is built --- which implies analyzing a method's 9092*0c56280aSSorin Basca subroutine calling structure first. 9093*0c56280aSSorin Basca\layout Standard 9094*0c56280aSSorin Basca 9095*0c56280aSSorin BascaAfter that an implementation of the core algorithm sketched by Sun Microsystems 9096*0c56280aSSorin Basca is started. 9097*0c56280aSSorin Basca Verification failure is internally signalled by the Java exception handling 9098*0c56280aSSorin Basca mechanism which is then transformed to match the Verification API (see 9099*0c56280aSSorin Basca section 9100*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Verification API} 9101*0c56280aSSorin Basca 9102*0c56280aSSorin Basca\end_inset 9103*0c56280aSSorin Basca 9104*0c56280aSSorin Basca). 9105*0c56280aSSorin Basca\layout Subsubsection 9106*0c56280aSSorin Basca 9107*0c56280aSSorin Basca 9108*0c56280aSSorin Basca\begin_inset LatexCommand \label{SubroutineImpl} 9109*0c56280aSSorin Basca 9110*0c56280aSSorin Basca\end_inset 9111*0c56280aSSorin Basca 9112*0c56280aSSorin BascaSubroutines 9113*0c56280aSSorin Basca\layout Standard 9114*0c56280aSSorin Basca 9115*0c56280aSSorin BascaSubroutines are modeled as instances of the 9116*0c56280aSSorin Basca\family typewriter 9117*0c56280aSSorin BascaSubroutine 9118*0c56280aSSorin Basca\family default 9119*0c56280aSSorin Basca interface 9120*0c56280aSSorin Basca\emph on 9121*0c56280aSSorin Basca. 9122*0c56280aSSorin Basca 9123*0c56280aSSorin Basca\emph default 9124*0c56280aSSorin Basca They provide the following methods (note that an 9125*0c56280aSSorin Basca\family typewriter 9126*0c56280aSSorin BascaInstructionHandle 9127*0c56280aSSorin Basca\family default 9128*0c56280aSSorin Basca is the BCEL's programming handle to instruction objects and that 9129*0c56280aSSorin Basca\emph on 9130*0c56280aSSorin BascaX[] 9131*0c56280aSSorin Basca\emph default 9132*0c56280aSSorin Basca is the common Java notation for 9133*0c56280aSSorin Basca\emph on 9134*0c56280aSSorin Bascaarray of 9135*0c56280aSSorin Basca\emph default 9136*0c56280aSSorin Basca 9137*0c56280aSSorin Basca\emph on 9138*0c56280aSSorin BascaX 9139*0c56280aSSorin Basca\emph default 9140*0c56280aSSorin Basca): 9141*0c56280aSSorin Basca\layout Itemize 9142*0c56280aSSorin Basca 9143*0c56280aSSorin Basca 9144*0c56280aSSorin Basca\emph on 9145*0c56280aSSorin Bascaboolean contains(InstructionHandle) 9146*0c56280aSSorin Basca\emph default 9147*0c56280aSSorin Basca 9148*0c56280aSSorin Basca\newline 9149*0c56280aSSorin BascaReturns true if and only if the given 9150*0c56280aSSorin Basca\family typewriter 9151*0c56280aSSorin BascaInstructionHandle 9152*0c56280aSSorin Basca\family default 9153*0c56280aSSorin Basca refers to an instruction that is part of this subroutine, 9154*0c56280aSSorin Basca\layout Itemize 9155*0c56280aSSorin Basca 9156*0c56280aSSorin Basca 9157*0c56280aSSorin Basca\emph on 9158*0c56280aSSorin BascaInstructionHandle[] getInstructions() 9159*0c56280aSSorin Basca\emph default 9160*0c56280aSSorin Basca 9161*0c56280aSSorin Basca\newline 9162*0c56280aSSorin BascaReturns all instructions that together form this subroutine, 9163*0c56280aSSorin Basca\layout Itemize 9164*0c56280aSSorin Basca 9165*0c56280aSSorin Basca 9166*0c56280aSSorin Basca\emph on 9167*0c56280aSSorin Bascaint[] getAccessedLocalsIndices() 9168*0c56280aSSorin Basca\emph default 9169*0c56280aSSorin Basca 9170*0c56280aSSorin Basca\newline 9171*0c56280aSSorin BascaReturns an array containing the indices of the local variable slots accessed 9172*0c56280aSSorin Basca by this subroutine (read-accessed, write-accessed or both); local variables 9173*0c56280aSSorin Basca referenced by subroutines of this subroutine are not included, 9174*0c56280aSSorin Basca\layout Itemize 9175*0c56280aSSorin Basca 9176*0c56280aSSorin Basca 9177*0c56280aSSorin Basca\emph on 9178*0c56280aSSorin Bascaint[] getRecursivelyAccessedLocalsIndices() 9179*0c56280aSSorin Basca\emph default 9180*0c56280aSSorin Basca 9181*0c56280aSSorin Basca\emph on 9182*0c56280aSSorin Basca 9183*0c56280aSSorin Basca\newline 9184*0c56280aSSorin Basca 9185*0c56280aSSorin Basca\emph default 9186*0c56280aSSorin BascaReturns an array containing the indices of the local variable slots accessed 9187*0c56280aSSorin Basca by this subroutine (read-accessed, write-accessed or both); local variables 9188*0c56280aSSorin Basca referenced by subroutines of this subroutine are included, 9189*0c56280aSSorin Basca\layout Itemize 9190*0c56280aSSorin Basca 9191*0c56280aSSorin Basca 9192*0c56280aSSorin Basca\emph on 9193*0c56280aSSorin BascaSubroutine[] subSubs() 9194*0c56280aSSorin Basca\emph default 9195*0c56280aSSorin Basca 9196*0c56280aSSorin Basca\emph on 9197*0c56280aSSorin Basca 9198*0c56280aSSorin Basca\newline 9199*0c56280aSSorin Basca 9200*0c56280aSSorin Basca\emph default 9201*0c56280aSSorin BascaReturns the subroutines that are directly called from this subroutine, 9202*0c56280aSSorin Basca\layout Itemize 9203*0c56280aSSorin Basca 9204*0c56280aSSorin Basca 9205*0c56280aSSorin Basca\emph on 9206*0c56280aSSorin BascaInstructionHandle[] getEnteringJsrInstructions() 9207*0c56280aSSorin Basca\emph default 9208*0c56280aSSorin Basca 9209*0c56280aSSorin Basca\newline 9210*0c56280aSSorin BascaReturns all the JsrInstructions that have the first instruction of this 9211*0c56280aSSorin Basca subroutine as their target, 9212*0c56280aSSorin Basca\layout Itemize 9213*0c56280aSSorin Basca 9214*0c56280aSSorin Basca 9215*0c56280aSSorin Basca\emph on 9216*0c56280aSSorin BascaInstructionHandle getLeavingRET() 9217*0c56280aSSorin Basca\emph default 9218*0c56280aSSorin Basca 9219*0c56280aSSorin Basca\newline 9220*0c56280aSSorin BascaReturns the one and only RET that leaves the subroutine. 9221*0c56280aSSorin Basca\layout Standard 9222*0c56280aSSorin Basca 9223*0c56280aSSorin BascaTogether with information from a simple analysis of the possible control 9224*0c56280aSSorin Basca flow transfer of all the other instructions but 9225*0c56280aSSorin Basca\latex latex 9226*0c56280aSSorin Basca 9227*0c56280aSSorin Basca\backslash 9228*0c56280aSSorin Bascatexttt{ret} 9229*0c56280aSSorin Basca\latex default 9230*0c56280aSSorin Basca (see section 9231*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass3Spec} 9232*0c56280aSSorin Basca 9233*0c56280aSSorin Basca\end_inset 9234*0c56280aSSorin Basca 9235*0c56280aSSorin Basca), a control flow graph is built. 9236*0c56280aSSorin Basca\layout Subsubsection 9237*0c56280aSSorin Basca 9238*0c56280aSSorin BascaThe Control Flow Graph 9239*0c56280aSSorin Basca\layout Standard 9240*0c56280aSSorin Basca 9241*0c56280aSSorin BascaThe control flow graph is a single instance with respect to a given method 9242*0c56280aSSorin Basca to verify. 9243*0c56280aSSorin Basca It is defined by providing access to a set of contexts of instructions. 9244*0c56280aSSorin Basca These are modeled as instances of the 9245*0c56280aSSorin Basca\emph on 9246*0c56280aSSorin Basca 9247*0c56280aSSorin Basca\family typewriter 9248*0c56280aSSorin Basca\emph default 9249*0c56280aSSorin BascaIn\SpecialChar \- 9250*0c56280aSSorin Bascastruc\SpecialChar \- 9251*0c56280aSSorin Bascation\SpecialChar \- 9252*0c56280aSSorin BascaCon\SpecialChar \- 9253*0c56280aSSorin Bascatext 9254*0c56280aSSorin Basca\family default 9255*0c56280aSSorin Basca interface. 9256*0c56280aSSorin Basca\layout Standard 9257*0c56280aSSorin Basca 9258*0c56280aSSorin BascaThese instances enclose 9259*0c56280aSSorin Basca\family typewriter 9260*0c56280aSSorin BascaInstructionHandle 9261*0c56280aSSorin Basca\family default 9262*0c56280aSSorin Basca objects (which represent an instruction in the bytecode), but they augment 9263*0c56280aSSorin Basca these objects with type information (a set of 9264*0c56280aSSorin Basca\family typewriter 9265*0c56280aSSorin BascaFrame 9266*0c56280aSSorin Basca\family default 9267*0c56280aSSorin Bascas, see below) as needed by the data flow analysis algorithm. 9268*0c56280aSSorin Basca Also, a method called 9269*0c56280aSSorin Basca\emph on 9270*0c56280aSSorin BascagetSuccessors() 9271*0c56280aSSorin Basca\emph default 9272*0c56280aSSorin Bascais provided that calculates the possible control flow successors of a given 9273*0c56280aSSorin Basca 9274*0c56280aSSorin Basca\family typewriter 9275*0c56280aSSorin BascaIn\SpecialChar \- 9276*0c56280aSSorin Bascastruc\SpecialChar \- 9277*0c56280aSSorin Bascation\SpecialChar \- 9278*0c56280aSSorin BascaCon\SpecialChar \- 9279*0c56280aSSorin Bascatext 9280*0c56280aSSorin Basca\family default 9281*0c56280aSSorin Basca instance. 9282*0c56280aSSorin Basca\layout Standard 9283*0c56280aSSorin Basca 9284*0c56280aSSorin BascaThe most notable method defined in the 9285*0c56280aSSorin Basca\family typewriter 9286*0c56280aSSorin BascaIn\SpecialChar \- 9287*0c56280aSSorin Bascastruc\SpecialChar \- 9288*0c56280aSSorin Bascation\SpecialChar \- 9289*0c56280aSSorin BascaCon\SpecialChar \- 9290*0c56280aSSorin Bascatext 9291*0c56280aSSorin Basca\family default 9292*0c56280aSSorin Basca\emph on 9293*0c56280aSSorin Basca 9294*0c56280aSSorin Basca\emph default 9295*0c56280aSSorin Bascainterface is, however, the 9296*0c56280aSSorin Basca\emph on 9297*0c56280aSSorin Bascaexecute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) 9298*0c56280aSSorin Basca\emph default 9299*0c56280aSSorin Basca method. 9300*0c56280aSSorin Basca This method is used to symbolically execute a given instruction. 9301*0c56280aSSorin Basca\layout Standard 9302*0c56280aSSorin Basca 9303*0c56280aSSorin BascaThe 9304*0c56280aSSorin Basca\family typewriter 9305*0c56280aSSorin BascaArrayList 9306*0c56280aSSorin Basca\family default 9307*0c56280aSSorin Basca\emph on 9308*0c56280aSSorin Basca 9309*0c56280aSSorin Basca\emph default 9310*0c56280aSSorin Bascaargument is there to record the subroutine calling chain. 9311*0c56280aSSorin Basca The properly-nested property of JustIce subroutines is exploited here: 9312*0c56280aSSorin Basca one can simply count 9313*0c56280aSSorin Basca\latex latex 9314*0c56280aSSorin Basca 9315*0c56280aSSorin Basca\backslash 9316*0c56280aSSorin Bascatexttt{jsr} 9317*0c56280aSSorin Basca\latex default 9318*0c56280aSSorin Basca/ 9319*0c56280aSSorin Basca\latex latex 9320*0c56280aSSorin Basca 9321*0c56280aSSorin Basca\backslash 9322*0c56280aSSorin Bascatexttt{jsr 9323*0c56280aSSorin Basca\backslash 9324*0c56280aSSorin Basca_w} 9325*0c56280aSSorin Basca\latex default 9326*0c56280aSSorin Basca and 9327*0c56280aSSorin Basca\latex latex 9328*0c56280aSSorin Basca 9329*0c56280aSSorin Basca\backslash 9330*0c56280aSSorin Bascatexttt{ret} 9331*0c56280aSSorin Basca\latex default 9332*0c56280aSSorin Basca instructions, similar to counting opened and closed braces in mathematical 9333*0c56280aSSorin Basca expressions. 9334*0c56280aSSorin Basca\layout Standard 9335*0c56280aSSorin Basca 9336*0c56280aSSorin BascaA 9337*0c56280aSSorin Basca\family typewriter 9338*0c56280aSSorin BascaFrame 9339*0c56280aSSorin Basca\family default 9340*0c56280aSSorin Basca is JustIce's model of an 9341*0c56280aSSorin Basca\emph on 9342*0c56280aSSorin Bascaexecution frame 9343*0c56280aSSorin Basca\emph default 9344*0c56280aSSorin Basca: a local variables array model together with an operand stack model. 9345*0c56280aSSorin Basca Every 9346*0c56280aSSorin Basca\emph on 9347*0c56280aSSorin BascaInstructionContext 9348*0c56280aSSorin Basca\emph default 9349*0c56280aSSorin Basca instance is augmented with such a frame (to be precise, a set of such frames 9350*0c56280aSSorin Basca as discussed in the specification of subroutines, see section 9351*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Pass3Spec} 9352*0c56280aSSorin Basca 9353*0c56280aSSorin Basca\end_inset 9354*0c56280aSSorin Basca 9355*0c56280aSSorin Basca). 9356*0c56280aSSorin Basca\layout Standard 9357*0c56280aSSorin Basca 9358*0c56280aSSorin BascaWhen frames are merged, the 9359*0c56280aSSorin Basca\emph on 9360*0c56280aSSorin Bascaexecute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) 9361*0c56280aSSorin Basca\emph default 9362*0c56280aSSorin Bascamethod of some successor 9363*0c56280aSSorin Basca\family typewriter 9364*0c56280aSSorin BascaInstructionContext 9365*0c56280aSSorin Basca\family default 9366*0c56280aSSorin Basca is called. 9367*0c56280aSSorin Basca The 9368*0c56280aSSorin Basca\family typewriter 9369*0c56280aSSorin BascaFrame 9370*0c56280aSSorin Basca\family default 9371*0c56280aSSorin Basca argument represents is the current type information of the predecessing 9372*0c56280aSSorin Basca 9373*0c56280aSSorin Basca\family typewriter 9374*0c56280aSSorin BascaInstructionContext. 9375*0c56280aSSorin Basca\layout Subsubsection 9376*0c56280aSSorin Basca 9377*0c56280aSSorin BascaVisitors 9378*0c56280aSSorin Basca\layout Standard 9379*0c56280aSSorin Basca 9380*0c56280aSSorin BascaAs in pass 3a, the Visitor pattern of the BCEL 9381*0c56280aSSorin Basca\emph on 9382*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 9383*0c56280aSSorin Bascacode.ge\SpecialChar \- 9384*0c56280aSSorin Bascane\SpecialChar \- 9385*0c56280aSSorin Bascaric 9386*0c56280aSSorin Basca\emph default 9387*0c56280aSSorin Basca API is also used in pass 3b. 9388*0c56280aSSorin Basca While it was used to verify the static constraints of pass three in pass 9389*0c56280aSSorin Basca 3a, it is now used to verify the structural constraints. 9390*0c56280aSSorin Basca\layout Standard 9391*0c56280aSSorin Basca 9392*0c56280aSSorin BascaBefore an instruction 9393*0c56280aSSorin Basca\family typewriter 9394*0c56280aSSorin BascaX 9395*0c56280aSSorin Basca\family default 9396*0c56280aSSorin Basca is symbolically executed, the corresponding 9397*0c56280aSSorin Basca\emph on 9398*0c56280aSSorin BascavisitX(X) 9399*0c56280aSSorin Basca\emph default 9400*0c56280aSSorin Basca method is invoked on an 9401*0c56280aSSorin Basca\family typewriter 9402*0c56280aSSorin BascaInstConstraintVisitor 9403*0c56280aSSorin Basca\family default 9404*0c56280aSSorin Basca instance. 9405*0c56280aSSorin Basca This instance is there to verify all the preconditions are met to safely 9406*0c56280aSSorin Basca execute the instruction 9407*0c56280aSSorin Basca\family typewriter 9408*0c56280aSSorin BascaX 9409*0c56280aSSorin Basca\family default 9410*0c56280aSSorin Basca. 9411*0c56280aSSorin Basca The 9412*0c56280aSSorin Basca\family typewriter 9413*0c56280aSSorin BascaInstConstraintVisitor 9414*0c56280aSSorin Basca\family default 9415*0c56280aSSorin Basca class therefore holds information about the preconditions of all 212 valid 9416*0c56280aSSorin Basca Java bytecode instructions. 9417*0c56280aSSorin Basca A simplified version of this Visitor's 9418*0c56280aSSorin Basca\emph on 9419*0c56280aSSorin BascavisitILOAD(ILOAD) 9420*0c56280aSSorin Basca\emph default 9421*0c56280aSSorin Basca method is listed in algorithm 9422*0c56280aSSorin Basca\begin_inset LatexCommand \ref{visitILOADInstConstraints} 9423*0c56280aSSorin Basca 9424*0c56280aSSorin Basca\end_inset 9425*0c56280aSSorin Basca 9426*0c56280aSSorin Basca. 9427*0c56280aSSorin Basca\layout Standard 9428*0c56280aSSorin Basca 9429*0c56280aSSorin BascaSimilarly, the 9430*0c56280aSSorin Basca\emph on 9431*0c56280aSSorin Basca 9432*0c56280aSSorin Basca\family typewriter 9433*0c56280aSSorin Basca\emph default 9434*0c56280aSSorin BascaExecutionVisitor 9435*0c56280aSSorin Basca\family default 9436*0c56280aSSorin Basca class contains information about the behaviour of every bytecode instruction. 9437*0c56280aSSorin Basca An instance of this class is used to model the effect of the bytecode instructi 9438*0c56280aSSorin Bascaons on a 9439*0c56280aSSorin Basca\emph on 9440*0c56280aSSorin BascaFrame 9441*0c56280aSSorin Basca\emph default 9442*0c56280aSSorin Basca instance. 9443*0c56280aSSorin Basca Algorithm 9444*0c56280aSSorin Basca\begin_inset LatexCommand \ref{visitILOADExecution} 9445*0c56280aSSorin Basca 9446*0c56280aSSorin Basca\end_inset 9447*0c56280aSSorin Basca 9448*0c56280aSSorin Basca shows the 9449*0c56280aSSorin Basca\emph on 9450*0c56280aSSorin BascavisitILOAD(ILOAD) 9451*0c56280aSSorin Basca\emph default 9452*0c56280aSSorin Basca method of this Visitor. 9453*0c56280aSSorin Basca\layout Standard 9454*0c56280aSSorin Basca 9455*0c56280aSSorin Basca\begin_float alg 9456*0c56280aSSorin Basca\layout Caption 9457*0c56280aSSorin Basca 9458*0c56280aSSorin Basca 9459*0c56280aSSorin Basca\begin_inset LatexCommand \label{visitILOADInstConstraints} 9460*0c56280aSSorin Basca 9461*0c56280aSSorin Basca\end_inset 9462*0c56280aSSorin Basca 9463*0c56280aSSorin BascavisitILOAD, Visitor ensuring the structural (dynamic) constraints of instruction 9464*0c56280aSSorin Bascas 9465*0c56280aSSorin Basca\layout Standard 9466*0c56280aSSorin Basca 9467*0c56280aSSorin Basca 9468*0c56280aSSorin Basca\family typewriter 9469*0c56280aSSorin Bascapublic void visitILOAD(ILOAD o){ 9470*0c56280aSSorin Basca\newline 9471*0c56280aSSorin Basca\SpecialChar \- 9472*0c56280aSSorin Basca\SpecialChar ~ 9473*0c56280aSSorin Basca\SpecialChar ~ 9474*0c56280aSSorin Basca\SpecialChar ~ 9475*0c56280aSSorin Basca\SpecialChar ~ 9476*0c56280aSSorin Basca\SpecialChar ~ 9477*0c56280aSSorin Bascaint produce = o.produceStack(cpg); 9478*0c56280aSSorin Basca\newline 9479*0c56280aSSorin Basca\SpecialChar \- 9480*0c56280aSSorin Basca\SpecialChar ~ 9481*0c56280aSSorin Basca\SpecialChar ~ 9482*0c56280aSSorin Basca\SpecialChar ~ 9483*0c56280aSSorin Basca\SpecialChar ~ 9484*0c56280aSSorin Basca\SpecialChar ~ 9485*0c56280aSSorin Bascaif ( produce + stack().slotsUsed() > stack().maxStack() ){ 9486*0c56280aSSorin Basca\newline 9487*0c56280aSSorin Basca\SpecialChar \- 9488*0c56280aSSorin Basca\SpecialChar ~ 9489*0c56280aSSorin Basca\SpecialChar ~ 9490*0c56280aSSorin Basca\SpecialChar ~ 9491*0c56280aSSorin Basca\SpecialChar ~ 9492*0c56280aSSorin Basca\SpecialChar ~ 9493*0c56280aSSorin Basca\SpecialChar ~ 9494*0c56280aSSorin Basca\SpecialChar ~ 9495*0c56280aSSorin BascaconstraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().ma 9496*0c56280aSSorin BascaxStack()-stack().slotsUsed())+" free stack slot(s) left. 9497*0c56280aSSorin Basca\backslash 9498*0c56280aSSorin BascanStack: 9499*0c56280aSSorin Basca\backslash 9500*0c56280aSSorin Bascan"+stack()); 9501*0c56280aSSorin Basca\newline 9502*0c56280aSSorin Basca\SpecialChar \- 9503*0c56280aSSorin Basca\SpecialChar ~ 9504*0c56280aSSorin Basca\SpecialChar ~ 9505*0c56280aSSorin Basca\SpecialChar ~ 9506*0c56280aSSorin Basca\SpecialChar ~ 9507*0c56280aSSorin Basca\SpecialChar ~ 9508*0c56280aSSorin Basca} 9509*0c56280aSSorin Basca\newline 9510*0c56280aSSorin Basca[\SpecialChar \ldots{} 9511*0c56280aSSorin Basca] 9512*0c56280aSSorin Basca\newline 9513*0c56280aSSorin Basca\SpecialChar \- 9514*0c56280aSSorin Basca\SpecialChar ~ 9515*0c56280aSSorin Basca\SpecialChar ~ 9516*0c56280aSSorin Basca} 9517*0c56280aSSorin Basca\end_float 9518*0c56280aSSorin Basca\begin_float alg 9519*0c56280aSSorin Basca\layout Caption 9520*0c56280aSSorin Basca 9521*0c56280aSSorin Basca 9522*0c56280aSSorin Basca\begin_inset LatexCommand \label{visitILOADExecution} 9523*0c56280aSSorin Basca 9524*0c56280aSSorin Basca\end_inset 9525*0c56280aSSorin Basca 9526*0c56280aSSorin BascavisitILOAD, Visitor symbolically executing instructions 9527*0c56280aSSorin Basca\layout Standard 9528*0c56280aSSorin Basca 9529*0c56280aSSorin Basca 9530*0c56280aSSorin Basca\family typewriter 9531*0c56280aSSorin Basca/** Symbolically executes the corresponding Java Virtual Machine instruction. 9532*0c56280aSSorin Basca */ 9533*0c56280aSSorin Basca\newline 9534*0c56280aSSorin Basca\SpecialChar \- 9535*0c56280aSSorin Bascapublic void visitILOAD(ILOAD o){ 9536*0c56280aSSorin Basca\newline 9537*0c56280aSSorin Basca\SpecialChar \- 9538*0c56280aSSorin Basca\SpecialChar ~ 9539*0c56280aSSorin Basca\SpecialChar ~ 9540*0c56280aSSorin Bascastack().push(Type.INT); 9541*0c56280aSSorin Basca\newline 9542*0c56280aSSorin Basca\SpecialChar \- 9543*0c56280aSSorin Basca} 9544*0c56280aSSorin Basca\end_float 9545*0c56280aSSorin Basca\begin_float alg 9546*0c56280aSSorin Basca\layout Caption 9547*0c56280aSSorin Basca 9548*0c56280aSSorin BascaSimplified Core Verification Algorithm of Pass 3b 9549*0c56280aSSorin Basca\layout Standard 9550*0c56280aSSorin Basca 9551*0c56280aSSorin Basca 9552*0c56280aSSorin Basca\series bold 9553*0c56280aSSorin Basca\size small 9554*0c56280aSSorin Bascapublic VerificationResult do_verify(Method m) 9555*0c56280aSSorin Basca\series default 9556*0c56280aSSorin Basca{ 9557*0c56280aSSorin Basca\layout Standard 9558*0c56280aSSorin Basca 9559*0c56280aSSorin Basca 9560*0c56280aSSorin Basca\size small 9561*0c56280aSSorin Basca\SpecialChar \- 9562*0c56280aSSorin Basca\SpecialChar ~ 9563*0c56280aSSorin Basca\SpecialChar ~ 9564*0c56280aSSorin BascaControlFlowGraph cfg; 9565*0c56280aSSorin Basca\layout Standard 9566*0c56280aSSorin Basca 9567*0c56280aSSorin Basca 9568*0c56280aSSorin Basca\size small 9569*0c56280aSSorin Basca\SpecialChar \- 9570*0c56280aSSorin Basca\SpecialChar ~ 9571*0c56280aSSorin Basca\SpecialChar ~ 9572*0c56280aSSorin Bascaif (m.hasCode()) 9573*0c56280aSSorin Basca\layout Standard 9574*0c56280aSSorin Basca 9575*0c56280aSSorin Basca 9576*0c56280aSSorin Basca\size small 9577*0c56280aSSorin Basca\SpecialChar \- 9578*0c56280aSSorin Basca\SpecialChar ~ 9579*0c56280aSSorin Basca\SpecialChar ~ 9580*0c56280aSSorin Basca\SpecialChar ~ 9581*0c56280aSSorin Basca\SpecialChar ~ 9582*0c56280aSSorin Bascacfg = new ControlFlowGraph(m) 9583*0c56280aSSorin Basca\layout Standard 9584*0c56280aSSorin Basca 9585*0c56280aSSorin Basca 9586*0c56280aSSorin Basca\size small 9587*0c56280aSSorin Basca\SpecialChar \- 9588*0c56280aSSorin Basca\SpecialChar ~ 9589*0c56280aSSorin Basca\SpecialChar ~ 9590*0c56280aSSorin Bascaelse 9591*0c56280aSSorin Basca\layout Standard 9592*0c56280aSSorin Basca 9593*0c56280aSSorin Basca 9594*0c56280aSSorin Basca\size small 9595*0c56280aSSorin Basca\SpecialChar \- 9596*0c56280aSSorin Basca\SpecialChar ~ 9597*0c56280aSSorin Basca\SpecialChar ~ 9598*0c56280aSSorin Basca\SpecialChar ~ 9599*0c56280aSSorin Basca\SpecialChar ~ 9600*0c56280aSSorin Bascareturn Good_VerificationResult; 9601*0c56280aSSorin Basca\layout Standard 9602*0c56280aSSorin Basca 9603*0c56280aSSorin Basca 9604*0c56280aSSorin Basca\size small 9605*0c56280aSSorin Basca\SpecialChar \- 9606*0c56280aSSorin Basca\SpecialChar ~ 9607*0c56280aSSorin Basca\SpecialChar ~ 9608*0c56280aSSorin BascaFrame f = new Frame(); 9609*0c56280aSSorin Basca\shape slanted 9610*0c56280aSSorin Basca// local variables and operand stack 9611*0c56280aSSorin Basca\layout Standard 9612*0c56280aSSorin Basca 9613*0c56280aSSorin Basca 9614*0c56280aSSorin Basca\size small 9615*0c56280aSSorin Basca\SpecialChar \- 9616*0c56280aSSorin Basca\SpecialChar ~ 9617*0c56280aSSorin Basca\SpecialChar ~ 9618*0c56280aSSorin Bascaf.localVariables().initialize(m.signature()); 9619*0c56280aSSorin Basca\shape slanted 9620*0c56280aSSorin Basca// put formal param types into loc. 9621*0c56280aSSorin Basca vars 9622*0c56280aSSorin Basca\layout Standard 9623*0c56280aSSorin Basca 9624*0c56280aSSorin Basca 9625*0c56280aSSorin Basca\size small 9626*0c56280aSSorin Basca\SpecialChar \- 9627*0c56280aSSorin Basca\SpecialChar ~ 9628*0c56280aSSorin Basca\SpecialChar ~ 9629*0c56280aSSorin BascaInstConstraintVisitor icv = new InstConstraintVisitor(); 9630*0c56280aSSorin Basca\layout Standard 9631*0c56280aSSorin Basca 9632*0c56280aSSorin Basca 9633*0c56280aSSorin Basca\size small 9634*0c56280aSSorin Basca\SpecialChar \- 9635*0c56280aSSorin Basca\SpecialChar ~ 9636*0c56280aSSorin Basca\SpecialChar ~ 9637*0c56280aSSorin BascaExecutionVisitor ev = new ExecutionVisitor(); 9638*0c56280aSSorin Basca\layout Standard 9639*0c56280aSSorin Basca 9640*0c56280aSSorin Basca 9641*0c56280aSSorin Basca\size small 9642*0c56280aSSorin Basca\SpecialChar \- 9643*0c56280aSSorin Basca\SpecialChar ~ 9644*0c56280aSSorin Basca\SpecialChar ~ 9645*0c56280aSSorin Bascatry{ 9646*0c56280aSSorin Basca\layout Standard 9647*0c56280aSSorin Basca 9648*0c56280aSSorin Basca 9649*0c56280aSSorin Basca\size small 9650*0c56280aSSorin Basca\SpecialChar \- 9651*0c56280aSSorin Basca\SpecialChar ~ 9652*0c56280aSSorin Basca\SpecialChar ~ 9653*0c56280aSSorin Basca\SpecialChar ~ 9654*0c56280aSSorin Basca\SpecialChar ~ 9655*0c56280aSSorin BascacirculationPump(cfg, f, icv, ev); 9656*0c56280aSSorin Basca\layout Standard 9657*0c56280aSSorin Basca 9658*0c56280aSSorin Basca 9659*0c56280aSSorin Basca\size small 9660*0c56280aSSorin Basca\SpecialChar \- 9661*0c56280aSSorin Basca\SpecialChar ~ 9662*0c56280aSSorin Basca\SpecialChar ~ 9663*0c56280aSSorin Basca} 9664*0c56280aSSorin Basca\layout Standard 9665*0c56280aSSorin Basca 9666*0c56280aSSorin Basca 9667*0c56280aSSorin Basca\size small 9668*0c56280aSSorin Basca\SpecialChar \- 9669*0c56280aSSorin Basca\SpecialChar ~ 9670*0c56280aSSorin Basca\SpecialChar ~ 9671*0c56280aSSorin Bascacatch(VerificationFailure){ 9672*0c56280aSSorin Basca\layout Standard 9673*0c56280aSSorin Basca 9674*0c56280aSSorin Basca 9675*0c56280aSSorin Basca\size small 9676*0c56280aSSorin Basca\SpecialChar \- 9677*0c56280aSSorin Basca\SpecialChar ~ 9678*0c56280aSSorin Basca\SpecialChar ~ 9679*0c56280aSSorin Basca\SpecialChar ~ 9680*0c56280aSSorin Basca\SpecialChar ~ 9681*0c56280aSSorin Bascareturn Bad_VerificationResult; 9682*0c56280aSSorin Basca\layout Standard 9683*0c56280aSSorin Basca 9684*0c56280aSSorin Basca 9685*0c56280aSSorin Basca\size small 9686*0c56280aSSorin Basca\SpecialChar \- 9687*0c56280aSSorin Basca\SpecialChar ~ 9688*0c56280aSSorin Basca\SpecialChar ~ 9689*0c56280aSSorin Basca} 9690*0c56280aSSorin Basca\layout Standard 9691*0c56280aSSorin Basca 9692*0c56280aSSorin Basca 9693*0c56280aSSorin Basca\size small 9694*0c56280aSSorin Basca\SpecialChar \- 9695*0c56280aSSorin Basca\SpecialChar ~ 9696*0c56280aSSorin Basca\SpecialChar ~ 9697*0c56280aSSorin Bascareturn Good_VerificationResult; 9698*0c56280aSSorin Basca\layout Standard 9699*0c56280aSSorin Basca 9700*0c56280aSSorin Basca 9701*0c56280aSSorin Basca\size small 9702*0c56280aSSorin Basca} 9703*0c56280aSSorin Basca\newline 9704*0c56280aSSorin Basca 9705*0c56280aSSorin Basca\layout Standard 9706*0c56280aSSorin Basca 9707*0c56280aSSorin Basca 9708*0c56280aSSorin Basca\series bold 9709*0c56280aSSorin Basca\size small 9710*0c56280aSSorin Bascapublic void circulationPump(ControlflowGraph cfg, Frame startFrame, InstConstrai 9711*0c56280aSSorin BascantVisitor icv, ExecutionVisitor ev) throws VerificationFailure 9712*0c56280aSSorin Basca\series default 9713*0c56280aSSorin Basca{ 9714*0c56280aSSorin Basca\layout Standard 9715*0c56280aSSorin Basca 9716*0c56280aSSorin Basca 9717*0c56280aSSorin Basca\size small 9718*0c56280aSSorin BascaInstruction start = cfg.getFirstInstruction(); 9719*0c56280aSSorin Basca\layout Standard 9720*0c56280aSSorin Basca 9721*0c56280aSSorin Basca 9722*0c56280aSSorin Basca\shape slanted 9723*0c56280aSSorin Basca\size small 9724*0c56280aSSorin Basca/* 9725*0c56280aSSorin Basca\layout Standard 9726*0c56280aSSorin Basca 9727*0c56280aSSorin Basca 9728*0c56280aSSorin Basca\shape slanted 9729*0c56280aSSorin Basca\size small 9730*0c56280aSSorin BascaNow merge the first frame (type info) into the first instruction. 9731*0c56280aSSorin Basca\layout Standard 9732*0c56280aSSorin Basca 9733*0c56280aSSorin Basca 9734*0c56280aSSorin Basca\shape slanted 9735*0c56280aSSorin Basca\size small 9736*0c56280aSSorin BascaEmpty list -> no instructions have been executed before. 9737*0c56280aSSorin Basca\layout Standard 9738*0c56280aSSorin Basca 9739*0c56280aSSorin Basca 9740*0c56280aSSorin Basca\shape slanted 9741*0c56280aSSorin Basca\size small 9742*0c56280aSSorin Basca*/ 9743*0c56280aSSorin Basca\layout Standard 9744*0c56280aSSorin Basca 9745*0c56280aSSorin Basca 9746*0c56280aSSorin Basca\size small 9747*0c56280aSSorin Bascastart.execute(startFrame, EmptyInstructionList, icv, ev); 9748*0c56280aSSorin Basca\layout Standard 9749*0c56280aSSorin Basca 9750*0c56280aSSorin Basca 9751*0c56280aSSorin Basca\shape slanted 9752*0c56280aSSorin Basca\size small 9753*0c56280aSSorin Basca/* 9754*0c56280aSSorin Basca\layout Standard 9755*0c56280aSSorin Basca 9756*0c56280aSSorin Basca 9757*0c56280aSSorin Basca\shape slanted 9758*0c56280aSSorin Basca\size small 9759*0c56280aSSorin BascaQ is a Queue of pairs (Instruction, InstructionList). 9760*0c56280aSSorin Basca\layout Standard 9761*0c56280aSSorin Basca 9762*0c56280aSSorin Basca 9763*0c56280aSSorin Basca\shape slanted 9764*0c56280aSSorin Basca\size small 9765*0c56280aSSorin Basca*/ 9766*0c56280aSSorin Basca\layout Standard 9767*0c56280aSSorin Basca 9768*0c56280aSSorin Basca 9769*0c56280aSSorin Basca\size small 9770*0c56280aSSorin BascaQueue Q = EmptyQueue; 9771*0c56280aSSorin Basca\layout Standard 9772*0c56280aSSorin Basca 9773*0c56280aSSorin Basca 9774*0c56280aSSorin Basca\shape slanted 9775*0c56280aSSorin Basca\size small 9776*0c56280aSSorin Basca/* 9777*0c56280aSSorin Basca\layout Standard 9778*0c56280aSSorin Basca 9779*0c56280aSSorin Basca 9780*0c56280aSSorin Basca\shape slanted 9781*0c56280aSSorin Basca\size small 9782*0c56280aSSorin BascaPut the first instruction into the queue. 9783*0c56280aSSorin Basca This is similar to initializing a breadth first search. 9784*0c56280aSSorin Basca\layout Standard 9785*0c56280aSSorin Basca 9786*0c56280aSSorin Basca 9787*0c56280aSSorin Basca\shape slanted 9788*0c56280aSSorin Basca\size small 9789*0c56280aSSorin Basca*/ 9790*0c56280aSSorin Basca\layout Standard 9791*0c56280aSSorin Basca 9792*0c56280aSSorin Basca 9793*0c56280aSSorin Basca\size small 9794*0c56280aSSorin BascaQ.add (start, EmptyInstructionList); 9795*0c56280aSSorin Basca\layout Standard 9796*0c56280aSSorin Basca 9797*0c56280aSSorin Basca 9798*0c56280aSSorin Basca\shape slanted 9799*0c56280aSSorin Basca\size small 9800*0c56280aSSorin Basca/* 9801*0c56280aSSorin Basca\layout Standard 9802*0c56280aSSorin Basca 9803*0c56280aSSorin Basca 9804*0c56280aSSorin Basca\shape slanted 9805*0c56280aSSorin Basca\size small 9806*0c56280aSSorin BascaThe main loop 9807*0c56280aSSorin Basca\layout Standard 9808*0c56280aSSorin Basca 9809*0c56280aSSorin Basca 9810*0c56280aSSorin Basca\shape slanted 9811*0c56280aSSorin Basca\size small 9812*0c56280aSSorin Basca*/ 9813*0c56280aSSorin Basca\layout Standard 9814*0c56280aSSorin Basca 9815*0c56280aSSorin Basca 9816*0c56280aSSorin Basca\size small 9817*0c56280aSSorin Bascawhile (Q.isNotEmpty()){ 9818*0c56280aSSorin Basca\layout Standard 9819*0c56280aSSorin Basca 9820*0c56280aSSorin Basca 9821*0c56280aSSorin Basca\size small 9822*0c56280aSSorin Basca\SpecialChar \- 9823*0c56280aSSorin Basca\SpecialChar ~ 9824*0c56280aSSorin Basca\SpecialChar ~ 9825*0c56280aSSorin BascaInstruction u = fst(Q.head()); 9826*0c56280aSSorin Basca\layout Standard 9827*0c56280aSSorin Basca 9828*0c56280aSSorin Basca 9829*0c56280aSSorin Basca\size small 9830*0c56280aSSorin Basca\SpecialChar \- 9831*0c56280aSSorin Basca\SpecialChar ~ 9832*0c56280aSSorin Basca\SpecialChar ~ 9833*0c56280aSSorin BascaInstructionList ec = snd(Q.head()); 9834*0c56280aSSorin Basca\layout Standard 9835*0c56280aSSorin Basca 9836*0c56280aSSorin Basca 9837*0c56280aSSorin Basca\size small 9838*0c56280aSSorin Basca\SpecialChar \- 9839*0c56280aSSorin Basca\SpecialChar ~ 9840*0c56280aSSorin Basca\SpecialChar ~ 9841*0c56280aSSorin BascaQ.removeHead(); 9842*0c56280aSSorin Basca\layout Standard 9843*0c56280aSSorin Basca 9844*0c56280aSSorin Basca 9845*0c56280aSSorin Basca\size small 9846*0c56280aSSorin Basca\SpecialChar \- 9847*0c56280aSSorin Basca\SpecialChar ~ 9848*0c56280aSSorin Basca\SpecialChar ~ 9849*0c56280aSSorin BascaInstructionList oldchain = ec; 9850*0c56280aSSorin Basca\layout Standard 9851*0c56280aSSorin Basca 9852*0c56280aSSorin Basca 9853*0c56280aSSorin Basca\size small 9854*0c56280aSSorin Basca\SpecialChar \- 9855*0c56280aSSorin Basca\SpecialChar ~ 9856*0c56280aSSorin Basca\SpecialChar ~ 9857*0c56280aSSorin BascaInstructionList newchain = ec++[u]; 9858*0c56280aSSorin Basca\layout Standard 9859*0c56280aSSorin Basca 9860*0c56280aSSorin Basca 9861*0c56280aSSorin Basca\size small 9862*0c56280aSSorin Basca\SpecialChar \- 9863*0c56280aSSorin Basca\SpecialChar ~ 9864*0c56280aSSorin Basca\SpecialChar ~ 9865*0c56280aSSorin Bascafor (all successors v of u){ 9866*0c56280aSSorin Basca\layout Standard 9867*0c56280aSSorin Basca 9868*0c56280aSSorin Basca 9869*0c56280aSSorin Basca\size small 9870*0c56280aSSorin Basca\SpecialChar \- 9871*0c56280aSSorin Basca\SpecialChar ~ 9872*0c56280aSSorin Basca\SpecialChar ~ 9873*0c56280aSSorin Basca\SpecialChar ~ 9874*0c56280aSSorin Basca\SpecialChar ~ 9875*0c56280aSSorin Basca 9876*0c56280aSSorin Basca\shape slanted 9877*0c56280aSSorin Basca/* 9878*0c56280aSSorin Basca\layout Standard 9879*0c56280aSSorin Basca 9880*0c56280aSSorin Basca 9881*0c56280aSSorin Basca\shape slanted 9882*0c56280aSSorin Basca\size small 9883*0c56280aSSorin Basca\SpecialChar \- 9884*0c56280aSSorin Basca\SpecialChar ~ 9885*0c56280aSSorin Basca\SpecialChar ~ 9886*0c56280aSSorin Basca\SpecialChar ~ 9887*0c56280aSSorin Basca\SpecialChar ~ 9888*0c56280aSSorin Bascaexecute returns true if type info has changed. 9889*0c56280aSSorin Basca It may throw VerificationFailures. 9890*0c56280aSSorin Basca\layout Standard 9891*0c56280aSSorin Basca 9892*0c56280aSSorin Basca 9893*0c56280aSSorin Basca\shape slanted 9894*0c56280aSSorin Basca\size small 9895*0c56280aSSorin Basca\SpecialChar \- 9896*0c56280aSSorin Basca\SpecialChar ~ 9897*0c56280aSSorin Basca\SpecialChar ~ 9898*0c56280aSSorin Basca\SpecialChar ~ 9899*0c56280aSSorin Basca\SpecialChar ~ 9900*0c56280aSSorin Basca*/ 9901*0c56280aSSorin Basca\layout Standard 9902*0c56280aSSorin Basca 9903*0c56280aSSorin Basca 9904*0c56280aSSorin Basca\size small 9905*0c56280aSSorin Basca\SpecialChar \- 9906*0c56280aSSorin Basca\SpecialChar ~ 9907*0c56280aSSorin Basca\SpecialChar ~ 9908*0c56280aSSorin Basca\SpecialChar ~ 9909*0c56280aSSorin Basca\SpecialChar ~ 9910*0c56280aSSorin Bascaif (v.execute(u.getOutFrame(oldchain), newchain,icv,ev)) 9911*0c56280aSSorin Basca\layout Standard 9912*0c56280aSSorin Basca 9913*0c56280aSSorin Basca 9914*0c56280aSSorin Basca\size small 9915*0c56280aSSorin Basca\SpecialChar \- 9916*0c56280aSSorin Basca\SpecialChar ~ 9917*0c56280aSSorin Basca\SpecialChar ~ 9918*0c56280aSSorin Basca\SpecialChar ~ 9919*0c56280aSSorin Basca\SpecialChar ~ 9920*0c56280aSSorin Basca\SpecialChar ~ 9921*0c56280aSSorin Basca\SpecialChar ~ 9922*0c56280aSSorin BascaQ.add((v, newchain)); 9923*0c56280aSSorin Basca\layout Standard 9924*0c56280aSSorin Basca 9925*0c56280aSSorin Basca 9926*0c56280aSSorin Basca\size small 9927*0c56280aSSorin Basca\SpecialChar \- 9928*0c56280aSSorin Basca\SpecialChar ~ 9929*0c56280aSSorin Basca\SpecialChar ~ 9930*0c56280aSSorin Basca} 9931*0c56280aSSorin Basca\layout Standard 9932*0c56280aSSorin Basca 9933*0c56280aSSorin Basca 9934*0c56280aSSorin Basca\size small 9935*0c56280aSSorin Basca} 9936*0c56280aSSorin Basca\end_float 9937*0c56280aSSorin Basca\layout Subsubsection 9938*0c56280aSSorin Basca 9939*0c56280aSSorin Basca 9940*0c56280aSSorin Basca\begin_inset LatexCommand \label{ComparisonSubroutines} 9941*0c56280aSSorin Basca 9942*0c56280aSSorin Basca\end_inset 9943*0c56280aSSorin Basca 9944*0c56280aSSorin BascaComparison to Sun's Implementation 9945*0c56280aSSorin Basca\layout Standard 9946*0c56280aSSorin Basca 9947*0c56280aSSorin BascaJustIce was originally aimed to be as compatible to Sun's implementation 9948*0c56280aSSorin Basca as possible. 9949*0c56280aSSorin Basca However, the unclear specification prevents clean room implementations 9950*0c56280aSSorin Basca (i.e., implementations whose programmers did not look into Sun's code) from 9951*0c56280aSSorin Basca perfect compatibility. 9952*0c56280aSSorin Basca\layout Standard 9953*0c56280aSSorin Basca 9954*0c56280aSSorin BascaFortunately, it JustIce closely matches Sun's implementation in its behaviour. 9955*0c56280aSSorin Basca As a test case, the author verified the transitive hull of the referenced 9956*0c56280aSSorin Basca class files starting with the 9957*0c56280aSSorin Basca\emph on 9958*0c56280aSSorin Bascade.fub.bytecode.verifier.Verifier 9959*0c56280aSSorin Basca\emph default 9960*0c56280aSSorin Basca class. 9961*0c56280aSSorin Basca This set includes most of the classes of the Java 2 API supplied by Sun 9962*0c56280aSSorin Basca Microsystems, i.e., a few hundreds of apparently correct classes. 9963*0c56280aSSorin Basca A very small number of class files was rejected by JustIce because of its 9964*0c56280aSSorin Basca different specification of subroutine constraints. 9965*0c56280aSSorin Basca No other rejects were encountered. 9966*0c56280aSSorin Basca\layout Standard 9967*0c56280aSSorin Basca 9968*0c56280aSSorin BascaMost class files that are found to be rejected by Sun's verifier implementations 9969*0c56280aSSorin Basca are rejected by JustIce, too. 9970*0c56280aSSorin Basca\layout Standard 9971*0c56280aSSorin Basca 9972*0c56280aSSorin BascaHowever, there are class file rejected by Sun's verifier implementations 9973*0c56280aSSorin Basca but not by JustIce. 9974*0c56280aSSorin Basca This should not occur, but JustIce does not mimic the programming errors 9975*0c56280aSSorin Basca of Sun's verifiers so far. 9976*0c56280aSSorin Basca Please see section 9977*0c56280aSSorin Basca\begin_inset LatexCommand \ref{javacRejected} 9978*0c56280aSSorin Basca 9979*0c56280aSSorin Basca\end_inset 9980*0c56280aSSorin Basca 9981*0c56280aSSorin Basca for a discussion on a selected incompatibility issue. 9982*0c56280aSSorin Basca\layout Standard 9983*0c56280aSSorin Basca 9984*0c56280aSSorin BascaAn automated testing suite could solidify the trust in JustIce's implementation 9985*0c56280aSSorin Basca which is not implemented yet. 9986*0c56280aSSorin Basca Please see section 9987*0c56280aSSorin Basca\begin_inset LatexCommand \ref{VerifierValidationSuite} 9988*0c56280aSSorin Basca 9989*0c56280aSSorin Basca\end_inset 9990*0c56280aSSorin Basca 9991*0c56280aSSorin Basca for a discussion on that topic. 9992*0c56280aSSorin Basca\layout Section 9993*0c56280aSSorin Basca 9994*0c56280aSSorin BascaPass Four 9995*0c56280aSSorin Basca\layout Standard 9996*0c56280aSSorin Basca 9997*0c56280aSSorin BascaThe tests Sun's verifiers perform during run-time but which in principle 9998*0c56280aSSorin Basca could be performed in pass three 9999*0c56280aSSorin Basca\emph on 10000*0c56280aSSorin Bascaare 10001*0c56280aSSorin Basca\emph default 10002*0c56280aSSorin Basca performed in pass 3a by JustIce. 10003*0c56280aSSorin Basca\layout Subsubsection 10004*0c56280aSSorin Basca 10005*0c56280aSSorin BascaComparison to Sun's Implementation 10006*0c56280aSSorin Basca\layout Standard 10007*0c56280aSSorin Basca 10008*0c56280aSSorin BascaIt sems natural that Sun's verifier implements the specification by Sun. 10009*0c56280aSSorin Basca Obviously, JustIce has no run-time so JustIce has no pass four. 10010*0c56280aSSorin Basca The checks Sun performs in pass four 10011*0c56280aSSorin Basca\begin_float footnote 10012*0c56280aSSorin Basca\layout Standard 10013*0c56280aSSorin Basca 10014*0c56280aSSorin BascaSome JVMs expose implementation mistakes concerning pass four verification. 10015*0c56280aSSorin Basca See section 10016*0c56280aSSorin Basca\begin_inset LatexCommand \ref{PassFourBug} 10017*0c56280aSSorin Basca 10018*0c56280aSSorin Basca\end_inset 10019*0c56280aSSorin Basca 10020*0c56280aSSorin Basca. 10021*0c56280aSSorin Basca\end_float 10022*0c56280aSSorin Basca are performed in pass 3a by JustIce. 10023*0c56280aSSorin Basca\layout Chapter 10024*0c56280aSSorin Basca 10025*0c56280aSSorin Basca 10026*0c56280aSSorin Basca\begin_inset LatexCommand \label{Verification API} 10027*0c56280aSSorin Basca 10028*0c56280aSSorin Basca\end_inset 10029*0c56280aSSorin Basca 10030*0c56280aSSorin BascaThe Verification API 10031*0c56280aSSorin Basca\layout Section 10032*0c56280aSSorin Basca 10033*0c56280aSSorin BascaIntroduction 10034*0c56280aSSorin Basca\layout Standard 10035*0c56280aSSorin Basca 10036*0c56280aSSorin BascaThe Application Programming Interface (API) of JustIce uses object oriented 10037*0c56280aSSorin Basca design patterns 10038*0c56280aSSorin Basca\begin_inset LatexCommand \cite{DesignPatterns} 10039*0c56280aSSorin Basca 10040*0c56280aSSorin Basca\end_inset 10041*0c56280aSSorin Basca 10042*0c56280aSSorin Basca. 10043*0c56280aSSorin Basca Readers not familiar with design patterns are encouraged to read at least 10044*0c56280aSSorin Basca about the 10045*0c56280aSSorin Basca\emph on 10046*0c56280aSSorin BascaVisitor 10047*0c56280aSSorin Basca\emph default 10048*0c56280aSSorin Basca, 10049*0c56280aSSorin Basca\emph on 10050*0c56280aSSorin BascaSingleton 10051*0c56280aSSorin Basca\emph default 10052*0c56280aSSorin Basca, 10053*0c56280aSSorin Basca\emph on 10054*0c56280aSSorin BascaObserver 10055*0c56280aSSorin Basca\emph default 10056*0c56280aSSorin Basca and 10057*0c56280aSSorin Basca\emph on 10058*0c56280aSSorin BascaFactory 10059*0c56280aSSorin Basca\emph default 10060*0c56280aSSorin Basca patterns. 10061*0c56280aSSorin Basca\layout Standard 10062*0c56280aSSorin Basca 10063*0c56280aSSorin BascaJustIce currently consists of four packages: 10064*0c56280aSSorin Basca\emph on 10065*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 10066*0c56280aSSorin Bascacode.veri\SpecialChar \- 10067*0c56280aSSorin Bascafier 10068*0c56280aSSorin Basca\emph default 10069*0c56280aSSorin Basca, 10070*0c56280aSSorin Basca\emph on 10071*0c56280aSSorin Bascade.fub. 10072*0c56280aSSorin Basca byte\SpecialChar \- 10073*0c56280aSSorin Bascacode.veri\SpecialChar \- 10074*0c56280aSSorin Bascafier.exc 10075*0c56280aSSorin Basca\emph default 10076*0c56280aSSorin Basca, 10077*0c56280aSSorin Basca\emph on 10078*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 10079*0c56280aSSorin Bascacode.veri\SpecialChar \- 10080*0c56280aSSorin Bascafier.statics 10081*0c56280aSSorin Basca\emph default 10082*0c56280aSSorin Basca and 10083*0c56280aSSorin Basca\emph on 10084*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 10085*0c56280aSSorin Bascacode.veri\SpecialChar \- 10086*0c56280aSSorin Bascafier. 10087*0c56280aSSorin Basca struc\SpecialChar \- 10088*0c56280aSSorin Bascatu\SpecialChar \- 10089*0c56280aSSorin Bascarals 10090*0c56280aSSorin Basca\emph default 10091*0c56280aSSorin Basca. 10092*0c56280aSSorin Basca (We shall from now on omit the preceding 10093*0c56280aSSorin Basca\emph on 10094*0c56280aSSorin Bascade.fub.byte\SpecialChar \- 10095*0c56280aSSorin Bascacode 10096*0c56280aSSorin Basca\emph default 10097*0c56280aSSorin Basca.) The most important of them is the 10098*0c56280aSSorin Basca\emph on 10099*0c56280aSSorin Bascaverifier 10100*0c56280aSSorin Basca\emph default 10101*0c56280aSSorin Basca package. 10102*0c56280aSSorin Basca The class 10103*0c56280aSSorin Basca\family typewriter 10104*0c56280aSSorin BascaVerifierFactory 10105*0c56280aSSorin Basca\family default 10106*0c56280aSSorin Basca can be found here; this is the place where all verification starts. 10107*0c56280aSSorin Basca The 10108*0c56280aSSorin Basca\family typewriter 10109*0c56280aSSorin BascaVeri\SpecialChar \- 10110*0c56280aSSorin Bascafier\SpecialChar \- 10111*0c56280aSSorin BascaFac\SpecialChar \- 10112*0c56280aSSorin Bascatory 10113*0c56280aSSorin Basca\family default 10114*0c56280aSSorin Basca creates 10115*0c56280aSSorin Basca\family typewriter 10116*0c56280aSSorin BascaVerifier 10117*0c56280aSSorin Basca\family default 10118*0c56280aSSorin Basca instances; only the 10119*0c56280aSSorin Basca\family typewriter 10120*0c56280aSSorin BascaVerifierFactory 10121*0c56280aSSorin Basca\family default 10122*0c56280aSSorin Basca can create these instances. 10123*0c56280aSSorin Basca A 10124*0c56280aSSorin Basca\family typewriter 10125*0c56280aSSorin BascaVerifier 10126*0c56280aSSorin Basca\family default 10127*0c56280aSSorin Basca instance, in turn, has a one-to-one relationship with a class file to verify, 10128*0c56280aSSorin Basca 10129*0c56280aSSorin Basca\begin_inset Quotes eld 10130*0c56280aSSorin Basca\end_inset 10131*0c56280aSSorin Basca 10132*0c56280aSSorin Bascaits class 10133*0c56280aSSorin Basca\begin_inset Quotes erd 10134*0c56280aSSorin Basca\end_inset 10135*0c56280aSSorin Basca 10136*0c56280aSSorin Basca. 10137*0c56280aSSorin Basca You can instruct a 10138*0c56280aSSorin Basca\family typewriter 10139*0c56280aSSorin BascaVerifier 10140*0c56280aSSorin Basca\family default 10141*0c56280aSSorin Basca instance to run a verification pass on its class yielding a 10142*0c56280aSSorin Basca\family typewriter 10143*0c56280aSSorin BascaVerificationResult 10144*0c56280aSSorin Basca\family default 10145*0c56280aSSorin Basca. 10146*0c56280aSSorin Basca\layout Standard 10147*0c56280aSSorin Basca 10148*0c56280aSSorin BascaAll class files are fetched from the BCEL's class file repository, i.e., the 10149*0c56280aSSorin Basca class 10150*0c56280aSSorin Basca\family typewriter 10151*0c56280aSSorin BascaRe\SpecialChar \- 10152*0c56280aSSorin Bascapo\SpecialChar \- 10153*0c56280aSSorin Bascasi\SpecialChar \- 10154*0c56280aSSorin Bascato\SpecialChar \- 10155*0c56280aSSorin Bascary 10156*0c56280aSSorin Basca\family default 10157*0c56280aSSorin Basca. 10158*0c56280aSSorin Basca The class files stored there are either put there by the user or they are 10159*0c56280aSSorin Basca read from the file system. 10160*0c56280aSSorin Basca For a bytecode engineer who uses the BCEL this is convenient, because one 10161*0c56280aSSorin Basca does not have to save the dynamically created class file first in order 10162*0c56280aSSorin Basca to load it into JustIce. 10163*0c56280aSSorin Basca\layout Standard 10164*0c56280aSSorin Basca 10165*0c56280aSSorin BascaPass 1 and pass 2 are related to the 10166*0c56280aSSorin Basca\family typewriter 10167*0c56280aSSorin BascaClassFile 10168*0c56280aSSorin Basca\family default 10169*0c56280aSSorin Basca structure as such; passes 3a and 3b verify the bytecode of a method. 10170*0c56280aSSorin Basca If a class file was created using the BCEL, the BCEL user already knows 10171*0c56280aSSorin Basca how the 10172*0c56280aSSorin Basca\family typewriter 10173*0c56280aSSorin BascaJavaClass 10174*0c56280aSSorin Basca\family default 10175*0c56280aSSorin Basca object looks like 10176*0c56280aSSorin Basca\begin_float footnote 10177*0c56280aSSorin Basca\layout Standard 10178*0c56280aSSorin Basca 10179*0c56280aSSorin BascaA 10180*0c56280aSSorin Basca\family typewriter 10181*0c56280aSSorin BascaJavaClass 10182*0c56280aSSorin Basca\family default 10183*0c56280aSSorin Basca object represents a class file in the BCEL. 10184*0c56280aSSorin Basca\end_float 10185*0c56280aSSorin Basca. 10186*0c56280aSSorin Basca The number of methods is known and the order of the methods in the class 10187*0c56280aSSorin Basca file is known. 10188*0c56280aSSorin Basca\layout Standard 10189*0c56280aSSorin Basca 10190*0c56280aSSorin BascaHowever, if this is not the case, one usually does not know the number of 10191*0c56280aSSorin Basca methods in a class file or the order of these methods. 10192*0c56280aSSorin Basca To carefully extract this information from an untrusted class file, one 10193*0c56280aSSorin Basca should first let a pass-2-verification run on this file. 10194*0c56280aSSorin Basca Afterwards, the information can be read from the 10195*0c56280aSSorin Basca\family typewriter 10196*0c56280aSSorin BascaJavaClass 10197*0c56280aSSorin Basca\family default 10198*0c56280aSSorin Basca object the BCEL offers. 10199*0c56280aSSorin Basca\layout Standard 10200*0c56280aSSorin Basca 10201*0c56280aSSorin BascaFinally, one is able to supply the 10202*0c56280aSSorin Basca\begin_inset Quotes eld 10203*0c56280aSSorin Basca\end_inset 10204*0c56280aSSorin Basca 10205*0c56280aSSorin Bascamethod index 10206*0c56280aSSorin Basca\begin_inset Quotes erd 10207*0c56280aSSorin Basca\end_inset 10208*0c56280aSSorin Basca 10209*0c56280aSSorin Basca needed by verification passes 3a and 3b. 10210*0c56280aSSorin Basca\layout Standard 10211*0c56280aSSorin Basca 10212*0c56280aSSorin BascaBasically, after pass 2 has been run successfully on a class file, one can 10213*0c56280aSSorin Basca safely use the methods in the BCEL's 10214*0c56280aSSorin Basca\emph on 10215*0c56280aSSorin Basca classfile 10216*0c56280aSSorin Basca\emph default 10217*0c56280aSSorin Bascapackage 10218*0c56280aSSorin Basca\emph on 10219*0c56280aSSorin Basca 10220*0c56280aSSorin Basca\emph default 10221*0c56280aSSorin Bascaon that class file. 10222*0c56280aSSorin Basca After pass 3a has been run successfully on a method, one can safely work 10223*0c56280aSSorin Basca on that method using the BCEL's 10224*0c56280aSSorin Basca\emph on 10225*0c56280aSSorin Bascageneric 10226*0c56280aSSorin Basca\emph default 10227*0c56280aSSorin Basca package. 10228*0c56280aSSorin Basca After pass 3b has been run successfully on all methods in a class file, 10229*0c56280aSSorin Basca this class file will not be rejected by other verifiers. 10230*0c56280aSSorin Basca\layout Standard 10231*0c56280aSSorin Basca 10232*0c56280aSSorin BascaOften, the run of a verification pass implies recursively verifying other 10233*0c56280aSSorin Basca class files as well (because they are somehow referenced). 10234*0c56280aSSorin Basca Therefore, 10235*0c56280aSSorin Basca\emph on 10236*0c56280aSSorin BascaVerifier 10237*0c56280aSSorin Basca\emph default 10238*0c56280aSSorin Basca instances for these referenced classes are created transparently. 10239*0c56280aSSorin Basca To be notified when such an event occurs, one can implement the 10240*0c56280aSSorin Basca\emph on 10241*0c56280aSSorin BascaVerifierFactoryObserver 10242*0c56280aSSorin Basca\emph default 10243*0c56280aSSorin Bascainterface and let the 10244*0c56280aSSorin Basca\emph on 10245*0c56280aSSorin BascaVerifierFactory 10246*0c56280aSSorin Basca\emph default 10247*0c56280aSSorin Basca register your implementation. 10248*0c56280aSSorin Basca\layout Standard 10249*0c56280aSSorin Basca 10250*0c56280aSSorin Basca\begin_float fig 10251*0c56280aSSorin Basca\layout Standard 10252*0c56280aSSorin Basca\align center 10253*0c56280aSSorin Basca 10254*0c56280aSSorin Basca\begin_inset Figure size 595 863 10255*0c56280aSSorin Bascafile VerificationAPI.eps 10256*0c56280aSSorin Bascawidth 3 100 10257*0c56280aSSorin Bascaangle 90 10258*0c56280aSSorin Bascaflags 1 10259*0c56280aSSorin Basca 10260*0c56280aSSorin Basca\end_inset 10261*0c56280aSSorin Basca 10262*0c56280aSSorin Basca 10263*0c56280aSSorin Basca\layout Caption 10264*0c56280aSSorin Basca 10265*0c56280aSSorin BascaUML class diagram of the Verification API 10266*0c56280aSSorin Basca\end_float 10267*0c56280aSSorin Basca\layout Standard 10268*0c56280aSSorin Basca 10269*0c56280aSSorin BascaA Verifier creates instances of PassVerifiers. 10270*0c56280aSSorin Basca A PassVerifier instance in charge of performing some later verification 10271*0c56280aSSorin Basca pass transparently creates PassVerifier instances for the preceding passes. 10272*0c56280aSSorin Basca Therefore, users of the Verification API do not have to care about the 10273*0c56280aSSorin Basca order of verification passes; i.e., earlier passes are run always before 10274*0c56280aSSorin Basca later passes. 10275*0c56280aSSorin Basca All verification results are cached; this way an unsual order of calls 10276*0c56280aSSorin Basca to the 10277*0c56280aSSorin Basca\emph on 10278*0c56280aSSorin BascadoPassX() 10279*0c56280aSSorin Basca\emph default 10280*0c56280aSSorin Basca methods of the 10281*0c56280aSSorin Basca\emph on 10282*0c56280aSSorin BascaVerifier 10283*0c56280aSSorin Basca\emph default 10284*0c56280aSSorin Basca class does not even waste computing time. 10285*0c56280aSSorin Basca\begin_float fig 10286*0c56280aSSorin Basca\layout Standard 10287*0c56280aSSorin Basca\align center 10288*0c56280aSSorin Basca 10289*0c56280aSSorin Basca\begin_inset Figure size 595 631 10290*0c56280aSSorin Bascafile V_API_SD.eps 10291*0c56280aSSorin Bascawidth 3 100 10292*0c56280aSSorin Bascaheight 3 75 10293*0c56280aSSorin Bascaflags 9 10294*0c56280aSSorin Basca 10295*0c56280aSSorin Basca\end_inset 10296*0c56280aSSorin Basca 10297*0c56280aSSorin Basca 10298*0c56280aSSorin Basca\layout Caption 10299*0c56280aSSorin Basca 10300*0c56280aSSorin BascaInformal UML sequence diagram showing the dependency of verification pass 10301*0c56280aSSorin Basca two on verification pass one. 10302*0c56280aSSorin Basca\end_float 10303*0c56280aSSorin Basca\layout Section 10304*0c56280aSSorin Basca 10305*0c56280aSSorin BascaSome Example Code 10306*0c56280aSSorin Basca\layout Standard 10307*0c56280aSSorin Basca 10308*0c56280aSSorin BascaThe code below shows an example of how to use the API provided by JustIce. 10309*0c56280aSSorin Basca It will verify the transitive hull of all referenced class files. 10310*0c56280aSSorin Basca Normally, while verifying a class, referenced classes are recursively verified 10311*0c56280aSSorin Basca performing 10312*0c56280aSSorin Basca\emph on 10313*0c56280aSSorin Bascaearlier 10314*0c56280aSSorin Basca\emph default 10315*0c56280aSSorin Basca passes. 10316*0c56280aSSorin Basca Verifiers that are using pass 1 on their class will not load in any other 10317*0c56280aSSorin Basca classes (see section 10318*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SpecPasses} 10319*0c56280aSSorin Basca 10320*0c56280aSSorin Basca\end_inset 10321*0c56280aSSorin Basca 10322*0c56280aSSorin Basca). 10323*0c56280aSSorin Basca Therefore, normally the transitive hull is 10324*0c56280aSSorin Basca\emph on 10325*0c56280aSSorin Bascanot 10326*0c56280aSSorin Basca\emph default 10327*0c56280aSSorin Basca verified completely (it usually does not make sense to verify it, though 10328*0c56280aSSorin Basca -- it's done here only to give an example of what can be done). 10329*0c56280aSSorin Basca\family typewriter 10330*0c56280aSSorin Basca\size small 10331*0c56280aSSorin Basca 10332*0c56280aSSorin Basca\newline 10333*0c56280aSSorin Basca 10334*0c56280aSSorin Basca\newline 10335*0c56280aSSorin Basca01\SpecialChar ~ 10336*0c56280aSSorin Bascapackage de.fub.bytecode.verifier; 10337*0c56280aSSorin Basca\newline 10338*0c56280aSSorin Basca02\SpecialChar ~ 10339*0c56280aSSorin Bascaimport de.fub.bytecode.verifier.*; 10340*0c56280aSSorin Basca\newline 10341*0c56280aSSorin Basca03\SpecialChar ~ 10342*0c56280aSSorin Bascaimport de.fub.bytecode.classfile.*; 10343*0c56280aSSorin Basca\newline 10344*0c56280aSSorin Basca04\SpecialChar ~ 10345*0c56280aSSorin Bascaimport de.fub.bytecode.*; 10346*0c56280aSSorin Basca\newline 10347*0c56280aSSorin Basca05\SpecialChar ~ 10348*0c56280aSSorin Basca/** 10349*0c56280aSSorin Basca\newline 10350*0c56280aSSorin Basca06\SpecialChar ~ 10351*0c56280aSSorin Basca\SpecialChar ~ 10352*0c56280aSSorin Basca* This class has a main method implementing a demonstration program 10353*0c56280aSSorin Basca\newline 10354*0c56280aSSorin Basca07\SpecialChar ~ 10355*0c56280aSSorin Basca\SpecialChar ~ 10356*0c56280aSSorin Basca* of how to use the VerifierFactoryObserver. 10357*0c56280aSSorin Basca It transitively verifies 10358*0c56280aSSorin Basca\newline 10359*0c56280aSSorin Basca08\SpecialChar ~ 10360*0c56280aSSorin Basca\SpecialChar ~ 10361*0c56280aSSorin Basca* all class files encountered; this may take up a lot of time and, 10362*0c56280aSSorin Basca\newline 10363*0c56280aSSorin Basca09\SpecialChar ~ 10364*0c56280aSSorin Basca\SpecialChar ~ 10365*0c56280aSSorin Basca* more notably, memory. 10366*0c56280aSSorin Basca 10367*0c56280aSSorin Basca\newline 10368*0c56280aSSorin Basca10\SpecialChar ~ 10369*0c56280aSSorin Basca\SpecialChar ~ 10370*0c56280aSSorin Basca* 10371*0c56280aSSorin Basca\newline 10372*0c56280aSSorin Basca11\SpecialChar ~ 10373*0c56280aSSorin Basca\SpecialChar ~ 10374*0c56280aSSorin Basca* @author Enver Haase 10375*0c56280aSSorin Basca\newline 10376*0c56280aSSorin Basca12\SpecialChar ~ 10377*0c56280aSSorin Basca\SpecialChar ~ 10378*0c56280aSSorin Basca*/ 10379*0c56280aSSorin Basca\newline 10380*0c56280aSSorin Basca13\SpecialChar ~ 10381*0c56280aSSorin Bascapublic class TransitiveHull implements VerifierFactoryObserver{ 10382*0c56280aSSorin Basca\newline 10383*0c56280aSSorin Basca14\SpecialChar ~ 10384*0c56280aSSorin Basca\SpecialChar ~ 10385*0c56280aSSorin Basca\SpecialChar ~ 10386*0c56280aSSorin Basca/** Used for indentation. 10387*0c56280aSSorin Basca */ 10388*0c56280aSSorin Basca\newline 10389*0c56280aSSorin Basca15\SpecialChar ~ 10390*0c56280aSSorin Basca\SpecialChar ~ 10391*0c56280aSSorin Basca\SpecialChar ~ 10392*0c56280aSSorin Bascaprivate int indent = 0; 10393*0c56280aSSorin Basca\newline 10394*0c56280aSSorin Basca16\SpecialChar ~ 10395*0c56280aSSorin Basca\SpecialChar ~ 10396*0c56280aSSorin Basca\SpecialChar ~ 10397*0c56280aSSorin Basca/** Not publicly instantiable. 10398*0c56280aSSorin Basca */ 10399*0c56280aSSorin Basca\newline 10400*0c56280aSSorin Basca17\SpecialChar ~ 10401*0c56280aSSorin Basca\SpecialChar ~ 10402*0c56280aSSorin Basca\SpecialChar ~ 10403*0c56280aSSorin Bascaprivate TransitiveHull(){ } 10404*0c56280aSSorin Basca\newline 10405*0c56280aSSorin Basca18 10406*0c56280aSSorin Basca\newline 10407*0c56280aSSorin Basca19\SpecialChar ~ 10408*0c56280aSSorin Basca\SpecialChar ~ 10409*0c56280aSSorin Basca\SpecialChar ~ 10410*0c56280aSSorin Basca/* Implementing VerifierFactoryObserver. 10411*0c56280aSSorin Basca */ 10412*0c56280aSSorin Basca\newline 10413*0c56280aSSorin Basca20\SpecialChar ~ 10414*0c56280aSSorin Basca\SpecialChar ~ 10415*0c56280aSSorin Basca\SpecialChar ~ 10416*0c56280aSSorin Bascapublic void update(String classname){ 10417*0c56280aSSorin Basca\newline 10418*0c56280aSSorin Basca21\SpecialChar ~ 10419*0c56280aSSorin Basca\SpecialChar ~ 10420*0c56280aSSorin Basca\SpecialChar ~ 10421*0c56280aSSorin Basca\SpecialChar ~ 10422*0c56280aSSorin Basca\SpecialChar ~ 10423*0c56280aSSorin Bascafor (int i=0; i<indent; i++) { 10424*0c56280aSSorin Basca\newline 10425*0c56280aSSorin Basca22\SpecialChar ~ 10426*0c56280aSSorin Basca\SpecialChar ~ 10427*0c56280aSSorin Basca\SpecialChar ~ 10428*0c56280aSSorin Basca\SpecialChar ~ 10429*0c56280aSSorin Basca\SpecialChar ~ 10430*0c56280aSSorin Basca\SpecialChar ~ 10431*0c56280aSSorin Basca\SpecialChar ~ 10432*0c56280aSSorin BascaSystem.out.print(" "); 10433*0c56280aSSorin Basca\newline 10434*0c56280aSSorin Basca23\SpecialChar ~ 10435*0c56280aSSorin Basca\SpecialChar ~ 10436*0c56280aSSorin Basca\SpecialChar ~ 10437*0c56280aSSorin Basca\SpecialChar ~ 10438*0c56280aSSorin Basca\SpecialChar ~ 10439*0c56280aSSorin Basca} 10440*0c56280aSSorin Basca\newline 10441*0c56280aSSorin Basca24\SpecialChar ~ 10442*0c56280aSSorin Basca\SpecialChar ~ 10443*0c56280aSSorin Basca\SpecialChar ~ 10444*0c56280aSSorin Basca\SpecialChar ~ 10445*0c56280aSSorin Basca\SpecialChar ~ 10446*0c56280aSSorin BascaSystem.out.println(classname); 10447*0c56280aSSorin Basca\newline 10448*0c56280aSSorin Basca25\SpecialChar ~ 10449*0c56280aSSorin Basca\SpecialChar ~ 10450*0c56280aSSorin Basca\SpecialChar ~ 10451*0c56280aSSorin Basca\SpecialChar ~ 10452*0c56280aSSorin Basca\SpecialChar ~ 10453*0c56280aSSorin Bascaindent += 1; 10454*0c56280aSSorin Basca\newline 10455*0c56280aSSorin Basca26\SpecialChar ~ 10456*0c56280aSSorin Basca\SpecialChar ~ 10457*0c56280aSSorin Basca\SpecialChar ~ 10458*0c56280aSSorin Basca\SpecialChar ~ 10459*0c56280aSSorin Basca\SpecialChar ~ 10460*0c56280aSSorin BascaVerifier v = VerifierFactory.getVerifier(classname); 10461*0c56280aSSorin Basca\newline 10462*0c56280aSSorin Basca27\SpecialChar ~ 10463*0c56280aSSorin Basca\SpecialChar ~ 10464*0c56280aSSorin Basca\SpecialChar ~ 10465*0c56280aSSorin Basca\SpecialChar ~ 10466*0c56280aSSorin Basca\SpecialChar ~ 10467*0c56280aSSorin BascaVerificationResult vr; 10468*0c56280aSSorin Basca\newline 10469*0c56280aSSorin Basca28\SpecialChar ~ 10470*0c56280aSSorin Basca\SpecialChar ~ 10471*0c56280aSSorin Basca\SpecialChar ~ 10472*0c56280aSSorin Basca\SpecialChar ~ 10473*0c56280aSSorin Basca\SpecialChar ~ 10474*0c56280aSSorin Bascavr = v.doPass1(); 10475*0c56280aSSorin Basca\newline 10476*0c56280aSSorin Basca29\SpecialChar ~ 10477*0c56280aSSorin Basca\SpecialChar ~ 10478*0c56280aSSorin Basca\SpecialChar ~ 10479*0c56280aSSorin Basca\SpecialChar ~ 10480*0c56280aSSorin Basca\SpecialChar ~ 10481*0c56280aSSorin Bascaif (vr != VerificationResult.VR_OK) 10482*0c56280aSSorin Basca\newline 10483*0c56280aSSorin Basca30\SpecialChar ~ 10484*0c56280aSSorin Basca\SpecialChar ~ 10485*0c56280aSSorin Basca\SpecialChar ~ 10486*0c56280aSSorin Basca\SpecialChar ~ 10487*0c56280aSSorin Basca\SpecialChar ~ 10488*0c56280aSSorin Basca\SpecialChar ~ 10489*0c56280aSSorin Basca\SpecialChar ~ 10490*0c56280aSSorin BascaSystem.out.println("Pass 1: 10491*0c56280aSSorin Basca\backslash 10492*0c56280aSSorin Bascan"+vr); 10493*0c56280aSSorin Basca\newline 10494*0c56280aSSorin Basca31\SpecialChar ~ 10495*0c56280aSSorin Basca\SpecialChar ~ 10496*0c56280aSSorin Basca\SpecialChar ~ 10497*0c56280aSSorin Basca\SpecialChar ~ 10498*0c56280aSSorin Basca\SpecialChar ~ 10499*0c56280aSSorin Bascavr = v.doPass2(); 10500*0c56280aSSorin Basca\newline 10501*0c56280aSSorin Basca32\SpecialChar ~ 10502*0c56280aSSorin Basca\SpecialChar ~ 10503*0c56280aSSorin Basca\SpecialChar ~ 10504*0c56280aSSorin Basca\SpecialChar ~ 10505*0c56280aSSorin Basca\SpecialChar ~ 10506*0c56280aSSorin Bascaif (vr != VerificationResult.VR_OK) 10507*0c56280aSSorin Basca\newline 10508*0c56280aSSorin Basca33\SpecialChar ~ 10509*0c56280aSSorin Basca\SpecialChar ~ 10510*0c56280aSSorin Basca\SpecialChar ~ 10511*0c56280aSSorin Basca\SpecialChar ~ 10512*0c56280aSSorin Basca\SpecialChar ~ 10513*0c56280aSSorin Basca\SpecialChar ~ 10514*0c56280aSSorin Basca\SpecialChar ~ 10515*0c56280aSSorin BascaSystem.out.println("Pass 2: 10516*0c56280aSSorin Basca\backslash 10517*0c56280aSSorin Bascan"+vr); 10518*0c56280aSSorin Basca\newline 10519*0c56280aSSorin Basca34\SpecialChar ~ 10520*0c56280aSSorin Basca\SpecialChar ~ 10521*0c56280aSSorin Basca\SpecialChar ~ 10522*0c56280aSSorin Basca\SpecialChar ~ 10523*0c56280aSSorin Basca\SpecialChar ~ 10524*0c56280aSSorin Bascaif (vr == VerificationResult.VR_OK){ 10525*0c56280aSSorin Basca\newline 10526*0c56280aSSorin Basca35\SpecialChar ~ 10527*0c56280aSSorin Basca\SpecialChar ~ 10528*0c56280aSSorin Basca\SpecialChar ~ 10529*0c56280aSSorin Basca\SpecialChar ~ 10530*0c56280aSSorin Basca\SpecialChar ~ 10531*0c56280aSSorin Basca\SpecialChar ~ 10532*0c56280aSSorin Basca\SpecialChar ~ 10533*0c56280aSSorin BascaJavaClass jc = Repository.lookupClass(v.getClassName()); 10534*0c56280aSSorin Basca\newline 10535*0c56280aSSorin Basca36\SpecialChar ~ 10536*0c56280aSSorin Basca\SpecialChar ~ 10537*0c56280aSSorin Basca\SpecialChar ~ 10538*0c56280aSSorin Basca\SpecialChar ~ 10539*0c56280aSSorin Basca\SpecialChar ~ 10540*0c56280aSSorin Basca\SpecialChar ~ 10541*0c56280aSSorin Basca\SpecialChar ~ 10542*0c56280aSSorin Bascafor (int i=0; i<jc.getMethods().length; i++){ 10543*0c56280aSSorin Basca\newline 10544*0c56280aSSorin Basca37\SpecialChar ~ 10545*0c56280aSSorin Basca\SpecialChar ~ 10546*0c56280aSSorin Basca\SpecialChar ~ 10547*0c56280aSSorin Basca\SpecialChar ~ 10548*0c56280aSSorin Basca\SpecialChar ~ 10549*0c56280aSSorin Basca\SpecialChar ~ 10550*0c56280aSSorin Basca\SpecialChar ~ 10551*0c56280aSSorin Basca\SpecialChar ~ 10552*0c56280aSSorin Basca\SpecialChar ~ 10553*0c56280aSSorin Bascavr = v.doPass3a(i); 10554*0c56280aSSorin Basca\newline 10555*0c56280aSSorin Basca38\SpecialChar ~ 10556*0c56280aSSorin Basca\SpecialChar ~ 10557*0c56280aSSorin Basca\SpecialChar ~ 10558*0c56280aSSorin Basca\SpecialChar ~ 10559*0c56280aSSorin Basca\SpecialChar ~ 10560*0c56280aSSorin Basca\SpecialChar ~ 10561*0c56280aSSorin Basca\SpecialChar ~ 10562*0c56280aSSorin Basca\SpecialChar ~ 10563*0c56280aSSorin Basca\SpecialChar ~ 10564*0c56280aSSorin Bascaif (vr != VerificationResult.VR_OK) 10565*0c56280aSSorin Basca\newline 10566*0c56280aSSorin Basca39\SpecialChar ~ 10567*0c56280aSSorin Basca\SpecialChar ~ 10568*0c56280aSSorin Basca\SpecialChar ~ 10569*0c56280aSSorin Basca\SpecialChar ~ 10570*0c56280aSSorin Basca\SpecialChar ~ 10571*0c56280aSSorin Basca\SpecialChar ~ 10572*0c56280aSSorin Basca\SpecialChar ~ 10573*0c56280aSSorin Basca\SpecialChar ~ 10574*0c56280aSSorin Basca\SpecialChar ~ 10575*0c56280aSSorin Basca\SpecialChar ~ 10576*0c56280aSSorin Basca\SpecialChar ~ 10577*0c56280aSSorin BascaSystem.out.println(v.getClassName()+", Pass 3a, method "+ 10578*0c56280aSSorin Basca\newline 10579*0c56280aSSorin Basca\SpecialChar \- 10580*0c56280aSSorin Basca\SpecialChar ~ 10581*0c56280aSSorin Basca\SpecialChar ~ 10582*0c56280aSSorin Basca\SpecialChar ~ 10583*0c56280aSSorin Basca\SpecialChar ~ 10584*0c56280aSSorin Basca\SpecialChar ~ 10585*0c56280aSSorin Basca\SpecialChar ~ 10586*0c56280aSSorin Basca\SpecialChar ~ 10587*0c56280aSSorin Basca\SpecialChar ~ 10588*0c56280aSSorin Basca\SpecialChar ~ 10589*0c56280aSSorin Basca\SpecialChar ~ 10590*0c56280aSSorin Basca\SpecialChar ~ 10591*0c56280aSSorin Basca\SpecialChar ~ 10592*0c56280aSSorin Basca\SpecialChar ~ 10593*0c56280aSSorin Bascai+" ['"+jc.getMethods()[i]+"']: 10594*0c56280aSSorin Basca\backslash 10595*0c56280aSSorin Bascan"+vr); 10596*0c56280aSSorin Basca\newline 10597*0c56280aSSorin Basca40\SpecialChar ~ 10598*0c56280aSSorin Basca\SpecialChar ~ 10599*0c56280aSSorin Basca\SpecialChar ~ 10600*0c56280aSSorin Basca\SpecialChar ~ 10601*0c56280aSSorin Basca\SpecialChar ~ 10602*0c56280aSSorin Basca\SpecialChar ~ 10603*0c56280aSSorin Basca\SpecialChar ~ 10604*0c56280aSSorin Basca\SpecialChar ~ 10605*0c56280aSSorin Basca\SpecialChar ~ 10606*0c56280aSSorin Bascavr = v.doPass3b(i); 10607*0c56280aSSorin Basca\newline 10608*0c56280aSSorin Basca41\SpecialChar ~ 10609*0c56280aSSorin Basca\SpecialChar ~ 10610*0c56280aSSorin Basca\SpecialChar ~ 10611*0c56280aSSorin Basca\SpecialChar ~ 10612*0c56280aSSorin Basca\SpecialChar ~ 10613*0c56280aSSorin Basca\SpecialChar ~ 10614*0c56280aSSorin Basca\SpecialChar ~ 10615*0c56280aSSorin Basca\SpecialChar ~ 10616*0c56280aSSorin Basca\SpecialChar ~ 10617*0c56280aSSorin Bascaif (vr != VerificationResult.VR_OK) 10618*0c56280aSSorin Basca\newline 10619*0c56280aSSorin Basca42\SpecialChar ~ 10620*0c56280aSSorin Basca\SpecialChar ~ 10621*0c56280aSSorin Basca\SpecialChar ~ 10622*0c56280aSSorin Basca\SpecialChar ~ 10623*0c56280aSSorin Basca\SpecialChar ~ 10624*0c56280aSSorin Basca\SpecialChar ~ 10625*0c56280aSSorin Basca\SpecialChar ~ 10626*0c56280aSSorin Basca\SpecialChar ~ 10627*0c56280aSSorin Basca\SpecialChar ~ 10628*0c56280aSSorin Basca\SpecialChar ~ 10629*0c56280aSSorin Basca\SpecialChar ~ 10630*0c56280aSSorin BascaSystem.out.println(v.getClassName()+", Pass 3b, method "+ 10631*0c56280aSSorin Basca\newline 10632*0c56280aSSorin Basca\SpecialChar \- 10633*0c56280aSSorin Basca\SpecialChar ~ 10634*0c56280aSSorin Basca\SpecialChar ~ 10635*0c56280aSSorin Basca\SpecialChar ~ 10636*0c56280aSSorin Basca\SpecialChar ~ 10637*0c56280aSSorin Basca\SpecialChar ~ 10638*0c56280aSSorin Basca\SpecialChar ~ 10639*0c56280aSSorin Basca\SpecialChar ~ 10640*0c56280aSSorin Basca\SpecialChar ~ 10641*0c56280aSSorin Basca\SpecialChar ~ 10642*0c56280aSSorin Basca\SpecialChar ~ 10643*0c56280aSSorin Basca\SpecialChar ~ 10644*0c56280aSSorin Basca\SpecialChar ~ 10645*0c56280aSSorin Basca\SpecialChar ~ 10646*0c56280aSSorin Bascai+" ['"+jc.getMethods()[i]+"']: 10647*0c56280aSSorin Basca\backslash 10648*0c56280aSSorin Bascan"+vr); 10649*0c56280aSSorin Basca\newline 10650*0c56280aSSorin Basca43\SpecialChar ~ 10651*0c56280aSSorin Basca\SpecialChar ~ 10652*0c56280aSSorin Basca\SpecialChar ~ 10653*0c56280aSSorin Basca\SpecialChar ~ 10654*0c56280aSSorin Basca\SpecialChar ~ 10655*0c56280aSSorin Basca\SpecialChar ~ 10656*0c56280aSSorin Basca\SpecialChar ~ 10657*0c56280aSSorin Basca} 10658*0c56280aSSorin Basca\newline 10659*0c56280aSSorin Basca44\SpecialChar ~ 10660*0c56280aSSorin Basca\SpecialChar ~ 10661*0c56280aSSorin Basca\SpecialChar ~ 10662*0c56280aSSorin Basca\SpecialChar ~ 10663*0c56280aSSorin Basca\SpecialChar ~ 10664*0c56280aSSorin Basca} 10665*0c56280aSSorin Basca\newline 10666*0c56280aSSorin Basca45\SpecialChar ~ 10667*0c56280aSSorin Basca\SpecialChar ~ 10668*0c56280aSSorin Basca\SpecialChar ~ 10669*0c56280aSSorin Basca\SpecialChar ~ 10670*0c56280aSSorin Basca\SpecialChar ~ 10671*0c56280aSSorin Bascaindent -= 1; 10672*0c56280aSSorin Basca\newline 10673*0c56280aSSorin Basca46\SpecialChar ~ 10674*0c56280aSSorin Basca\SpecialChar ~ 10675*0c56280aSSorin Basca\SpecialChar ~ 10676*0c56280aSSorin Basca} 10677*0c56280aSSorin Basca\newline 10678*0c56280aSSorin Basca47 10679*0c56280aSSorin Basca\newline 10680*0c56280aSSorin Basca48\SpecialChar ~ 10681*0c56280aSSorin Basca\SpecialChar ~ 10682*0c56280aSSorin Basca/** 10683*0c56280aSSorin Basca\newline 10684*0c56280aSSorin Basca49\SpecialChar ~ 10685*0c56280aSSorin Basca\SpecialChar ~ 10686*0c56280aSSorin Basca\SpecialChar ~ 10687*0c56280aSSorin Basca* This method implements a demonstration program 10688*0c56280aSSorin Basca\newline 10689*0c56280aSSorin Basca50\SpecialChar ~ 10690*0c56280aSSorin Basca\SpecialChar ~ 10691*0c56280aSSorin Basca\SpecialChar ~ 10692*0c56280aSSorin Basca* of how to use the VerifierFactoryObserver. 10693*0c56280aSSorin Basca It transitively 10694*0c56280aSSorin Basca\newline 10695*0c56280aSSorin Basca51\SpecialChar ~ 10696*0c56280aSSorin Basca\SpecialChar ~ 10697*0c56280aSSorin Basca\SpecialChar ~ 10698*0c56280aSSorin Basca* verifies all class files encountered; this may take up a 10699*0c56280aSSorin Basca\newline 10700*0c56280aSSorin Basca52\SpecialChar ~ 10701*0c56280aSSorin Basca\SpecialChar ~ 10702*0c56280aSSorin Basca\SpecialChar ~ 10703*0c56280aSSorin Basca* lot of time and, more notably, memory. 10704*0c56280aSSorin Basca 10705*0c56280aSSorin Basca\newline 10706*0c56280aSSorin Basca53\SpecialChar ~ 10707*0c56280aSSorin Basca\SpecialChar ~ 10708*0c56280aSSorin Basca\SpecialChar ~ 10709*0c56280aSSorin Basca*/ 10710*0c56280aSSorin Basca\newline 10711*0c56280aSSorin Basca54\SpecialChar ~ 10712*0c56280aSSorin Basca\SpecialChar ~ 10713*0c56280aSSorin Basca\SpecialChar ~ 10714*0c56280aSSorin Bascapublic static void main(String[] args){ 10715*0c56280aSSorin Basca\newline 10716*0c56280aSSorin Basca55\SpecialChar ~ 10717*0c56280aSSorin Basca\SpecialChar ~ 10718*0c56280aSSorin Basca\SpecialChar ~ 10719*0c56280aSSorin Basca\SpecialChar ~ 10720*0c56280aSSorin Basca\SpecialChar ~ 10721*0c56280aSSorin Bascaif (args.length != 1){ 10722*0c56280aSSorin Basca\newline 10723*0c56280aSSorin Basca56\SpecialChar ~ 10724*0c56280aSSorin Basca\SpecialChar ~ 10725*0c56280aSSorin Basca\SpecialChar ~ 10726*0c56280aSSorin Basca\SpecialChar ~ 10727*0c56280aSSorin Basca\SpecialChar ~ 10728*0c56280aSSorin Basca\SpecialChar ~ 10729*0c56280aSSorin Basca\SpecialChar ~ 10730*0c56280aSSorin BascaSystem.out.println("Need exactly one argument: The root class 10731*0c56280aSSorin Basca\newline 10732*0c56280aSSorin Basca\SpecialChar \- 10733*0c56280aSSorin Basca\SpecialChar ~ 10734*0c56280aSSorin Basca\SpecialChar ~ 10735*0c56280aSSorin Basca\SpecialChar ~ 10736*0c56280aSSorin Basca\SpecialChar ~ 10737*0c56280aSSorin Basca\SpecialChar ~ 10738*0c56280aSSorin Basca\SpecialChar ~ 10739*0c56280aSSorin Basca\SpecialChar ~ 10740*0c56280aSSorin Basca\SpecialChar ~ 10741*0c56280aSSorin Basca\SpecialChar ~ 10742*0c56280aSSorin Bascato verify."); 10743*0c56280aSSorin Basca\newline 10744*0c56280aSSorin Basca57\SpecialChar ~ 10745*0c56280aSSorin Basca\SpecialChar ~ 10746*0c56280aSSorin Basca\SpecialChar ~ 10747*0c56280aSSorin Basca\SpecialChar ~ 10748*0c56280aSSorin Basca\SpecialChar ~ 10749*0c56280aSSorin Basca\SpecialChar ~ 10750*0c56280aSSorin Basca\SpecialChar ~ 10751*0c56280aSSorin BascaSystem.exit(1); 10752*0c56280aSSorin Basca\newline 10753*0c56280aSSorin Basca58\SpecialChar ~ 10754*0c56280aSSorin Basca\SpecialChar ~ 10755*0c56280aSSorin Basca\SpecialChar ~ 10756*0c56280aSSorin Basca\SpecialChar ~ 10757*0c56280aSSorin Basca\SpecialChar ~ 10758*0c56280aSSorin Basca} 10759*0c56280aSSorin Basca\newline 10760*0c56280aSSorin Basca59\SpecialChar ~ 10761*0c56280aSSorin Basca\SpecialChar ~ 10762*0c56280aSSorin Basca\SpecialChar ~ 10763*0c56280aSSorin Basca\SpecialChar ~ 10764*0c56280aSSorin Basca\SpecialChar ~ 10765*0c56280aSSorin Bascaint dotclasspos = args[0].lastIndexOf(".class"); 10766*0c56280aSSorin Basca\newline 10767*0c56280aSSorin Basca60\SpecialChar ~ 10768*0c56280aSSorin Basca\SpecialChar ~ 10769*0c56280aSSorin Basca\SpecialChar ~ 10770*0c56280aSSorin Basca\SpecialChar ~ 10771*0c56280aSSorin Basca\SpecialChar ~ 10772*0c56280aSSorin Bascaif (dotclasspos != -1) 10773*0c56280aSSorin Basca\newline 10774*0c56280aSSorin Basca61\SpecialChar ~ 10775*0c56280aSSorin Basca\SpecialChar ~ 10776*0c56280aSSorin Basca\SpecialChar ~ 10777*0c56280aSSorin Basca\SpecialChar ~ 10778*0c56280aSSorin Basca\SpecialChar ~ 10779*0c56280aSSorin Basca\SpecialChar ~ 10780*0c56280aSSorin Basca\SpecialChar ~ 10781*0c56280aSSorin Bascaargs[0] = args[0].substring(0,dotclasspos); args[0] = 10782*0c56280aSSorin Basca\newline 10783*0c56280aSSorin Basca\SpecialChar \- 10784*0c56280aSSorin Basca\SpecialChar ~ 10785*0c56280aSSorin Basca\SpecialChar ~ 10786*0c56280aSSorin Basca\SpecialChar ~ 10787*0c56280aSSorin Basca\SpecialChar ~ 10788*0c56280aSSorin Basca\SpecialChar ~ 10789*0c56280aSSorin Basca\SpecialChar ~ 10790*0c56280aSSorin Basca\SpecialChar ~ 10791*0c56280aSSorin Basca\SpecialChar ~ 10792*0c56280aSSorin Basca\SpecialChar ~ 10793*0c56280aSSorin Bascaargs[0].replace('/', '.'); 10794*0c56280aSSorin Basca\newline 10795*0c56280aSSorin Basca62\SpecialChar ~ 10796*0c56280aSSorin Basca\SpecialChar ~ 10797*0c56280aSSorin Basca\SpecialChar ~ 10798*0c56280aSSorin Basca\SpecialChar ~ 10799*0c56280aSSorin Basca\SpecialChar ~ 10800*0c56280aSSorin BascaTransitiveHull th = new TransitiveHull(); 10801*0c56280aSSorin Basca\newline 10802*0c56280aSSorin Basca63\SpecialChar ~ 10803*0c56280aSSorin Basca\SpecialChar ~ 10804*0c56280aSSorin Basca\SpecialChar ~ 10805*0c56280aSSorin Basca\SpecialChar ~ 10806*0c56280aSSorin Basca\SpecialChar ~ 10807*0c56280aSSorin BascaVerifierFactory.attach(th); 10808*0c56280aSSorin Basca\newline 10809*0c56280aSSorin Basca64\SpecialChar ~ 10810*0c56280aSSorin Basca\SpecialChar ~ 10811*0c56280aSSorin Basca\SpecialChar ~ 10812*0c56280aSSorin Basca\SpecialChar ~ 10813*0c56280aSSorin Basca\SpecialChar ~ 10814*0c56280aSSorin BascaVerifierFactory.getVerifier(args[0]); // the observer is called 10815*0c56280aSSorin Basca\newline 10816*0c56280aSSorin Basca\SpecialChar \- 10817*0c56280aSSorin Basca\SpecialChar ~ 10818*0c56280aSSorin Basca\SpecialChar ~ 10819*0c56280aSSorin Basca\SpecialChar ~ 10820*0c56280aSSorin Basca\SpecialChar ~ 10821*0c56280aSSorin Basca\SpecialChar ~ 10822*0c56280aSSorin Basca\SpecialChar ~ 10823*0c56280aSSorin Basca\SpecialChar ~ 10824*0c56280aSSorin Bascaback and does the actual trick. 10825*0c56280aSSorin Basca\newline 10826*0c56280aSSorin Basca65\SpecialChar ~ 10827*0c56280aSSorin Basca\SpecialChar ~ 10828*0c56280aSSorin Basca\SpecialChar ~ 10829*0c56280aSSorin Basca\SpecialChar ~ 10830*0c56280aSSorin Basca\SpecialChar ~ 10831*0c56280aSSorin BascaVerifierFactory.detach(th); 10832*0c56280aSSorin Basca\newline 10833*0c56280aSSorin Basca66\SpecialChar ~ 10834*0c56280aSSorin Basca\SpecialChar ~ 10835*0c56280aSSorin Basca\SpecialChar ~ 10836*0c56280aSSorin Basca} 10837*0c56280aSSorin Basca\newline 10838*0c56280aSSorin Basca67\SpecialChar ~ 10839*0c56280aSSorin Basca} 10840*0c56280aSSorin Basca\newline 10841*0c56280aSSorin Basca 10842*0c56280aSSorin Basca\layout Standard 10843*0c56280aSSorin Basca 10844*0c56280aSSorin Basca 10845*0c56280aSSorin Basca\size small 10846*0c56280aSSorin BascaFirst, an instance of the 10847*0c56280aSSorin Basca\emph on 10848*0c56280aSSorin BascaTransitiveHull 10849*0c56280aSSorin Basca\emph default 10850*0c56280aSSorin Basca class is created in line 62. 10851*0c56280aSSorin Basca Note that this class implements the 10852*0c56280aSSorin Basca\emph on 10853*0c56280aSSorin BascaVerifierFactoryObserver 10854*0c56280aSSorin Basca\emph default 10855*0c56280aSSorin Basca interface. 10856*0c56280aSSorin Basca\layout Standard 10857*0c56280aSSorin Basca 10858*0c56280aSSorin Basca 10859*0c56280aSSorin Basca\size small 10860*0c56280aSSorin BascaA reference to the newly created instance is then passed to the 10861*0c56280aSSorin Basca\emph on 10862*0c56280aSSorin BascaVerifierFactory 10863*0c56280aSSorin Basca\emph default 10864*0c56280aSSorin Basca in line 63 by invoking its 10865*0c56280aSSorin Basca\emph on 10866*0c56280aSSorin Bascaattach(VerifierFactoryObserver) 10867*0c56280aSSorin Basca\emph default 10868*0c56280aSSorin Basca method. 10869*0c56280aSSorin Basca After registering the new observer, the 10870*0c56280aSSorin Basca\emph on 10871*0c56280aSSorin BascaVerifierFactory 10872*0c56280aSSorin Basca\emph default 10873*0c56280aSSorin Basca will call the instance's 10874*0c56280aSSorin Basca\emph on 10875*0c56280aSSorin Basca update(String) 10876*0c56280aSSorin Basca\emph default 10877*0c56280aSSorin Basca method (defined in lines 20-46) whenever a new 10878*0c56280aSSorin Basca\emph on 10879*0c56280aSSorin BascaVerifier 10880*0c56280aSSorin Basca\emph default 10881*0c56280aSSorin Basca instance is created. 10882*0c56280aSSorin Basca\layout Standard 10883*0c56280aSSorin Basca 10884*0c56280aSSorin Basca 10885*0c56280aSSorin Basca\size small 10886*0c56280aSSorin BascaTo trigger the verification, a first 10887*0c56280aSSorin Basca\emph on 10888*0c56280aSSorin BascaVerifier 10889*0c56280aSSorin Basca\emph default 10890*0c56280aSSorin Basca instance is fetched from the 10891*0c56280aSSorin Basca\emph on 10892*0c56280aSSorin BascaVerifierFactory 10893*0c56280aSSorin Basca\emph default 10894*0c56280aSSorin Basca. 10895*0c56280aSSorin Basca Because it is the very first 10896*0c56280aSSorin Basca\emph on 10897*0c56280aSSorin BascaVerifier 10898*0c56280aSSorin Basca\emph default 10899*0c56280aSSorin Basca instance that is fetched, we know that it has to be newly created. 10900*0c56280aSSorin Basca This is done in line 64. 10901*0c56280aSSorin Basca This instance is not used in the 10902*0c56280aSSorin Basca\emph on 10903*0c56280aSSorin Bascamain(String[]) 10904*0c56280aSSorin Basca\emph default 10905*0c56280aSSorin Basca method; but its creation leads to a invocation of the 10906*0c56280aSSorin Basca\emph on 10907*0c56280aSSorin Bascaupdate(String) 10908*0c56280aSSorin Basca\emph default 10909*0c56280aSSorin Basca method which is defined in lines 20-46. 10910*0c56280aSSorin Basca\layout Standard 10911*0c56280aSSorin Basca 10912*0c56280aSSorin BascaThere, the name of the class to verify is printed (lines 21-25, line 45) 10913*0c56280aSSorin Basca and the four verification passes provided by JustIce are run. 10914*0c56280aSSorin Basca Note that one has to be careful not to try to verify a method that does 10915*0c56280aSSorin Basca not exist. 10916*0c56280aSSorin Basca JustIce would in this case throw an 10917*0c56280aSSorin Basca\emph on 10918*0c56280aSSorin BascaInvalidMethodException 10919*0c56280aSSorin Basca\emph default 10920*0c56280aSSorin Basca. 10921*0c56280aSSorin Basca Therefore, after successfully verifying that the structure of the class 10922*0c56280aSSorin Basca file to verify is well-formed (verification up to and including pass two, 10923*0c56280aSSorin Basca lines 26-31), the number of methods is fetched from the corresponding JavaClass 10924*0c56280aSSorin Basca object. 10925*0c56280aSSorin Basca (It is necessary to perform verification pass two on a class file to safely 10926*0c56280aSSorin Basca find out how many methods are defined in this class file.) 10927*0c56280aSSorin Basca\layout Standard 10928*0c56280aSSorin Basca 10929*0c56280aSSorin BascaAfter determining the number of methods, these methods are verified performing 10930*0c56280aSSorin Basca passes 3a and 3b on them (lines 32-44). 10931*0c56280aSSorin Basca\layout Standard 10932*0c56280aSSorin Basca 10933*0c56280aSSorin BascaBy applying all verification passes on some class file 10934*0c56280aSSorin Basca\emph on 10935*0c56280aSSorin BascaC 10936*0c56280aSSorin Basca\emph default 10937*0c56280aSSorin Basca, all class files referenced by 10938*0c56280aSSorin Basca\emph on 10939*0c56280aSSorin BascaC 10940*0c56280aSSorin Basca\emph default 10941*0c56280aSSorin Basca are found. 10942*0c56280aSSorin Basca Therefore, new 10943*0c56280aSSorin Basca\emph on 10944*0c56280aSSorin BascaVerifier 10945*0c56280aSSorin Basca\emph default 10946*0c56280aSSorin Basca instances are created which are responsible for them. 10947*0c56280aSSorin Basca Because of that, the 10948*0c56280aSSorin Basca\emph on 10949*0c56280aSSorin Bascaupdate(String) 10950*0c56280aSSorin Basca\emph default 10951*0c56280aSSorin Basca method described above is called for every referenced class. 10952*0c56280aSSorin Basca This is a recursive loop; the program terminates when there is no referenced 10953*0c56280aSSorin Basca class left to be verified. 10954*0c56280aSSorin Basca\layout Standard 10955*0c56280aSSorin Basca 10956*0c56280aSSorin BascaThe example above is simple yet powerful. 10957*0c56280aSSorin Basca Admittedly, it is of limited use to verify classes provided by the JVM 10958*0c56280aSSorin Basca vendor; therefore one would not normally verify all the transitive hull 10959*0c56280aSSorin Basca of referenced class files. 10960*0c56280aSSorin Basca However, a common use is verifying all classes of a project. 10961*0c56280aSSorin Basca Inserting a new line between line 20 and 21 like 10962*0c56280aSSorin Basca\layout Standard 10963*0c56280aSSorin Basca 10964*0c56280aSSorin Basca 10965*0c56280aSSorin Basca\family typewriter 10966*0c56280aSSorin Bascaif (!(classname.startsWith( 10967*0c56280aSSorin Basca\begin_inset Quotes eld 10968*0c56280aSSorin Basca\end_inset 10969*0c56280aSSorin Basca 10970*0c56280aSSorin Bascade.fub.bytecode.verifier 10971*0c56280aSSorin Basca\begin_inset Quotes erd 10972*0c56280aSSorin Basca\end_inset 10973*0c56280aSSorin Basca 10974*0c56280aSSorin Basca)) return; 10975*0c56280aSSorin Basca\newline 10976*0c56280aSSorin Basca 10977*0c56280aSSorin Basca\family default 10978*0c56280aSSorin Bascawould easily accomplish this goal if JustIce itself is the project to verify 10979*0c56280aSSorin Basca and all the project's class files are referenced by another class file 10980*0c56280aSSorin Basca in the project. 10981*0c56280aSSorin Basca\layout Section 10982*0c56280aSSorin Basca 10983*0c56280aSSorin Basca 10984*0c56280aSSorin Basca\begin_inset LatexCommand \label{GUI_APP} 10985*0c56280aSSorin Basca 10986*0c56280aSSorin Basca\end_inset 10987*0c56280aSSorin Basca 10988*0c56280aSSorin BascaAn Application Prototype 10989*0c56280aSSorin Basca\layout Standard 10990*0c56280aSSorin Basca 10991*0c56280aSSorin BascaThe API of JustIce is used to offer bytecode engineers an opportunity to 10992*0c56280aSSorin Basca create their own application programs. 10993*0c56280aSSorin Basca However, this dimension of configurability is often not needed. 10994*0c56280aSSorin Basca\layout Standard 10995*0c56280aSSorin Basca 10996*0c56280aSSorin BascaJustIce comes with an application prototype which provides an easy-to-use 10997*0c56280aSSorin Basca user interface. 10998*0c56280aSSorin Basca Figures 10999*0c56280aSSorin Basca\begin_inset LatexCommand \ref{GUI1fig} 11000*0c56280aSSorin Basca 11001*0c56280aSSorin Basca\end_inset 11002*0c56280aSSorin Basca 11003*0c56280aSSorin Basca and 11004*0c56280aSSorin Basca\begin_inset LatexCommand \ref{GUI2fig} 11005*0c56280aSSorin Basca 11006*0c56280aSSorin Basca\end_inset 11007*0c56280aSSorin Basca 11008*0c56280aSSorin Basca show screen shots of this prototype built on the JustIce verifier. 11009*0c56280aSSorin Basca The boxes to the right contain verification information. 11010*0c56280aSSorin Basca From the top to the bottom the boxes represent the verification passes 11011*0c56280aSSorin Basca one, two, 3a and 3b and the warning messages, respectively. 11012*0c56280aSSorin Basca\layout Standard 11013*0c56280aSSorin Basca 11014*0c56280aSSorin Basca\begin_float fig 11015*0c56280aSSorin Basca\layout Standard 11016*0c56280aSSorin Basca\align center 11017*0c56280aSSorin Basca 11018*0c56280aSSorin Basca\begin_inset Figure size 595 757 11019*0c56280aSSorin Bascafile GUI1.eps 11020*0c56280aSSorin Bascawidth 3 100 11021*0c56280aSSorin Bascaheight 3 90 11022*0c56280aSSorin Bascaangle 90 11023*0c56280aSSorin Bascaflags 9 11024*0c56280aSSorin Basca 11025*0c56280aSSorin Basca\end_inset 11026*0c56280aSSorin Basca 11027*0c56280aSSorin Basca 11028*0c56280aSSorin Basca\layout Caption 11029*0c56280aSSorin Basca 11030*0c56280aSSorin Basca 11031*0c56280aSSorin Basca\begin_inset LatexCommand \label{GUI1fig} 11032*0c56280aSSorin Basca 11033*0c56280aSSorin Basca\end_inset 11034*0c56280aSSorin Basca 11035*0c56280aSSorin BascaVerification of the Mini.MiniParser class file. 11036*0c56280aSSorin Basca Verification is passed, but JustIce suggests to remove unnecessary (debug 11037*0c56280aSSorin Basca information) attributes. 11038*0c56280aSSorin Basca\end_float 11039*0c56280aSSorin Basca\begin_float fig 11040*0c56280aSSorin Basca\layout Standard 11041*0c56280aSSorin Basca\align center 11042*0c56280aSSorin Basca 11043*0c56280aSSorin Basca\begin_inset Figure size 595 757 11044*0c56280aSSorin Bascafile GUI2.eps 11045*0c56280aSSorin Bascawidth 3 100 11046*0c56280aSSorin Bascaheight 3 90 11047*0c56280aSSorin Bascaangle 90 11048*0c56280aSSorin Bascaflags 9 11049*0c56280aSSorin Basca 11050*0c56280aSSorin Basca\end_inset 11051*0c56280aSSorin Basca 11052*0c56280aSSorin Basca 11053*0c56280aSSorin Basca\layout Caption 11054*0c56280aSSorin Basca 11055*0c56280aSSorin Basca 11056*0c56280aSSorin Basca\begin_inset LatexCommand \label{GUI2fig} 11057*0c56280aSSorin Basca 11058*0c56280aSSorin Basca\end_inset 11059*0c56280aSSorin Basca 11060*0c56280aSSorin BascaVerification of the java.io.ObjectInputStream class file. 11061*0c56280aSSorin Basca Verification is not passed because of an unsatisfied constraint related 11062*0c56280aSSorin Basca to subroutines. 11063*0c56280aSSorin Basca\end_float 11064*0c56280aSSorin Basca\layout Chapter 11065*0c56280aSSorin Basca 11066*0c56280aSSorin BascaConclusion 11067*0c56280aSSorin Basca\layout Section 11068*0c56280aSSorin Basca 11069*0c56280aSSorin BascaWhat Was Achieved 11070*0c56280aSSorin Basca\layout Standard 11071*0c56280aSSorin Basca 11072*0c56280aSSorin BascaAbout a third of the development time of JustIce was spent examining the 11073*0c56280aSSorin Basca various issues in connection with subroutines, i.e., issues concerning the 11074*0c56280aSSorin Basca bytecode instructions 11075*0c56280aSSorin Basca\latex latex 11076*0c56280aSSorin Basca 11077*0c56280aSSorin Basca\backslash 11078*0c56280aSSorin Bascatexttt{jsr} 11079*0c56280aSSorin Basca\latex default 11080*0c56280aSSorin Basca, 11081*0c56280aSSorin Basca\latex latex 11082*0c56280aSSorin Basca 11083*0c56280aSSorin Basca\backslash 11084*0c56280aSSorin Bascatexttt{jsr 11085*0c56280aSSorin Basca\backslash 11086*0c56280aSSorin Basca_w} 11087*0c56280aSSorin Basca\latex default 11088*0c56280aSSorin Basca and 11089*0c56280aSSorin Basca\latex latex 11090*0c56280aSSorin Basca 11091*0c56280aSSorin Basca\backslash 11092*0c56280aSSorin Bascatexttt{ret} 11093*0c56280aSSorin Basca\latex default 11094*0c56280aSSorin Basca. 11095*0c56280aSSorin Basca This led to a new definition of the term 11096*0c56280aSSorin Basca\emph on 11097*0c56280aSSorin Bascasubroutine 11098*0c56280aSSorin Basca\emph default 11099*0c56280aSSorin Basca (section 11100*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SpecSubroutines} 11101*0c56280aSSorin Basca 11102*0c56280aSSorin Basca\end_inset 11103*0c56280aSSorin Basca 11104*0c56280aSSorin Basca) 11105*0c56280aSSorin Basca\begin_float footnote 11106*0c56280aSSorin Basca\layout Standard 11107*0c56280aSSorin Basca 11108*0c56280aSSorin BascaA request for clarification of the subroutine issue, sent to the electronic 11109*0c56280aSSorin Basca mail address 11110*0c56280aSSorin Basca\family typewriter 11111*0c56280aSSorin Basca[email protected] 11112*0c56280aSSorin Basca\family default 11113*0c56280aSSorin Basca was not answered. 11114*0c56280aSSorin Basca\end_float 11115*0c56280aSSorin Basca, a new implementation of this verification area (section 11116*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SubroutineImpl} 11117*0c56280aSSorin Basca 11118*0c56280aSSorin Basca\end_inset 11119*0c56280aSSorin Basca 11120*0c56280aSSorin Basca) and a discussion on the arising incompatibilities (sections 11121*0c56280aSSorin Basca\begin_inset LatexCommand \ref{ComparisonSubroutines} 11122*0c56280aSSorin Basca 11123*0c56280aSSorin Basca\end_inset 11124*0c56280aSSorin Basca 11125*0c56280aSSorin Basca and 11126*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StaerkJreject} 11127*0c56280aSSorin Basca 11128*0c56280aSSorin Basca\end_inset 11129*0c56280aSSorin Basca 11130*0c56280aSSorin Basca). 11131*0c56280aSSorin Basca\layout Standard 11132*0c56280aSSorin Basca 11133*0c56280aSSorin BascaOnly a few different verifier implementations exist at all, and most of 11134*0c56280aSSorin Basca them are incomplete. 11135*0c56280aSSorin Basca JustIce is a complete class file verifier implementation including a bytecode 11136*0c56280aSSorin Basca verifier. 11137*0c56280aSSorin Basca\layout Standard 11138*0c56280aSSorin Basca 11139*0c56280aSSorin BascaThe development of JustIce also led to improvements of the Byte Code Engineering 11140*0c56280aSSorin Basca Library 11141*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 11142*0c56280aSSorin Basca 11143*0c56280aSSorin Basca\end_inset 11144*0c56280aSSorin Basca 11145*0c56280aSSorin Basca. 11146*0c56280aSSorin Basca For instance, the 11147*0c56280aSSorin Basca\family typewriter 11148*0c56280aSSorin Bascareturnaddress 11149*0c56280aSSorin Basca\family default 11150*0c56280aSSorin Basca data type was introduced there. 11151*0c56280aSSorin Basca It was modeled as a parameterized type. 11152*0c56280aSSorin Basca Also, a programming error was repaired that led to inconsistent treatment 11153*0c56280aSSorin Basca of exception handlers in the BCEL. 11154*0c56280aSSorin Basca\layout Standard 11155*0c56280aSSorin Basca 11156*0c56280aSSorin BascaThe control flow graph used by JustIce can also be used in other projects; 11157*0c56280aSSorin Basca the Verification API provides access to this data structure 11158*0c56280aSSorin Basca\begin_float footnote 11159*0c56280aSSorin Basca\layout Standard 11160*0c56280aSSorin Basca 11161*0c56280aSSorin BascaA 11162*0c56280aSSorin Basca\family typewriter 11163*0c56280aSSorin BascaControl\SpecialChar \- 11164*0c56280aSSorin BascaFlow\SpecialChar \- 11165*0c56280aSSorin BascaGraph 11166*0c56280aSSorin Basca\family default 11167*0c56280aSSorin Basca instance can be created by invoking the 11168*0c56280aSSorin Basca\emph on 11169*0c56280aSSorin BascaControl\SpecialChar \- 11170*0c56280aSSorin BascaFlow\SpecialChar \- 11171*0c56280aSSorin BascaGraph(Method\SpecialChar \- 11172*0c56280aSSorin BascaGen) 11173*0c56280aSSorin Basca\emph default 11174*0c56280aSSorin Basca constructor. 11175*0c56280aSSorin Basca A 11176*0c56280aSSorin Basca\family typewriter 11177*0c56280aSSorin BascaMethod\SpecialChar \- 11178*0c56280aSSorin BascaGen 11179*0c56280aSSorin Basca\family default 11180*0c56280aSSorin Basca is the BCEL's representation of a method. 11181*0c56280aSSorin Basca\end_float 11182*0c56280aSSorin Basca. 11183*0c56280aSSorin Basca Only because of the clarification of the subroutine issues could such a 11184*0c56280aSSorin Basca data structure be defined statically. 11185*0c56280aSSorin Basca\layout Standard 11186*0c56280aSSorin Basca 11187*0c56280aSSorin BascaAs an Open Source project, JustIce provides algorithms which may be re-used 11188*0c56280aSSorin Basca in own projects. 11189*0c56280aSSorin Basca For example, every compiler targeting the JVM has to calculate the maximum 11190*0c56280aSSorin Basca amount of stack memory used by a method. 11191*0c56280aSSorin Basca This is also done by JustIce. 11192*0c56280aSSorin Basca\layout Standard 11193*0c56280aSSorin Basca 11194*0c56280aSSorin BascaFinally, the need for a discussion on the meaning of 11195*0c56280aSSorin Basca\emph on 11196*0c56280aSSorin BascaJava security 11197*0c56280aSSorin Basca\emph default 11198*0c56280aSSorin Basca was identified (see section 11199*0c56280aSSorin Basca\begin_inset LatexCommand \ref{LinePrincipleInfoHidingAndSecurity} 11200*0c56280aSSorin Basca 11201*0c56280aSSorin Basca\end_inset 11202*0c56280aSSorin Basca 11203*0c56280aSSorin Basca). 11204*0c56280aSSorin Basca\layout Section 11205*0c56280aSSorin Basca 11206*0c56280aSSorin BascaWhat Could Not Be Achieved 11207*0c56280aSSorin Basca\layout Subsection 11208*0c56280aSSorin Basca 11209*0c56280aSSorin BascaA Constraint Database 11210*0c56280aSSorin Basca\layout Standard 11211*0c56280aSSorin Basca 11212*0c56280aSSorin BascaEfforts have been made to make JustIce verifier highly configurable. 11213*0c56280aSSorin Basca Unfortunately, this could not be accomplished by the author. 11214*0c56280aSSorin Basca For instance, it was planned to build a constraint database which would 11215*0c56280aSSorin Basca make it possible to turn on or off single checks during verification. 11216*0c56280aSSorin Basca\layout Standard 11217*0c56280aSSorin Basca 11218*0c56280aSSorin BascaWhile this might be possible in some cases, in general the constraints of 11219*0c56280aSSorin Basca the class file verifier are highly intertwined. 11220*0c56280aSSorin Basca For instance, without a well-formed constant pool one could not run the 11221*0c56280aSSorin Basca data flow analyzer in a sane way. 11222*0c56280aSSorin Basca As another example, if a user preferred not to care about stack underflow 11223*0c56280aSSorin Basca the verification algorithm would require complicated user interaction; 11224*0c56280aSSorin Basca i.e., the user would have to decide what type to put onto the simulated operand 11225*0c56280aSSorin Basca stack just before it is read. 11226*0c56280aSSorin Basca\layout Standard 11227*0c56280aSSorin Basca 11228*0c56280aSSorin BascaOne could model the interdependencies of the various constraints and allow 11229*0c56280aSSorin Basca only groups of checks to be turned on or off together. 11230*0c56280aSSorin Basca However, the author doubts this could be done in a way that is not prone 11231*0c56280aSSorin Basca to errors and that can be validated easily. 11232*0c56280aSSorin Basca\layout Standard 11233*0c56280aSSorin Basca 11234*0c56280aSSorin BascaThis is also the reason why only one error is reported if verification fails. 11235*0c56280aSSorin Basca Trying to continue verification and find more constraint violations leads 11236*0c56280aSSorin Basca only to consequential verification errors. 11237*0c56280aSSorin Basca\layout Standard 11238*0c56280aSSorin Basca 11239*0c56280aSSorin BascaJustIce implements caching of verification results. 11240*0c56280aSSorin Basca If a bytecode engineer works on a class file and needs to run JustIce several 11241*0c56280aSSorin Basca times against it, JustIce will cache the verification results of the recursivel 11242*0c56280aSSorin Bascay referenced class files. 11243*0c56280aSSorin Basca Because of this, JustIce will be fast every subsequent time it is used 11244*0c56280aSSorin Basca to verify the class. 11245*0c56280aSSorin Basca This minimizes the impact of the above shortcomings. 11246*0c56280aSSorin Basca\layout Subsection 11247*0c56280aSSorin Basca 11248*0c56280aSSorin BascaA Perfect Verifier 11249*0c56280aSSorin Basca\layout Standard 11250*0c56280aSSorin Basca 11251*0c56280aSSorin BascaJustIce does not implement a perfect verifier. 11252*0c56280aSSorin Basca Some class files with code that is safe to execute are rejected. 11253*0c56280aSSorin Basca Unfortunately, there has to be some degree of uncertainty concerning which 11254*0c56280aSSorin Basca class files to reject. 11255*0c56280aSSorin Basca\layout Standard 11256*0c56280aSSorin Basca 11257*0c56280aSSorin BascaThe JVM performs 11258*0c56280aSSorin Basca\emph on 11259*0c56280aSSorin Bascainitialization 11260*0c56280aSSorin Basca\emph default 11261*0c56280aSSorin Basca of class files after loading and verifying them without error. 11262*0c56280aSSorin Basca This includes running the code in the special class initialization method 11263*0c56280aSSorin Basca called 11264*0c56280aSSorin Basca\emph on 11265*0c56280aSSorin Basca<clinit> 11266*0c56280aSSorin Basca\emph default 11267*0c56280aSSorin Basca if it exists (see 11268*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 11269*0c56280aSSorin Basca 11270*0c56280aSSorin Basca\end_inset 11271*0c56280aSSorin Basca 11272*0c56280aSSorin Basca, page 53). 11273*0c56280aSSorin Basca For the correct operation of the JVM it is important that this method does 11274*0c56280aSSorin Basca not contain an infinite loop. 11275*0c56280aSSorin Basca Verifying if this constraint is true is similar to the Halting Problem 11276*0c56280aSSorin Basca and therefore not generally computable 11277*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Unknowable} 11278*0c56280aSSorin Basca 11279*0c56280aSSorin Basca\end_inset 11280*0c56280aSSorin Basca 11281*0c56280aSSorin Basca. 11282*0c56280aSSorin Basca A verifier has to omit the check and pass potentially unsafe class files. 11283*0c56280aSSorin Basca\layout Standard 11284*0c56280aSSorin Basca 11285*0c56280aSSorin BascaFor another example, consider algorithm 11286*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StackOverflowAlgo} 11287*0c56280aSSorin Basca 11288*0c56280aSSorin Basca\end_inset 11289*0c56280aSSorin Basca 11290*0c56280aSSorin Basca below. 11291*0c56280aSSorin Basca\layout Standard 11292*0c56280aSSorin Basca 11293*0c56280aSSorin Basca\begin_float alg 11294*0c56280aSSorin Basca\layout Caption 11295*0c56280aSSorin Basca 11296*0c56280aSSorin Basca 11297*0c56280aSSorin Basca\begin_inset LatexCommand \label{StackOverflowAlgo} 11298*0c56280aSSorin Basca 11299*0c56280aSSorin Basca\end_inset 11300*0c56280aSSorin Basca 11301*0c56280aSSorin BascaRejected class 11302*0c56280aSSorin Basca\layout Standard 11303*0c56280aSSorin Basca 11304*0c56280aSSorin Basca 11305*0c56280aSSorin Basca\family typewriter 11306*0c56280aSSorin Bascapublic static int always_true() 11307*0c56280aSSorin Basca\layout Standard 11308*0c56280aSSorin Basca 11309*0c56280aSSorin Basca 11310*0c56280aSSorin Basca\family typewriter 11311*0c56280aSSorin BascaCode(max_stack = 1, max_locals = 1, code_length = 2) 11312*0c56280aSSorin Basca\layout Standard 11313*0c56280aSSorin Basca 11314*0c56280aSSorin Basca 11315*0c56280aSSorin Basca\family typewriter 11316*0c56280aSSorin Basca0: iconst_1\SpecialChar ~ 11317*0c56280aSSorin Basca\SpecialChar ~ 11318*0c56280aSSorin Basca; push constant 1 onto stack 11319*0c56280aSSorin Basca\layout Standard 11320*0c56280aSSorin Basca 11321*0c56280aSSorin Basca 11322*0c56280aSSorin Basca\family typewriter 11323*0c56280aSSorin Basca1: ireturn\SpecialChar ~ 11324*0c56280aSSorin Basca\SpecialChar ~ 11325*0c56280aSSorin Basca\SpecialChar ~ 11326*0c56280aSSorin Basca; return constant 1 ( 11327*0c56280aSSorin Basca\begin_inset Quotes eld 11328*0c56280aSSorin Basca\end_inset 11329*0c56280aSSorin Basca 11330*0c56280aSSorin Bascatrue 11331*0c56280aSSorin Basca\begin_inset Quotes erd 11332*0c56280aSSorin Basca\end_inset 11333*0c56280aSSorin Basca 11334*0c56280aSSorin Basca) 11335*0c56280aSSorin Basca\newline 11336*0c56280aSSorin Basca 11337*0c56280aSSorin Basca\layout Standard 11338*0c56280aSSorin Basca 11339*0c56280aSSorin Basca 11340*0c56280aSSorin Basca\family typewriter 11341*0c56280aSSorin Bascapublic static void good_method() 11342*0c56280aSSorin Basca\layout Standard 11343*0c56280aSSorin Basca 11344*0c56280aSSorin Basca 11345*0c56280aSSorin Basca\family typewriter 11346*0c56280aSSorin Basca0: invokestatic NewClass0.always_true ()I (18) 11347*0c56280aSSorin Basca\layout Standard 11348*0c56280aSSorin Basca 11349*0c56280aSSorin Basca 11350*0c56280aSSorin Basca\family typewriter 11351*0c56280aSSorin Basca\SpecialChar \- 11352*0c56280aSSorin Basca\SpecialChar ~ 11353*0c56280aSSorin Basca\SpecialChar ~ 11354*0c56280aSSorin Basca\SpecialChar ~ 11355*0c56280aSSorin Basca\SpecialChar ~ 11356*0c56280aSSorin Basca\SpecialChar ~ 11357*0c56280aSSorin Basca\SpecialChar ~ 11358*0c56280aSSorin Basca\SpecialChar ~ 11359*0c56280aSSorin Basca\SpecialChar ~ 11360*0c56280aSSorin Basca\SpecialChar ~ 11361*0c56280aSSorin Basca\SpecialChar ~ 11362*0c56280aSSorin Basca\SpecialChar ~ 11363*0c56280aSSorin Basca\SpecialChar ~ 11364*0c56280aSSorin Basca\SpecialChar ~ 11365*0c56280aSSorin Basca\SpecialChar ~ 11366*0c56280aSSorin Basca\SpecialChar ~ 11367*0c56280aSSorin Basca\SpecialChar ~ 11368*0c56280aSSorin Basca\SpecialChar ~ 11369*0c56280aSSorin Basca\SpecialChar ~ 11370*0c56280aSSorin Basca\SpecialChar ~ 11371*0c56280aSSorin Basca\SpecialChar ~ 11372*0c56280aSSorin Basca\SpecialChar ~ 11373*0c56280aSSorin Basca; Push 11374*0c56280aSSorin Basca\begin_inset Quotes eld 11375*0c56280aSSorin Basca\end_inset 11376*0c56280aSSorin Basca 11377*0c56280aSSorin Bascatrue 11378*0c56280aSSorin Basca\begin_inset Quotes erd 11379*0c56280aSSorin Basca\end_inset 11380*0c56280aSSorin Basca 11381*0c56280aSSorin Basca on stack 11382*0c56280aSSorin Basca\layout Standard 11383*0c56280aSSorin Basca 11384*0c56280aSSorin Basca 11385*0c56280aSSorin Basca\family typewriter 11386*0c56280aSSorin Basca3: ifne #10\SpecialChar ~ 11387*0c56280aSSorin Basca\SpecialChar ~ 11388*0c56280aSSorin Basca\SpecialChar ~ 11389*0c56280aSSorin Basca\SpecialChar ~ 11390*0c56280aSSorin Basca\SpecialChar ~ 11391*0c56280aSSorin Basca\SpecialChar ~ 11392*0c56280aSSorin Basca\SpecialChar ~ 11393*0c56280aSSorin Basca\SpecialChar ~ 11394*0c56280aSSorin Basca\SpecialChar ~ 11395*0c56280aSSorin Basca\SpecialChar ~ 11396*0c56280aSSorin Basca; If 11397*0c56280aSSorin Basca\begin_inset Quotes eld 11398*0c56280aSSorin Basca\end_inset 11399*0c56280aSSorin Basca 11400*0c56280aSSorin Bascatrue 11401*0c56280aSSorin Basca\begin_inset Quotes erd 11402*0c56280aSSorin Basca\end_inset 11403*0c56280aSSorin Basca 11404*0c56280aSSorin Basca is on stack jump to 10 11405*0c56280aSSorin Basca\layout Standard 11406*0c56280aSSorin Basca 11407*0c56280aSSorin Basca 11408*0c56280aSSorin Basca\family typewriter 11409*0c56280aSSorin Basca6: pop \SpecialChar ~ 11410*0c56280aSSorin Basca\SpecialChar ~ 11411*0c56280aSSorin Basca\SpecialChar ~ 11412*0c56280aSSorin Basca\SpecialChar ~ 11413*0c56280aSSorin Basca\SpecialChar ~ 11414*0c56280aSSorin Basca\SpecialChar ~ 11415*0c56280aSSorin Basca\SpecialChar ~ 11416*0c56280aSSorin Basca\SpecialChar ~ 11417*0c56280aSSorin Basca\SpecialChar ~ 11418*0c56280aSSorin Basca\SpecialChar ~ 11419*0c56280aSSorin Basca\SpecialChar ~ 11420*0c56280aSSorin Basca\SpecialChar ~ 11421*0c56280aSSorin Basca\SpecialChar ~ 11422*0c56280aSSorin Basca\SpecialChar ~ 11423*0c56280aSSorin Basca; Pop a value off the stack 11424*0c56280aSSorin Basca\layout Standard 11425*0c56280aSSorin Basca 11426*0c56280aSSorin Basca 11427*0c56280aSSorin Basca\family typewriter 11428*0c56280aSSorin Basca7: goto #6 \SpecialChar ~ 11429*0c56280aSSorin Basca\SpecialChar ~ 11430*0c56280aSSorin Basca\SpecialChar ~ 11431*0c56280aSSorin Basca\SpecialChar ~ 11432*0c56280aSSorin Basca\SpecialChar ~ 11433*0c56280aSSorin Basca\SpecialChar ~ 11434*0c56280aSSorin Basca\SpecialChar ~ 11435*0c56280aSSorin Basca\SpecialChar ~ 11436*0c56280aSSorin Basca\SpecialChar ~ 11437*0c56280aSSorin Basca\SpecialChar ~ 11438*0c56280aSSorin Basca; jump to 6 11439*0c56280aSSorin Basca\layout Standard 11440*0c56280aSSorin Basca 11441*0c56280aSSorin Basca 11442*0c56280aSSorin Basca\family typewriter 11443*0c56280aSSorin Basca10:return\SpecialChar ~ 11444*0c56280aSSorin Basca\SpecialChar ~ 11445*0c56280aSSorin Basca\SpecialChar ~ 11446*0c56280aSSorin Basca\SpecialChar ~ 11447*0c56280aSSorin Basca\SpecialChar ~ 11448*0c56280aSSorin Basca\SpecialChar ~ 11449*0c56280aSSorin Basca\SpecialChar ~ 11450*0c56280aSSorin Basca\SpecialChar ~ 11451*0c56280aSSorin Basca\SpecialChar ~ 11452*0c56280aSSorin Basca\SpecialChar ~ 11453*0c56280aSSorin Basca\SpecialChar ~ 11454*0c56280aSSorin Basca\SpecialChar ~ 11455*0c56280aSSorin Basca; complete method 11456*0c56280aSSorin Basca\end_float 11457*0c56280aSSorin BascaThis code is harmless, because lines 6 and 7 can never be executed (it would 11458*0c56280aSSorin Basca underflow the operand stack in an infinite loop). 11459*0c56280aSSorin Basca A class file with this code is rejected by JustIce and other verifiers, 11460*0c56280aSSorin Basca because the endless loop seems to be a malicious threat to the integrity 11461*0c56280aSSorin Basca of the JVM. 11462*0c56280aSSorin Basca\layout Standard 11463*0c56280aSSorin Basca 11464*0c56280aSSorin BascaWe conclude that there cannot be a perfect verifier. 11465*0c56280aSSorin Basca All that could be done is reduce the degree of uncertainty. 11466*0c56280aSSorin Basca For practical purposes, i.e., to be compatible with Sun's implementation, 11467*0c56280aSSorin Basca one should not even do that. 11468*0c56280aSSorin Basca\layout Standard 11469*0c56280aSSorin Basca 11470*0c56280aSSorin BascaThere is also a simple proof showing a perfect verifier does not exist in 11471*0c56280aSSorin Basca 11472*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JNS} 11473*0c56280aSSorin Basca 11474*0c56280aSSorin Basca\end_inset 11475*0c56280aSSorin Basca 11476*0c56280aSSorin Basca, chapter 6. 11477*0c56280aSSorin Basca It uses a diagonalization argument. 11478*0c56280aSSorin Basca\layout Section 11479*0c56280aSSorin Basca 11480*0c56280aSSorin BascaFuture Work 11481*0c56280aSSorin Basca\layout Standard 11482*0c56280aSSorin Basca 11483*0c56280aSSorin BascaClass file verification is an integral component of Java security; and applicati 11484*0c56280aSSorin Bascaon programs running on the Java Virtual Machine are often used in security 11485*0c56280aSSorin Basca critical areas. 11486*0c56280aSSorin Basca Several security holes and flaws have been found both in implementations 11487*0c56280aSSorin Basca and the specification of the Java class file verifier since it was introduced. 11488*0c56280aSSorin Basca\layout Standard 11489*0c56280aSSorin Basca 11490*0c56280aSSorin BascaRecently, the area has experienced a leap as a theoretically founded, sound 11491*0c56280aSSorin Basca and complete Java environment was defined in 11492*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JBook} 11493*0c56280aSSorin Basca 11494*0c56280aSSorin Basca\end_inset 11495*0c56280aSSorin Basca 11496*0c56280aSSorin Basca. 11497*0c56280aSSorin Basca Possibly Sun's engineers will use this work to improve Java and the Java 11498*0c56280aSSorin Basca verifier. 11499*0c56280aSSorin Basca JustIce will have to change to always keep close to the industry standard. 11500*0c56280aSSorin Basca 11501*0c56280aSSorin Basca\layout Standard 11502*0c56280aSSorin Basca 11503*0c56280aSSorin BascaBut JustIce itself can also be improved concerning practicability, and new 11504*0c56280aSSorin Basca software can be developed on top of the Verification API. 11505*0c56280aSSorin Basca\layout Subsection 11506*0c56280aSSorin Basca 11507*0c56280aSSorin BascaImprovements to JustIce 11508*0c56280aSSorin Basca\layout Subsubsection 11509*0c56280aSSorin Basca 11510*0c56280aSSorin BascaIntroduction of Unique Identifers for Verification Results and Warning Messages 11511*0c56280aSSorin Basca\layout Standard 11512*0c56280aSSorin Basca 11513*0c56280aSSorin BascaCurrently, warning messages and verification results are conceptually text-based. 11514*0c56280aSSorin Basca Only 11515*0c56280aSSorin Basca\emph on 11516*0c56280aSSorin BascaVerificationResult 11517*0c56280aSSorin Basca\emph default 11518*0c56280aSSorin Basca objects include a numeric value which programs can use to decide if some 11519*0c56280aSSorin Basca class verification failed or not. 11520*0c56280aSSorin Basca A program like the prototype introduced in section 11521*0c56280aSSorin Basca\begin_inset LatexCommand \ref{GUI_APP} 11522*0c56280aSSorin Basca 11523*0c56280aSSorin Basca\end_inset 11524*0c56280aSSorin Basca 11525*0c56280aSSorin Basca can currently not hide specific messages from the user without parsing 11526*0c56280aSSorin Basca text. 11527*0c56280aSSorin Basca This limitation should be removed in the future by using unique message 11528*0c56280aSSorin Basca numbers. 11529*0c56280aSSorin Basca This would also make translation of the messages into other languages easier. 11530*0c56280aSSorin Basca\layout Subsubsection 11531*0c56280aSSorin Basca 11532*0c56280aSSorin Basca 11533*0c56280aSSorin Basca\begin_inset LatexCommand \label{NewVerificationStrategy} 11534*0c56280aSSorin Basca 11535*0c56280aSSorin Basca\end_inset 11536*0c56280aSSorin Basca 11537*0c56280aSSorin BascaA New Verification Strategy 11538*0c56280aSSorin Basca\layout Standard 11539*0c56280aSSorin Basca 11540*0c56280aSSorin BascaThe core verification algorithm cited in section 11541*0c56280aSSorin Basca\begin_inset LatexCommand \ref{SunCoreAlgo} 11542*0c56280aSSorin Basca 11543*0c56280aSSorin Basca\end_inset 11544*0c56280aSSorin Basca 11545*0c56280aSSorin Basca works by generalizing the knowledge about an object type along the inheritance 11546*0c56280aSSorin Basca hierarchy. 11547*0c56280aSSorin Basca\layout Standard 11548*0c56280aSSorin Basca 11549*0c56280aSSorin BascaFor instance, let there be an object of type 11550*0c56280aSSorin Basca\family typewriter 11551*0c56280aSSorin Bascajava.util.Ab\SpecialChar \- 11552*0c56280aSSorin Bascastract\SpecialChar \- 11553*0c56280aSSorin BascaList 11554*0c56280aSSorin Basca\family default 11555*0c56280aSSorin Basca on the simulated stack of some modeled instruction. 11556*0c56280aSSorin Basca Let there be a loop so that the algorithm has to visit that same instruction 11557*0c56280aSSorin Basca again, this time with an object of type 11558*0c56280aSSorin Basca\family typewriter 11559*0c56280aSSorin Bascajava.util.Ab\SpecialChar \- 11560*0c56280aSSorin Bascastract\SpecialChar \- 11561*0c56280aSSorin BascaSet 11562*0c56280aSSorin Basca\family default 11563*0c56280aSSorin Basca in that same stack slot. 11564*0c56280aSSorin Basca The verifier will compute the meet of the two types and record that there 11565*0c56280aSSorin Basca is some object of type 11566*0c56280aSSorin Basca\family typewriter 11567*0c56280aSSorin Bascajava.util.Ab\SpecialChar \- 11568*0c56280aSSorin Bascastract\SpecialChar \- 11569*0c56280aSSorin BascaCollection 11570*0c56280aSSorin Basca\family default 11571*0c56280aSSorin Basca in that stack slot. 11572*0c56280aSSorin Basca\layout Standard 11573*0c56280aSSorin Basca 11574*0c56280aSSorin BascaRemember that the instruction will be marked with a 11575*0c56280aSSorin Basca\emph on 11576*0c56280aSSorin Bascachanged 11577*0c56280aSSorin Basca\emph default 11578*0c56280aSSorin Basca bit until no such re-typing change occurs any more (JustIce will actually 11579*0c56280aSSorin Basca put it into a queue). 11580*0c56280aSSorin Basca\layout Standard 11581*0c56280aSSorin Basca 11582*0c56280aSSorin BascaThis approach does not work very well when it comes to interface types instead 11583*0c56280aSSorin Basca of class files. 11584*0c56280aSSorin Basca For example, the meet of a 11585*0c56280aSSorin Basca\family typewriter 11586*0c56280aSSorin Bascajava.lang.In\SpecialChar \- 11587*0c56280aSSorin Bascateger 11588*0c56280aSSorin Basca\family default 11589*0c56280aSSorin Basca and a 11590*0c56280aSSorin Basca\family typewriter 11591*0c56280aSSorin Bascajava.lang.Doub\SpecialChar \- 11592*0c56280aSSorin Bascale 11593*0c56280aSSorin Basca\family default 11594*0c56280aSSorin Basca is a 11595*0c56280aSSorin Basca\family typewriter 11596*0c56280aSSorin Bascajava.lang.Num\SpecialChar \- 11597*0c56280aSSorin Bascaber 11598*0c56280aSSorin Basca\family default 11599*0c56280aSSorin Basca because 11600*0c56280aSSorin Basca\family typewriter 11601*0c56280aSSorin Bascajava.lang.Num\SpecialChar \- 11602*0c56280aSSorin Bascaber 11603*0c56280aSSorin Basca\family default 11604*0c56280aSSorin Basca\emph on 11605*0c56280aSSorin Basca 11606*0c56280aSSorin Basca\emph default 11607*0c56280aSSorin Bascais the first common super class. 11608*0c56280aSSorin Basca Both classes also implement the 11609*0c56280aSSorin Basca\family typewriter 11610*0c56280aSSorin Bascajava.lang.Com\SpecialChar \- 11611*0c56280aSSorin Bascaparable 11612*0c56280aSSorin Basca\family default 11613*0c56280aSSorin Basca interface, but 11614*0c56280aSSorin Basca\family typewriter 11615*0c56280aSSorin Bascajava.lang.Num\SpecialChar \- 11616*0c56280aSSorin Bascaber 11617*0c56280aSSorin Basca\family default 11618*0c56280aSSorin Basca does not. 11619*0c56280aSSorin Basca This information is lost when replacing the type information. 11620*0c56280aSSorin Basca However, current verifiers do not reject the class files but make additional 11621*0c56280aSSorin Basca run-time checks necessary. 11622*0c56280aSSorin Basca\layout Standard 11623*0c56280aSSorin Basca 11624*0c56280aSSorin BascaFong noticed that this could be the reason for the 11625*0c56280aSSorin Basca\latex latex 11626*0c56280aSSorin Basca 11627*0c56280aSSorin Basca\backslash 11628*0c56280aSSorin Bascatexttt{invoke\SpecialChar \- 11629*0c56280aSSorin Bascainterface} 11630*0c56280aSSorin Basca\latex default 11631*0c56280aSSorin Basca opcode to be underspecified 11632*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong2-WWW} 11633*0c56280aSSorin Basca 11634*0c56280aSSorin Basca\end_inset 11635*0c56280aSSorin Basca 11636*0c56280aSSorin Basca (also see section 11637*0c56280aSSorin Basca\begin_inset LatexCommand \ref{InvokeInterfaceDescFONG} 11638*0c56280aSSorin Basca 11639*0c56280aSSorin Basca\end_inset 11640*0c56280aSSorin Basca 11641*0c56280aSSorin Basca). 11642*0c56280aSSorin Basca\layout Standard 11643*0c56280aSSorin Basca 11644*0c56280aSSorin BascaSt�rk et al. 11645*0c56280aSSorin Basca suggest the use of 11646*0c56280aSSorin Basca\emph on 11647*0c56280aSSorin Bascasets 11648*0c56280aSSorin Basca\emph default 11649*0c56280aSSorin Basca of reference types instead ( 11650*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JBook} 11651*0c56280aSSorin Basca 11652*0c56280aSSorin Basca\end_inset 11653*0c56280aSSorin Basca 11654*0c56280aSSorin Basca, pages 229-231). 11655*0c56280aSSorin Basca This could also be implemented in JustIce. 11656*0c56280aSSorin Basca\layout Subsubsection 11657*0c56280aSSorin Basca 11658*0c56280aSSorin BascaKeeping up with Specification Clarifications 11659*0c56280aSSorin Basca\layout Standard 11660*0c56280aSSorin Basca 11661*0c56280aSSorin BascaAs a clean-room implementation, JustIce depends on the clearness of the 11662*0c56280aSSorin Basca specification. 11663*0c56280aSSorin Basca Ambiguities could lead to programming errors. 11664*0c56280aSSorin Basca\layout Standard 11665*0c56280aSSorin Basca 11666*0c56280aSSorin BascaHere we give one example: methods can be inherited in Java (for example, 11667*0c56280aSSorin Basca the method 11668*0c56280aSSorin Basca\emph on 11669*0c56280aSSorin Bascaclone() 11670*0c56280aSSorin Basca\emph default 11671*0c56280aSSorin Bascais declared in the 11672*0c56280aSSorin Basca\family typewriter 11673*0c56280aSSorin Bascajava.lang.Ob\SpecialChar \- 11674*0c56280aSSorin Bascaject 11675*0c56280aSSorin Basca\family default 11676*0c56280aSSorin Basca class and therefore inherited by every other class). 11677*0c56280aSSorin Basca\layout Standard 11678*0c56280aSSorin Basca 11679*0c56280aSSorin BascaLet a class 11680*0c56280aSSorin Basca\family typewriter 11681*0c56280aSSorin BascaA 11682*0c56280aSSorin Basca\family default 11683*0c56280aSSorin Basca be a subclass of 11684*0c56280aSSorin Basca\family typewriter 11685*0c56280aSSorin Bascajava.lang.Ob\SpecialChar \- 11686*0c56280aSSorin Bascaject 11687*0c56280aSSorin Basca\family default 11688*0c56280aSSorin Basca and let class 11689*0c56280aSSorin Basca\family typewriter 11690*0c56280aSSorin BascaB 11691*0c56280aSSorin Basca\family default 11692*0c56280aSSorin Basca be a subclass of 11693*0c56280aSSorin Basca\family typewriter 11694*0c56280aSSorin BascaA 11695*0c56280aSSorin Basca\family default 11696*0c56280aSSorin Basca. 11697*0c56280aSSorin Basca Also, let class 11698*0c56280aSSorin Basca\family typewriter 11699*0c56280aSSorin BascaB 11700*0c56280aSSorin Basca\family default 11701*0c56280aSSorin Basca override the definition of 11702*0c56280aSSorin Basca\emph on 11703*0c56280aSSorin Bascaclone() 11704*0c56280aSSorin Basca\emph default 11705*0c56280aSSorin Basca with an own implementation. 11706*0c56280aSSorin Basca\layout Standard 11707*0c56280aSSorin Basca 11708*0c56280aSSorin BascaIf 11709*0c56280aSSorin Basca\emph on 11710*0c56280aSSorin Bascajavac 11711*0c56280aSSorin Basca\emph default 11712*0c56280aSSorin Basca compiles a Java program that invokes this method, it is either referenced 11713*0c56280aSSorin Basca as 11714*0c56280aSSorin Basca\emph on 11715*0c56280aSSorin Bascajava.lang.Ob\SpecialChar \- 11716*0c56280aSSorin Bascaject::clone() 11717*0c56280aSSorin Basca\emph default 11718*0c56280aSSorin Basca or as 11719*0c56280aSSorin Basca\emph on 11720*0c56280aSSorin BascaB::clone() 11721*0c56280aSSorin Basca\emph default 11722*0c56280aSSorin Basca. 11723*0c56280aSSorin Basca However, because 11724*0c56280aSSorin Basca\family typewriter 11725*0c56280aSSorin BascaA 11726*0c56280aSSorin Basca\family default 11727*0c56280aSSorin Basca inherits this method, the reference 11728*0c56280aSSorin Basca\emph on 11729*0c56280aSSorin BascaA::clone() 11730*0c56280aSSorin Basca\emph default 11731*0c56280aSSorin Basca is legal, too. 11732*0c56280aSSorin Basca\layout Standard 11733*0c56280aSSorin Basca 11734*0c56280aSSorin BascaIn The Java Virtual Machine Specification, Second Edition ( 11735*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 11736*0c56280aSSorin Basca 11737*0c56280aSSorin Basca\end_inset 11738*0c56280aSSorin Basca 11739*0c56280aSSorin Basca, page 291) it is said that the reference must be a 11740*0c56280aSSorin Basca\begin_inset Quotes eld 11741*0c56280aSSorin Basca\end_inset 11742*0c56280aSSorin Basca 11743*0c56280aSSorin Bascasymbolic reference to the class in which the method is to be found 11744*0c56280aSSorin Basca\begin_inset Quotes erd 11745*0c56280aSSorin Basca\end_inset 11746*0c56280aSSorin Basca 11747*0c56280aSSorin Basca. 11748*0c56280aSSorin Basca Statically, the method 11749*0c56280aSSorin Basca\emph on 11750*0c56280aSSorin Bascaclone() 11751*0c56280aSSorin Basca\emph default 11752*0c56280aSSorin Basca can of course not be found in class 11753*0c56280aSSorin Basca\family typewriter 11754*0c56280aSSorin BascaA 11755*0c56280aSSorin Basca\family default 11756*0c56280aSSorin Basca. 11757*0c56280aSSorin Basca One could therefore think the reference 11758*0c56280aSSorin Basca\emph on 11759*0c56280aSSorin BascaA::clone() 11760*0c56280aSSorin Basca\emph default 11761*0c56280aSSorin Basca was not legal. 11762*0c56280aSSorin Basca\layout Standard 11763*0c56280aSSorin Basca 11764*0c56280aSSorin BascaIn the meanwhile, Sun's engineer Gilad Bracha clarified this issue: 11765*0c56280aSSorin Basca\begin_inset Quotes eld 11766*0c56280aSSorin Basca\end_inset 11767*0c56280aSSorin Basca 11768*0c56280aSSorin BascaOf course. 11769*0c56280aSSorin Basca This is discussed in JVMS 5.4.3.4, which describes interface method resolution. 11770*0c56280aSSorin Basca I don't see the text on page 280 as contradicting that. 11771*0c56280aSSorin Basca The symbolic reference does give an interface in which the required method 11772*0c56280aSSorin Basca can be found, albeit as an inherited member. 11773*0c56280aSSorin Basca We could try and reword it in a more precise way, to eliminate any misunderstan 11774*0c56280aSSorin Bascadings. 11775*0c56280aSSorin Basca\begin_inset Quotes erd 11776*0c56280aSSorin Basca\end_inset 11777*0c56280aSSorin Basca 11778*0c56280aSSorin Basca 11779*0c56280aSSorin Basca\layout Standard 11780*0c56280aSSorin Basca 11781*0c56280aSSorin BascaKeeping up with clarifications like this is an inevitable and on-going part 11782*0c56280aSSorin Basca of the development of JustIce. 11783*0c56280aSSorin Basca\layout Subsubsection 11784*0c56280aSSorin Basca 11785*0c56280aSSorin BascaKeeping up with Java Extensions 11786*0c56280aSSorin Basca\layout Standard 11787*0c56280aSSorin Basca 11788*0c56280aSSorin BascaRecently, Sun Microsystems introduced a new attribute: the 11789*0c56280aSSorin Basca\family typewriter 11790*0c56280aSSorin BascaStackMap 11791*0c56280aSSorin Basca\family default 11792*0c56280aSSorin Basca attribute which is an attribute local to the 11793*0c56280aSSorin Basca\family typewriter 11794*0c56280aSSorin BascaCode 11795*0c56280aSSorin Basca\family default 11796*0c56280aSSorin Basca attribute (see section 11797*0c56280aSSorin Basca\emph on 11798*0c56280aSSorin Basca 11799*0c56280aSSorin Basca\begin_inset LatexCommand \ref{CodeAttribute} 11800*0c56280aSSorin Basca 11801*0c56280aSSorin Basca\end_inset 11802*0c56280aSSorin Basca 11803*0c56280aSSorin Basca 11804*0c56280aSSorin Basca\emph default 11805*0c56280aSSorin Basca). 11806*0c56280aSSorin Basca It was specified in 11807*0c56280aSSorin Basca\begin_inset LatexCommand \cite{J2ME-CLDCS} 11808*0c56280aSSorin Basca 11809*0c56280aSSorin Basca\end_inset 11810*0c56280aSSorin Basca 11811*0c56280aSSorin Basca. 11812*0c56280aSSorin Basca\layout Standard 11813*0c56280aSSorin Basca 11814*0c56280aSSorin BascaIt is there to provide 11815*0c56280aSSorin Basca\begin_inset Quotes eld 11816*0c56280aSSorin Basca\end_inset 11817*0c56280aSSorin Basca 11818*0c56280aSSorin Bascalimited devices 11819*0c56280aSSorin Basca\begin_inset Quotes erd 11820*0c56280aSSorin Basca\end_inset 11821*0c56280aSSorin Basca 11822*0c56280aSSorin Basca that perform a one-pass verification with type information that would normally 11823*0c56280aSSorin Basca have to be inferred by the verifier. 11824*0c56280aSSorin Basca\layout Standard 11825*0c56280aSSorin Basca 11826*0c56280aSSorin BascaIt is not used by the verification algorithm of JustIce now: it's currently 11827*0c56280aSSorin Basca an 11828*0c56280aSSorin Basca\emph on 11829*0c56280aSSorin Bascaunknown attribute 11830*0c56280aSSorin Basca\emph default 11831*0c56280aSSorin Basca to JustIce. 11832*0c56280aSSorin Basca\layout Subsubsection 11833*0c56280aSSorin Basca 11834*0c56280aSSorin BascaDetecting Local Variable Accesses out of Scope 11835*0c56280aSSorin Basca\layout Standard 11836*0c56280aSSorin Basca 11837*0c56280aSSorin BascaThe 11838*0c56280aSSorin Basca\family typewriter 11839*0c56280aSSorin BascaLocalVariableTable 11840*0c56280aSSorin Basca\family default 11841*0c56280aSSorin Basca attribute is a debug information attribute. 11842*0c56280aSSorin Basca Basically, it gives debuggers information about the original (source code) 11843*0c56280aSSorin Basca name and type of a given local variable. 11844*0c56280aSSorin Basca\layout Standard 11845*0c56280aSSorin Basca 11846*0c56280aSSorin BascaJustIce builds data structures to warn if it detects contradicting and overlappi 11847*0c56280aSSorin Bascang areas; e.g., if some local variable is anounced to carry an 11848*0c56280aSSorin Basca\family typewriter 11849*0c56280aSSorin Bascaint 11850*0c56280aSSorin Basca\family default 11851*0c56280aSSorin Basca value and a 11852*0c56280aSSorin Basca\family typewriter 11853*0c56280aSSorin Bascafloat 11854*0c56280aSSorin Basca\family default 11855*0c56280aSSorin Basca value at the same time. 11856*0c56280aSSorin Basca\layout Standard 11857*0c56280aSSorin Basca 11858*0c56280aSSorin BascaIt could also be interesting to warn if a local variable is accessed for 11859*0c56280aSSorin Basca which no debug information exists. 11860*0c56280aSSorin Basca This is currently not implemented. 11861*0c56280aSSorin Basca\layout Subsubsection 11862*0c56280aSSorin Basca 11863*0c56280aSSorin BascaExtending the Verification API 11864*0c56280aSSorin Basca\layout Standard 11865*0c56280aSSorin Basca 11866*0c56280aSSorin BascaJustIce can easily be extended to run certain analyses related to symbolic 11867*0c56280aSSorin Basca bytecode execution. 11868*0c56280aSSorin Basca\layout Standard 11869*0c56280aSSorin Basca 11870*0c56280aSSorin BascaThis includes the computation of the maximum number of used operand stack 11871*0c56280aSSorin Basca slots in a method or the computation of unused local variables in a method. 11872*0c56280aSSorin Basca\layout Standard 11873*0c56280aSSorin Basca 11874*0c56280aSSorin BascaThese analyses are normally costly to implement 11875*0c56280aSSorin Basca\begin_float footnote 11876*0c56280aSSorin Basca\layout Standard 11877*0c56280aSSorin Basca 11878*0c56280aSSorin BascaOften, heuristics are used such as the method MethodGen.getMaxStack() in 11879*0c56280aSSorin Basca the BCEL 11880*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 11881*0c56280aSSorin Basca 11882*0c56280aSSorin Basca\end_inset 11883*0c56280aSSorin Basca 11884*0c56280aSSorin Basca. 11885*0c56280aSSorin Basca\end_float 11886*0c56280aSSorin Basca, but they are a waste product of the verifier's core algorithm. 11887*0c56280aSSorin Basca\layout Subsubsection 11888*0c56280aSSorin Basca 11889*0c56280aSSorin Basca 11890*0c56280aSSorin Basca\begin_inset LatexCommand \label{VerifierValidationSuite} 11891*0c56280aSSorin Basca 11892*0c56280aSSorin Basca\end_inset 11893*0c56280aSSorin Basca 11894*0c56280aSSorin BascaA Verifier Validation Suite 11895*0c56280aSSorin Basca\layout Standard 11896*0c56280aSSorin Basca 11897*0c56280aSSorin BascaThe Kimera project 11898*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-WWW} 11899*0c56280aSSorin Basca 11900*0c56280aSSorin Basca\end_inset 11901*0c56280aSSorin Basca 11902*0c56280aSSorin Basca was the first known project to implement a stand-alone Java verifier. 11903*0c56280aSSorin Basca The people behind the project had to test the behaviour of their verifier 11904*0c56280aSSorin Basca against the behaviour of the previous implementations. 11905*0c56280aSSorin Basca Tests have been run in order to validate the Kimera verifier. 11906*0c56280aSSorin Basca These tests range from simply introducing random one-byte errors into class 11907*0c56280aSSorin Basca files and automatically running Kimera against other verifiers to elaborate 11908*0c56280aSSorin Basca research work 11909*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} 11910*0c56280aSSorin Basca 11911*0c56280aSSorin Basca\end_inset 11912*0c56280aSSorin Basca 11913*0c56280aSSorin Basca. 11914*0c56280aSSorin Basca\layout Standard 11915*0c56280aSSorin Basca 11916*0c56280aSSorin BascaCurrently, JustIce comes only with a very limited possibility of running 11917*0c56280aSSorin Basca test cases against the native verifier of the host machine's JVM. 11918*0c56280aSSorin Basca The pioneering work of the Kimera project could be used to implement a 11919*0c56280aSSorin Basca validation suite for JustIce. 11920*0c56280aSSorin Basca\layout Subsection 11921*0c56280aSSorin Basca 11922*0c56280aSSorin Basca 11923*0c56280aSSorin Basca\begin_inset LatexCommand \label{Firewall} 11924*0c56280aSSorin Basca 11925*0c56280aSSorin Basca\end_inset 11926*0c56280aSSorin Basca 11927*0c56280aSSorin BascaA Verifier Protecting an Intranet 11928*0c56280aSSorin Basca\layout Standard 11929*0c56280aSSorin Basca 11930*0c56280aSSorin BascaOften, Java Virtual Machines are built into software used to browse the 11931*0c56280aSSorin Basca World Wide Web such as the KDE project's 11932*0c56280aSSorin Basca\emph on 11933*0c56280aSSorin BascaKonqueror 11934*0c56280aSSorin Basca\begin_inset LatexCommand \cite{KDE} 11935*0c56280aSSorin Basca 11936*0c56280aSSorin Basca\end_inset 11937*0c56280aSSorin Basca 11938*0c56280aSSorin Basca 11939*0c56280aSSorin Basca\emph default 11940*0c56280aSSorin Basca or Mozilla.org's 11941*0c56280aSSorin Basca\emph on 11942*0c56280aSSorin BascaMozilla 11943*0c56280aSSorin Basca\emph default 11944*0c56280aSSorin Basca 11945*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Mozilla} 11946*0c56280aSSorin Basca 11947*0c56280aSSorin Basca\end_inset 11948*0c56280aSSorin Basca 11949*0c56280aSSorin Basca products. 11950*0c56280aSSorin Basca Such Internet technology is also often used in corporate networks. 11951*0c56280aSSorin Basca Corporate networks based on internet technology are called 11952*0c56280aSSorin Basca\emph on 11953*0c56280aSSorin Bascaintranets 11954*0c56280aSSorin Basca\emph default 11955*0c56280aSSorin Basca; these networks are normally protected from the Internet by a so-called 11956*0c56280aSSorin Basca 11957*0c56280aSSorin Basca\emph on 11958*0c56280aSSorin Bascafirewall 11959*0c56280aSSorin Basca\emph default 11960*0c56280aSSorin Basca computer. 11961*0c56280aSSorin Basca 11962*0c56280aSSorin Basca\layout Standard 11963*0c56280aSSorin Basca 11964*0c56280aSSorin BascaThis computer's task is to provide access to the internet only to privileged 11965*0c56280aSSorin Basca employees and --even more important-- it blocks access from unauthorized 11966*0c56280aSSorin Basca persons outside the intranet. 11967*0c56280aSSorin Basca The firewall machine is a single, bi-directional point of access. 11968*0c56280aSSorin Basca\layout Standard 11969*0c56280aSSorin Basca 11970*0c56280aSSorin BascaHowever, normally web-browsing is considered harmless, so that the employees 11971*0c56280aSSorin Basca can unrestrictedly gather information, possibly visiting Java-enabled web 11972*0c56280aSSorin Basca sites. 11973*0c56280aSSorin Basca The JVMs built into the browser software run software downloaded from the 11974*0c56280aSSorin Basca World Wide Web; while the the built-in verifiers make sure that no dangerous 11975*0c56280aSSorin Basca code can be executed. 11976*0c56280aSSorin Basca\layout Standard 11977*0c56280aSSorin Basca 11978*0c56280aSSorin BascaLet us assume someone discovered a security hole in the verifier implementation 11979*0c56280aSSorin Basca or implementations that are used on the corporate network's workstations; 11980*0c56280aSSorin Basca let us also assume a patch exists that would fix the problem. 11981*0c56280aSSorin Basca 11982*0c56280aSSorin Basca\layout Standard 11983*0c56280aSSorin Basca 11984*0c56280aSSorin BascaA system administrator would have to spent a lot of time to repair every 11985*0c56280aSSorin Basca single verifier. 11986*0c56280aSSorin Basca A cheaper solution would be a verifier built into the firewall machine; 11987*0c56280aSSorin Basca such a verifier can easily be implemented using JustIce and its Verification 11988*0c56280aSSorin Basca API. 11989*0c56280aSSorin Basca\layout Subsection 11990*0c56280aSSorin Basca 11991*0c56280aSSorin BascaA Java Virtual Machine Implementation Using JustIce 11992*0c56280aSSorin Basca\layout Standard 11993*0c56280aSSorin Basca 11994*0c56280aSSorin BascaThe Java verifier is originally a part of the Java Virtual Machine. 11995*0c56280aSSorin Basca JustIce could also be part of a Java Virtual Machine. 11996*0c56280aSSorin Basca JustIce's class files (the program code JustIce consists of) could simply 11997*0c56280aSSorin Basca be integrated into the core Java class files. 11998*0c56280aSSorin Basca The execution engine would then run JustIce without actually verifying 11999*0c56280aSSorin Basca JustIce's class files themselves. 12000*0c56280aSSorin Basca 12001*0c56280aSSorin Basca\layout Standard 12002*0c56280aSSorin Basca 12003*0c56280aSSorin BascaFor scientific purposes one could also implement a JVM in the Java programming 12004*0c56280aSSorin Basca language. 12005*0c56280aSSorin Basca Such an implementation could, for example, serve as a debugger. 12006*0c56280aSSorin Basca\layout Subsection 12007*0c56280aSSorin Basca 12008*0c56280aSSorin Basca 12009*0c56280aSSorin Basca\begin_inset LatexCommand \label{LinePrincipleInfoHidingAndSecurity} 12010*0c56280aSSorin Basca 12011*0c56280aSSorin Basca\end_inset 12012*0c56280aSSorin Basca 12013*0c56280aSSorin BascaDrawing a Clear Line Between the Principle of Information Hiding and Security 12014*0c56280aSSorin Basca\layout Standard 12015*0c56280aSSorin Basca 12016*0c56280aSSorin BascaThe principle of information hiding has been (and still is!) a practice 12017*0c56280aSSorin Basca of experienced programmers for many years. 12018*0c56280aSSorin Basca It is there to reduce programming errors. 12019*0c56280aSSorin Basca\layout Standard 12020*0c56280aSSorin Basca 12021*0c56280aSSorin BascaIn the Modula-2 programming language 12022*0c56280aSSorin Basca\begin_inset LatexCommand \cite{M2} 12023*0c56280aSSorin Basca 12024*0c56280aSSorin Basca\end_inset 12025*0c56280aSSorin Basca 12026*0c56280aSSorin Basca this is achieved by explicitely dividing the program code in definition 12027*0c56280aSSorin Basca modules and implementation modules. 12028*0c56280aSSorin Basca In older programming languages, such as in the C programming language 12029*0c56280aSSorin Basca\begin_inset LatexCommand \cite{C} 12030*0c56280aSSorin Basca 12031*0c56280aSSorin Basca\end_inset 12032*0c56280aSSorin Basca 12033*0c56280aSSorin Basca, this principle is implicitely used, too. 12034*0c56280aSSorin Basca Basically this is achieved by defining interfaces that only describe what 12035*0c56280aSSorin Basca the code of a program module does. 12036*0c56280aSSorin Basca These interface 12037*0c56280aSSorin Basca\begin_inset Quotes eld 12038*0c56280aSSorin Basca\end_inset 12039*0c56280aSSorin Basca 12040*0c56280aSSorin Bascaheaders 12041*0c56280aSSorin Basca\begin_inset Quotes erd 12042*0c56280aSSorin Basca\end_inset 12043*0c56280aSSorin Basca 12044*0c56280aSSorin Basca are included into user code instead of simply including the code itself. 12045*0c56280aSSorin Basca 12046*0c56280aSSorin Basca\layout Standard 12047*0c56280aSSorin Basca 12048*0c56280aSSorin BascaIn object-oriented programming languages such as in Delphi 12049*0c56280aSSorin Basca\begin_inset LatexCommand \cite{D3} 12050*0c56280aSSorin Basca 12051*0c56280aSSorin Basca\end_inset 12052*0c56280aSSorin Basca 12053*0c56280aSSorin Basca, C++ 12054*0c56280aSSorin Basca\begin_inset LatexCommand \cite{CPP-D,CPP-E} 12055*0c56280aSSorin Basca 12056*0c56280aSSorin Basca\end_inset 12057*0c56280aSSorin Basca 12058*0c56280aSSorin Basca or Java 12059*0c56280aSSorin Basca\begin_inset LatexCommand \cite{langspec2} 12060*0c56280aSSorin Basca 12061*0c56280aSSorin Basca\end_inset 12062*0c56280aSSorin Basca 12063*0c56280aSSorin Basca, this principle is refined to what is called object encapsulation. 12064*0c56280aSSorin Basca When a class is defined, certain key words such as 12065*0c56280aSSorin Basca\family typewriter 12066*0c56280aSSorin Bascaprivate 12067*0c56280aSSorin Basca\family default 12068*0c56280aSSorin Basca, 12069*0c56280aSSorin Basca\family typewriter 12070*0c56280aSSorin Bascaprotected 12071*0c56280aSSorin Basca\family default 12072*0c56280aSSorin Basca, 12073*0c56280aSSorin Basca\family typewriter 12074*0c56280aSSorin Bascafriend 12075*0c56280aSSorin Basca\family default 12076*0c56280aSSorin Basca, 12077*0c56280aSSorin Basca\family typewriter 12078*0c56280aSSorin Bascapublic 12079*0c56280aSSorin Basca\family default 12080*0c56280aSSorin Basca, 12081*0c56280aSSorin Basca\family typewriter 12082*0c56280aSSorin Bascapublished 12083*0c56280aSSorin Basca\family default 12084*0c56280aSSorin Basca set the access rules for the members 12085*0c56280aSSorin Basca\begin_float footnote 12086*0c56280aSSorin Basca\layout Standard 12087*0c56280aSSorin Basca 12088*0c56280aSSorin BascaThe members of a class are its components: methods (program code) and fields 12089*0c56280aSSorin Basca (also called attributes or variables). 12090*0c56280aSSorin Basca\end_float 12091*0c56280aSSorin Basca of an object of the given class. 12092*0c56280aSSorin Basca\layout Standard 12093*0c56280aSSorin Basca 12094*0c56280aSSorin BascaStill, this refined technique does not have anything to do with security. 12095*0c56280aSSorin Basca It is only there to aid programmers create a reasonable design. 12096*0c56280aSSorin Basca If every piece of code could manipulate every data structure, one would 12097*0c56280aSSorin Basca not know where to look for a programming error in the program source code. 12098*0c56280aSSorin Basca On the other hand, if some field is private in C++, one could (with some 12099*0c56280aSSorin Basca knowledge about the compiler used) still reference and modify this field 12100*0c56280aSSorin Basca by pointer manipulation. 12101*0c56280aSSorin Basca In addition to that, a second program like a debugger could watch even 12102*0c56280aSSorin Basca the data of private fields. 12103*0c56280aSSorin Basca\layout Standard 12104*0c56280aSSorin Basca 12105*0c56280aSSorin BascaHowever, when a Java program is compiled into the language of the JVM, the 12106*0c56280aSSorin Basca information about the access rights of the fields and methods is included. 12107*0c56280aSSorin Basca This is where the principle of information hiding is exploited to provide 12108*0c56280aSSorin Basca security. 12109*0c56280aSSorin Basca For example, the verifier of the JVM has to make sure private fields are 12110*0c56280aSSorin Basca never accessed from a foreign piece of code. 12111*0c56280aSSorin Basca But there are many implementations of the JVM which have security flaws 12112*0c56280aSSorin Basca such as not honouring the access rights. 12113*0c56280aSSorin Basca There are debuggers for JVM bytecodes, too. 12114*0c56280aSSorin Basca\layout Standard 12115*0c56280aSSorin Basca 12116*0c56280aSSorin BascaWhen one thinks about security, one has to think of some enemy who could 12117*0c56280aSSorin Basca try to harm the computer or information stored on that computer. 12118*0c56280aSSorin Basca From a JVM user's point of view, the JVM is relatively secure. 12119*0c56280aSSorin Basca Even running untrusted code cannot do much harm. 12120*0c56280aSSorin Basca Because the security flaws in different JVM implementations differ, they 12121*0c56280aSSorin Basca are probably not exploited most times. 12122*0c56280aSSorin Basca\layout Standard 12123*0c56280aSSorin Basca 12124*0c56280aSSorin BascaFrom a Java programmer's point of view, the JVM is not secure. 12125*0c56280aSSorin Basca Untrusted users can do much harm. 12126*0c56280aSSorin Basca For example, an online banking application storing important data in Java 12127*0c56280aSSorin Basca fields (such as access information to the bank's database management system) 12128*0c56280aSSorin Basca is a threat to both the bank and its customers. 12129*0c56280aSSorin Basca This information could easily be extracted by a malicious user. 12130*0c56280aSSorin Basca\layout Standard 12131*0c56280aSSorin Basca 12132*0c56280aSSorin BascaAnother problem for Java programmers is the amount of symbolical information 12133*0c56280aSSorin Basca stored in class files. 12134*0c56280aSSorin Basca Today, it is easy to de-compile a Java class file back to Java language 12135*0c56280aSSorin Basca source code 12136*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JODE-WWW} 12137*0c56280aSSorin Basca 12138*0c56280aSSorin Basca\end_inset 12139*0c56280aSSorin Basca 12140*0c56280aSSorin Basca. 12141*0c56280aSSorin Basca This source code can then be read and analyzed by the user. 12142*0c56280aSSorin Basca Facing this problem, the 12143*0c56280aSSorin Basca\begin_inset Quotes eld 12144*0c56280aSSorin Basca\end_inset 12145*0c56280aSSorin Basca 12146*0c56280aSSorin Bascaonly safe course of action is to assume that ALL Java code will at some 12147*0c56280aSSorin Basca point be decompiled 12148*0c56280aSSorin Basca\begin_inset Quotes erd 12149*0c56280aSSorin Basca\end_inset 12150*0c56280aSSorin Basca 12151*0c56280aSSorin Basca ( 12152*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JNS} 12153*0c56280aSSorin Basca 12154*0c56280aSSorin Basca\end_inset 12155*0c56280aSSorin Basca 12156*0c56280aSSorin Basca, page 68). 12157*0c56280aSSorin Basca\layout Standard 12158*0c56280aSSorin Basca 12159*0c56280aSSorin BascaWe conclude that the principle of information hiding is not enough to provide 12160*0c56280aSSorin Basca a degree of security that both --users and programmers-- could accept. 12161*0c56280aSSorin Basca Programmers should not believe a good design makes a program 12162*0c56280aSSorin Basca\emph on 12163*0c56280aSSorin Bascasecure 12164*0c56280aSSorin Basca\emph default 12165*0c56280aSSorin Basca. 12166*0c56280aSSorin Basca 12167*0c56280aSSorin Basca\layout Chapter 12168*0c56280aSSorin Basca 12169*0c56280aSSorin BascaAppendix 12170*0c56280aSSorin Basca\layout Section 12171*0c56280aSSorin Basca 12172*0c56280aSSorin BascaHistory of JustIce 12173*0c56280aSSorin Basca\layout Standard 12174*0c56280aSSorin Basca 12175*0c56280aSSorin BascaThe author of JustIce once started to implement a class file decompiler 12176*0c56280aSSorin Basca like Jode 12177*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JODE-WWW} 12178*0c56280aSSorin Basca 12179*0c56280aSSorin Basca\end_inset 12180*0c56280aSSorin Basca 12181*0c56280aSSorin Basca. 12182*0c56280aSSorin Basca It soon became clear that to successfully implement it, one should exploit 12183*0c56280aSSorin Basca the 12184*0c56280aSSorin Basca\begin_inset Quotes eld 12185*0c56280aSSorin Basca\end_inset 12186*0c56280aSSorin Basca 12187*0c56280aSSorin Bascawell-behaved 12188*0c56280aSSorin Basca\begin_inset Quotes erd 12189*0c56280aSSorin Basca\end_inset 12190*0c56280aSSorin Basca 12191*0c56280aSSorin Basca property of class files (which essentially means that they pass a verifier, 12192*0c56280aSSorin Basca especially pass three) 12193*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Krakatoa-WWW} 12194*0c56280aSSorin Basca 12195*0c56280aSSorin Basca\end_inset 12196*0c56280aSSorin Basca 12197*0c56280aSSorin Basca. 12198*0c56280aSSorin Basca 12199*0c56280aSSorin Basca\layout Standard 12200*0c56280aSSorin Basca 12201*0c56280aSSorin BascaJustIce was then developed to understand the 12202*0c56280aSSorin Basca\begin_inset Quotes eld 12203*0c56280aSSorin Basca\end_inset 12204*0c56280aSSorin Basca 12205*0c56280aSSorin Bascawell-behaved 12206*0c56280aSSorin Basca\begin_inset Quotes erd 12207*0c56280aSSorin Basca\end_inset 12208*0c56280aSSorin Basca 12209*0c56280aSSorin Basca property of usual class files. 12210*0c56280aSSorin Basca It took much longer to complete than estimated because of the many inherent 12211*0c56280aSSorin Basca bugs and ambiguities in The Java Virtual Machine Specification, Second 12212*0c56280aSSorin Basca Edition 12213*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12214*0c56280aSSorin Basca 12215*0c56280aSSorin Basca\end_inset 12216*0c56280aSSorin Basca 12217*0c56280aSSorin Basca. 12218*0c56280aSSorin Basca\layout Standard 12219*0c56280aSSorin Basca 12220*0c56280aSSorin BascaIts name starts with a 12221*0c56280aSSorin Basca\emph on 12222*0c56280aSSorin BascaJ 12223*0c56280aSSorin Basca\emph default 12224*0c56280aSSorin Basca like Java does, referring to the tradition of giving Java-related software 12225*0c56280aSSorin Basca such names. 12226*0c56280aSSorin Basca The second part of the name, 12227*0c56280aSSorin Basca\emph on 12228*0c56280aSSorin BascaICE 12229*0c56280aSSorin Basca\emph default 12230*0c56280aSSorin Basca, was inspired by a novel by William Gibson 12231*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Neuromancer} 12232*0c56280aSSorin Basca 12233*0c56280aSSorin Basca\end_inset 12234*0c56280aSSorin Basca 12235*0c56280aSSorin Basca. 12236*0c56280aSSorin Basca It is an acronym for 12237*0c56280aSSorin Basca\emph on 12238*0c56280aSSorin BascaIntrusion Countermeasures Electronics 12239*0c56280aSSorin Basca\emph default 12240*0c56280aSSorin Basca, something that is very much like today's firewall systems (see section 12241*0c56280aSSorin Basca 12242*0c56280aSSorin Basca\begin_inset LatexCommand \ref{Firewall} 12243*0c56280aSSorin Basca 12244*0c56280aSSorin Basca\end_inset 12245*0c56280aSSorin Basca 12246*0c56280aSSorin Basca). 12247*0c56280aSSorin Basca He credits the invention of 12248*0c56280aSSorin Basca\emph on 12249*0c56280aSSorin BascaICE 12250*0c56280aSSorin Basca\emph default 12251*0c56280aSSorin Basca to Tom Maddox. 12252*0c56280aSSorin Basca The missing three letters were inserted to create a word that makes sense; 12253*0c56280aSSorin Basca in fact, choosing the three-letter combination 12254*0c56280aSSorin Basca\emph on 12255*0c56280aSSorin Bascaust 12256*0c56280aSSorin Basca\emph default 12257*0c56280aSSorin Bascaresulted in the creation of a word with a double sense via bi-capitalization. 12258*0c56280aSSorin Basca\layout Standard 12259*0c56280aSSorin Basca 12260*0c56280aSSorin BascaJustIce was written using and extending the excellent Byte Code Engineering 12261*0c56280aSSorin Basca Library 12262*0c56280aSSorin Basca\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 12263*0c56280aSSorin Basca 12264*0c56280aSSorin Basca\end_inset 12265*0c56280aSSorin Basca 12266*0c56280aSSorin Basca by Markus Dahm. 12267*0c56280aSSorin Basca It really helped a lot and sped up development time. 12268*0c56280aSSorin Basca\layout Standard 12269*0c56280aSSorin Basca 12270*0c56280aSSorin BascaIt was also --last but not least-- written to earn its author a German 12271*0c56280aSSorin Basca\emph on 12272*0c56280aSSorin Basca Dipl.-Inform. 12273*0c56280aSSorin Basca 12274*0c56280aSSorin Basca\emph default 12275*0c56280aSSorin Basca degree which one may compare to a 12276*0c56280aSSorin Basca\emph on 12277*0c56280aSSorin Bascamaster 12278*0c56280aSSorin Basca\emph default 12279*0c56280aSSorin Basca degree. 12280*0c56280aSSorin Basca\layout Section 12281*0c56280aSSorin Basca 12282*0c56280aSSorin BascaFlaws and Ambiguities Encountered 12283*0c56280aSSorin Basca\layout Standard 12284*0c56280aSSorin Basca 12285*0c56280aSSorin BascaWhile designing, implementing and testing JustIce, a lot of interesting 12286*0c56280aSSorin Basca flaws and ambiguities were found in the specification 12287*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12288*0c56280aSSorin Basca 12289*0c56280aSSorin Basca\end_inset 12290*0c56280aSSorin Basca 12291*0c56280aSSorin Basca, the Java compiler 12292*0c56280aSSorin Basca\emph on 12293*0c56280aSSorin Bascajavac 12294*0c56280aSSorin Basca\emph default 12295*0c56280aSSorin Basca and the JVM 12296*0c56280aSSorin Basca\emph on 12297*0c56280aSSorin Bascajava 12298*0c56280aSSorin Basca\emph default 12299*0c56280aSSorin Basca. 12300*0c56280aSSorin Basca\layout Subsection 12301*0c56280aSSorin Basca 12302*0c56280aSSorin BascaFlaws in the Java Virtual Machine Specification 12303*0c56280aSSorin Basca\layout Standard 12304*0c56280aSSorin Basca 12305*0c56280aSSorin BascaThe Java Virtual Machine Specification, Second Edition was derived from 12306*0c56280aSSorin Basca an in-house document describing the as-is implementation of Sun's genuine 12307*0c56280aSSorin Basca Java Virtual Machine ( 12308*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12309*0c56280aSSorin Basca 12310*0c56280aSSorin Basca\end_inset 12311*0c56280aSSorin Basca 12312*0c56280aSSorin Basca, page xiv). 12313*0c56280aSSorin Basca This sometimes leads to problems as there are still a few points left where 12314*0c56280aSSorin Basca Sun's engineers forgot to describe specification details to the public, 12315*0c56280aSSorin Basca in error assuming they would be implementation details. 12316*0c56280aSSorin Basca Another source of mistakes are ambiguities, inherent to natural languages 12317*0c56280aSSorin Basca auch as English. 12318*0c56280aSSorin Basca\layout Subsubsection 12319*0c56280aSSorin Basca 12320*0c56280aSSorin BascaA Code Length Maximum of 65535 Bytes per Method 12321*0c56280aSSorin Basca\layout Standard 12322*0c56280aSSorin Basca 12323*0c56280aSSorin BascaOn page 152, The Java Virtual Machine Specification, Second Edition 12324*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12325*0c56280aSSorin Basca 12326*0c56280aSSorin Basca\end_inset 12327*0c56280aSSorin Basca 12328*0c56280aSSorin Basca says that code arrays may at most have a length of 65536 bytes because 12329*0c56280aSSorin Basca certain indices that point into the code are only 16 bits of width. 12330*0c56280aSSorin Basca Page 134 states the code must have 12331*0c56280aSSorin Basca\begin_inset Quotes gld 12332*0c56280aSSorin Basca\end_inset 12333*0c56280aSSorin Basca 12334*0c56280aSSorin Bascaless than 12335*0c56280aSSorin Basca\begin_inset Quotes grd 12336*0c56280aSSorin Basca\end_inset 12337*0c56280aSSorin Basca 12338*0c56280aSSorin Basca 65536 bytes. 12339*0c56280aSSorin Basca Therefore, the limitation stated on page 152 is not helpful, but only confusing. 12340*0c56280aSSorin Basca\layout Subsubsection 12341*0c56280aSSorin Basca 12342*0c56280aSSorin BascaSubroutines 12343*0c56280aSSorin Basca\layout Standard 12344*0c56280aSSorin Basca 12345*0c56280aSSorin BascaThe implementation of a provably correct verifier is not possible because 12346*0c56280aSSorin Basca of the ambiguities in the specification 12347*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12348*0c56280aSSorin Basca 12349*0c56280aSSorin Basca\end_inset 12350*0c56280aSSorin Basca 12351*0c56280aSSorin Basca. 12352*0c56280aSSorin Basca To reach this goal, various efforts have been made to describe the verifier 12353*0c56280aSSorin Basca and the JVM formally 12354*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Qian,StataAbadi,FreundMitchell,JBook,JPaper} 12355*0c56280aSSorin Basca 12356*0c56280aSSorin Basca\end_inset 12357*0c56280aSSorin Basca 12358*0c56280aSSorin Basca. 12359*0c56280aSSorin Basca By restricting the code 12360*0c56280aSSorin Basca\emph on 12361*0c56280aSSorin Bascajavac 12362*0c56280aSSorin Basca\emph default 12363*0c56280aSSorin Basca produces or by redefining the verifier's behaviour, however, they are never 12364*0c56280aSSorin Basca one-to-one with the behaviour of the existing JVMs. 12365*0c56280aSSorin Basca\layout Standard 12366*0c56280aSSorin Basca 12367*0c56280aSSorin BascaSun's specification does not define the term 12368*0c56280aSSorin Basca\emph on 12369*0c56280aSSorin Bascasubroutine 12370*0c56280aSSorin Basca\emph default 12371*0c56280aSSorin Basca although it is used. 12372*0c56280aSSorin Basca Instead, it is explained what bytecode the Java 12373*0c56280aSSorin Basca\emph on 12374*0c56280aSSorin Bascacompiler 12375*0c56280aSSorin Basca\emph default 12376*0c56280aSSorin Basca generates when a 12377*0c56280aSSorin Basca\family typewriter 12378*0c56280aSSorin Bascafinally 12379*0c56280aSSorin Basca\family default 12380*0c56280aSSorin Basca clause appears in the Java 12381*0c56280aSSorin Basca\emph on 12382*0c56280aSSorin Bascalanguage 12383*0c56280aSSorin Basca\emph default 12384*0c56280aSSorin Basca source code -- this definitely does not belong there, because a verifier 12385*0c56280aSSorin Basca must never assume the code it verifies was created by Sun's 12386*0c56280aSSorin Basca\emph on 12387*0c56280aSSorin Bascajavac 12388*0c56280aSSorin Basca\emph default 12389*0c56280aSSorin Basca compiler. 12390*0c56280aSSorin Basca\layout Standard 12391*0c56280aSSorin Basca 12392*0c56280aSSorin BascaClarifying this issue could lead to an 12393*0c56280aSSorin Basca\emph on 12394*0c56280aSSorin Bascaofficial 12395*0c56280aSSorin Basca\emph default 12396*0c56280aSSorin Basca formal specification. 12397*0c56280aSSorin Basca\layout Subsubsection 12398*0c56280aSSorin Basca 12399*0c56280aSSorin BascaThe Specification Sometimes Satisfies the Verifier 12400*0c56280aSSorin Basca\layout Standard 12401*0c56280aSSorin Basca 12402*0c56280aSSorin Basca 12403*0c56280aSSorin Basca\begin_inset LatexCommand \label{InvokeInterfaceDescFONG} 12404*0c56280aSSorin Basca 12405*0c56280aSSorin Basca\end_inset 12406*0c56280aSSorin Basca 12407*0c56280aSSorin BascaFong 12408*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong2-WWW} 12409*0c56280aSSorin Basca 12410*0c56280aSSorin Basca\end_inset 12411*0c56280aSSorin Basca 12412*0c56280aSSorin Basca found in 1997 that the 12413*0c56280aSSorin Basca\family typewriter 12414*0c56280aSSorin Bascainvokeinterface 12415*0c56280aSSorin Basca\family default 12416*0c56280aSSorin Basca opcode was underspecified in the first edition of the Java Virtual Machine 12417*0c56280aSSorin Basca Specification. 12418*0c56280aSSorin Basca He managed to create a class file that did not implement a specific interface 12419*0c56280aSSorin Basca but nevertheless used 12420*0c56280aSSorin Basca\family typewriter 12421*0c56280aSSorin Bascainvokeinterface 12422*0c56280aSSorin Basca\family default 12423*0c56280aSSorin Basca to invoke a method. 12424*0c56280aSSorin Basca This class file passed the verifier (up to pass three), but the JVM found 12425*0c56280aSSorin Basca the problem during run-time (pass four). 12426*0c56280aSSorin Basca Fong concluded that the omission in the specification was done on purpose 12427*0c56280aSSorin Basca because the implementation of the data flow analyzer does not allow to 12428*0c56280aSSorin Basca check this constraint (please see section 12429*0c56280aSSorin Basca\begin_inset LatexCommand \ref{NewVerificationStrategy} 12430*0c56280aSSorin Basca 12431*0c56280aSSorin Basca\end_inset 12432*0c56280aSSorin Basca 12433*0c56280aSSorin Basca for a description of how this limitation could be overcome). 12434*0c56280aSSorin Basca However, in The Java Virtual Machine Specification, Second Edition 12435*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12436*0c56280aSSorin Basca 12437*0c56280aSSorin Basca\end_inset 12438*0c56280aSSorin Basca 12439*0c56280aSSorin Basca, the specification of 12440*0c56280aSSorin Basca\family typewriter 12441*0c56280aSSorin Bascainvokeinterface 12442*0c56280aSSorin Basca\family default 12443*0c56280aSSorin Basca is corrected. 12444*0c56280aSSorin Basca\layout Standard 12445*0c56280aSSorin Basca 12446*0c56280aSSorin BascaStill, there is another case where one would suspect the specification describes 12447*0c56280aSSorin Basca the behaviour of the verifier: on pages 147 and 148 of the specification 12448*0c56280aSSorin Basca 12449*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12450*0c56280aSSorin Basca 12451*0c56280aSSorin Basca\end_inset 12452*0c56280aSSorin Basca 12453*0c56280aSSorin Basca, verification of instance initialization methods and newly created objects 12454*0c56280aSSorin Basca is explained. 12455*0c56280aSSorin Basca 12456*0c56280aSSorin Basca\begin_inset Quotes eld 12457*0c56280aSSorin Basca\end_inset 12458*0c56280aSSorin Basca 12459*0c56280aSSorin BascaA valid instruction sequence must not have an uninitialized object on the 12460*0c56280aSSorin Basca operand stack or in a local variable during a backwards branch, or in a 12461*0c56280aSSorin Basca local variable in code protected by an exception handler or a 12462*0c56280aSSorin Basca\family typewriter 12463*0c56280aSSorin Bascafinally 12464*0c56280aSSorin Basca\family default 12465*0c56280aSSorin Basca clause 12466*0c56280aSSorin Basca\begin_inset Quotes erd 12467*0c56280aSSorin Basca\end_inset 12468*0c56280aSSorin Basca 12469*0c56280aSSorin Basca. 12470*0c56280aSSorin Basca Note that the Java language keyword 12471*0c56280aSSorin Basca\family typewriter 12472*0c56280aSSorin Bascafinally 12473*0c56280aSSorin Basca\family default 12474*0c56280aSSorin Basca does not really belong here (Sun should speak of 12475*0c56280aSSorin Basca\emph on 12476*0c56280aSSorin Bascasubroutines 12477*0c56280aSSorin Basca\emph default 12478*0c56280aSSorin Basca), but more important is that this specification is made to satisfy the 12479*0c56280aSSorin Basca verification algorithm: 12480*0c56280aSSorin Basca\begin_inset Quotes eld 12481*0c56280aSSorin Basca\end_inset 12482*0c56280aSSorin Basca 12483*0c56280aSSorin BascaOtherwise, a devious piece of code might fool the verifier 12484*0c56280aSSorin Basca\begin_inset Quotes erd 12485*0c56280aSSorin Basca\end_inset 12486*0c56280aSSorin Basca 12487*0c56280aSSorin Basca. 12488*0c56280aSSorin Basca 12489*0c56280aSSorin Basca\layout Subsubsection 12490*0c56280aSSorin Basca 12491*0c56280aSSorin Basca 12492*0c56280aSSorin Basca\begin_inset LatexCommand \label{InnerBug} 12493*0c56280aSSorin Basca 12494*0c56280aSSorin Basca\end_inset 12495*0c56280aSSorin Basca 12496*0c56280aSSorin BascaThe '$' Character as a Valid Part of a Java Name 12497*0c56280aSSorin Basca\layout Standard 12498*0c56280aSSorin Basca 12499*0c56280aSSorin BascaBecause the 12500*0c56280aSSorin Basca\emph on 12501*0c56280aSSorin Bascajavac 12502*0c56280aSSorin Basca\emph default 12503*0c56280aSSorin Basca compiler may create class files with a '$' character in their names as 12504*0c56280aSSorin Basca a result of Java source files defining inner classes, this character should 12505*0c56280aSSorin Basca no longer be a valid part of a Java name to avoid problems. 12506*0c56280aSSorin Basca I.e., the method invocation 12507*0c56280aSSorin Basca\emph on 12508*0c56280aSSorin Bascaja\SpecialChar \- 12509*0c56280aSSorin Bascava.lang.Cha\SpecialChar \- 12510*0c56280aSSorin Bascarac\SpecialChar \- 12511*0c56280aSSorin Bascater.is\SpecialChar \- 12512*0c56280aSSorin BascaJa\SpecialChar \- 12513*0c56280aSSorin Bascava\SpecialChar \- 12514*0c56280aSSorin BascaIden\SpecialChar \- 12515*0c56280aSSorin Bascatifier\SpecialChar \- 12516*0c56280aSSorin BascaPart('$'); 12517*0c56280aSSorin Basca\emph default 12518*0c56280aSSorin Basca should return the value 12519*0c56280aSSorin Basca\family typewriter 12520*0c56280aSSorin Bascafalse 12521*0c56280aSSorin Basca\family default 12522*0c56280aSSorin Basca. 12523*0c56280aSSorin Basca\layout Subsection 12524*0c56280aSSorin Basca 12525*0c56280aSSorin BascaFlaws in the Implementation of the 12526*0c56280aSSorin Basca\emph on 12527*0c56280aSSorin BascaJava Platform 12528*0c56280aSSorin Basca\layout Subsubsection 12529*0c56280aSSorin Basca 12530*0c56280aSSorin Basca 12531*0c56280aSSorin Basca\begin_inset LatexCommand \label{javacRejected} 12532*0c56280aSSorin Basca 12533*0c56280aSSorin Basca\end_inset 12534*0c56280aSSorin Basca 12535*0c56280aSSorin BascaSun's Verifier Rejects Code Produced by Sun's Compiler 12536*0c56280aSSorin Basca\layout Standard 12537*0c56280aSSorin Basca 12538*0c56280aSSorin BascaSurprisingly, there are a number of examples in which such a thing happens. 12539*0c56280aSSorin Basca\layout Paragraph 12540*0c56280aSSorin Basca 12541*0c56280aSSorin Basca 12542*0c56280aSSorin Basca\begin_inset LatexCommand \label{StaerkJreject} 12543*0c56280aSSorin Basca 12544*0c56280aSSorin Basca\end_inset 12545*0c56280aSSorin Basca 12546*0c56280aSSorin BascaAnother Problem With Subroutines 12547*0c56280aSSorin Basca\layout Standard 12548*0c56280aSSorin Basca 12549*0c56280aSSorin BascaIn 12550*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JPaper} 12551*0c56280aSSorin Basca 12552*0c56280aSSorin Basca\end_inset 12553*0c56280aSSorin Basca 12554*0c56280aSSorin Basca, St�rk and Schmid give a few code examples which are compiled correctly 12555*0c56280aSSorin Basca by the 12556*0c56280aSSorin Basca\emph on 12557*0c56280aSSorin Bascajavac 12558*0c56280aSSorin Basca\emph default 12559*0c56280aSSorin Basca compiler but the resulting code is rejected by the traditional verifiers. 12560*0c56280aSSorin Basca Algorithms 12561*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StaerkJLang} 12562*0c56280aSSorin Basca 12563*0c56280aSSorin Basca\end_inset 12564*0c56280aSSorin Basca 12565*0c56280aSSorin Basca and 12566*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StaerkJByteCode} 12567*0c56280aSSorin Basca 12568*0c56280aSSorin Basca\end_inset 12569*0c56280aSSorin Basca 12570*0c56280aSSorin Basca show one of their examples given in the Java programming language and the 12571*0c56280aSSorin Basca resulting output of the 12572*0c56280aSSorin Basca\emph on 12573*0c56280aSSorin Bascajavac 12574*0c56280aSSorin Basca\emph default 12575*0c56280aSSorin Basca compiler. 12576*0c56280aSSorin Basca\begin_float alg 12577*0c56280aSSorin Basca\layout Caption 12578*0c56280aSSorin Basca 12579*0c56280aSSorin Basca 12580*0c56280aSSorin Basca\begin_inset LatexCommand \label{StaerkJLang} 12581*0c56280aSSorin Basca 12582*0c56280aSSorin Basca\end_inset 12583*0c56280aSSorin Basca 12584*0c56280aSSorin BascaSt�rk and Schmid's Rejected Class, Java Language Version 12585*0c56280aSSorin Basca\layout Standard 12586*0c56280aSSorin Basca 12587*0c56280aSSorin Basca 12588*0c56280aSSorin Basca\family typewriter 12589*0c56280aSSorin Bascaclass Test1{ 12590*0c56280aSSorin Basca\newline 12591*0c56280aSSorin Basca\SpecialChar \- 12592*0c56280aSSorin Basca\SpecialChar ~ 12593*0c56280aSSorin Basca\SpecialChar ~ 12594*0c56280aSSorin Basca\SpecialChar ~ 12595*0c56280aSSorin Basca\SpecialChar ~ 12596*0c56280aSSorin Bascaint test(boolean b){ 12597*0c56280aSSorin Basca\newline 12598*0c56280aSSorin Basca\SpecialChar \- 12599*0c56280aSSorin Basca\SpecialChar ~ 12600*0c56280aSSorin Basca\SpecialChar ~ 12601*0c56280aSSorin Basca\SpecialChar ~ 12602*0c56280aSSorin Basca\SpecialChar ~ 12603*0c56280aSSorin Basca\SpecialChar ~ 12604*0c56280aSSorin Basca\SpecialChar ~ 12605*0c56280aSSorin Bascaint i; 12606*0c56280aSSorin Basca\newline 12607*0c56280aSSorin Basca\SpecialChar \- 12608*0c56280aSSorin Basca\SpecialChar ~ 12609*0c56280aSSorin Basca\SpecialChar ~ 12610*0c56280aSSorin Basca\SpecialChar ~ 12611*0c56280aSSorin Basca\SpecialChar ~ 12612*0c56280aSSorin Basca\SpecialChar ~ 12613*0c56280aSSorin Basca\SpecialChar ~ 12614*0c56280aSSorin Bascatry{ 12615*0c56280aSSorin Basca\newline 12616*0c56280aSSorin Basca\SpecialChar \- 12617*0c56280aSSorin Basca\SpecialChar ~ 12618*0c56280aSSorin Basca\SpecialChar ~ 12619*0c56280aSSorin Basca\SpecialChar ~ 12620*0c56280aSSorin Basca\SpecialChar ~ 12621*0c56280aSSorin Basca\SpecialChar ~ 12622*0c56280aSSorin Basca\SpecialChar ~ 12623*0c56280aSSorin Basca\SpecialChar ~ 12624*0c56280aSSorin Basca\SpecialChar ~ 12625*0c56280aSSorin Bascaif (b) return 1; 12626*0c56280aSSorin Basca\newline 12627*0c56280aSSorin Basca\SpecialChar \- 12628*0c56280aSSorin Basca\SpecialChar ~ 12629*0c56280aSSorin Basca\SpecialChar ~ 12630*0c56280aSSorin Basca\SpecialChar ~ 12631*0c56280aSSorin Basca\SpecialChar ~ 12632*0c56280aSSorin Basca\SpecialChar ~ 12633*0c56280aSSorin Basca\SpecialChar ~ 12634*0c56280aSSorin Basca\SpecialChar ~ 12635*0c56280aSSorin Basca\SpecialChar ~ 12636*0c56280aSSorin Bascai=2; 12637*0c56280aSSorin Basca\newline 12638*0c56280aSSorin Basca\SpecialChar \- 12639*0c56280aSSorin Basca\SpecialChar ~ 12640*0c56280aSSorin Basca\SpecialChar ~ 12641*0c56280aSSorin Basca\SpecialChar ~ 12642*0c56280aSSorin Basca\SpecialChar ~ 12643*0c56280aSSorin Basca\SpecialChar ~ 12644*0c56280aSSorin Basca\SpecialChar ~ 12645*0c56280aSSorin Basca} 12646*0c56280aSSorin Basca\newline 12647*0c56280aSSorin Basca\SpecialChar \- 12648*0c56280aSSorin Basca\SpecialChar ~ 12649*0c56280aSSorin Basca\SpecialChar ~ 12650*0c56280aSSorin Basca\SpecialChar ~ 12651*0c56280aSSorin Basca\SpecialChar ~ 12652*0c56280aSSorin Basca\SpecialChar ~ 12653*0c56280aSSorin Basca\SpecialChar ~ 12654*0c56280aSSorin Bascafinally { 12655*0c56280aSSorin Basca\newline 12656*0c56280aSSorin Basca\SpecialChar \- 12657*0c56280aSSorin Basca\SpecialChar ~ 12658*0c56280aSSorin Basca\SpecialChar ~ 12659*0c56280aSSorin Basca\SpecialChar ~ 12660*0c56280aSSorin Basca\SpecialChar ~ 12661*0c56280aSSorin Basca\SpecialChar ~ 12662*0c56280aSSorin Basca\SpecialChar ~ 12663*0c56280aSSorin Basca\SpecialChar ~ 12664*0c56280aSSorin Basca\SpecialChar ~ 12665*0c56280aSSorin Bascaif (b) i = 3; 12666*0c56280aSSorin Basca\newline 12667*0c56280aSSorin Basca\SpecialChar \- 12668*0c56280aSSorin Basca\SpecialChar ~ 12669*0c56280aSSorin Basca\SpecialChar ~ 12670*0c56280aSSorin Basca\SpecialChar ~ 12671*0c56280aSSorin Basca\SpecialChar ~ 12672*0c56280aSSorin Basca\SpecialChar ~ 12673*0c56280aSSorin Basca\SpecialChar ~ 12674*0c56280aSSorin Basca} 12675*0c56280aSSorin Basca\newline 12676*0c56280aSSorin Basca\SpecialChar \- 12677*0c56280aSSorin Basca\SpecialChar ~ 12678*0c56280aSSorin Basca\SpecialChar ~ 12679*0c56280aSSorin Basca\SpecialChar ~ 12680*0c56280aSSorin Basca\SpecialChar ~ 12681*0c56280aSSorin Basca\SpecialChar ~ 12682*0c56280aSSorin Basca\SpecialChar ~ 12683*0c56280aSSorin Bascareturn i; 12684*0c56280aSSorin Basca\newline 12685*0c56280aSSorin Basca\SpecialChar \- 12686*0c56280aSSorin Basca\SpecialChar ~ 12687*0c56280aSSorin Basca\SpecialChar ~ 12688*0c56280aSSorin Basca\SpecialChar ~ 12689*0c56280aSSorin Basca\SpecialChar ~ 12690*0c56280aSSorin Basca} 12691*0c56280aSSorin Basca\newline 12692*0c56280aSSorin Basca\SpecialChar ~ 12693*0c56280aSSorin Basca\SpecialChar ~ 12694*0c56280aSSorin Basca\SpecialChar ~ 12695*0c56280aSSorin Basca} 12696*0c56280aSSorin Basca\end_float 12697*0c56280aSSorin Basca\layout Standard 12698*0c56280aSSorin Basca 12699*0c56280aSSorin Basca\begin_float alg 12700*0c56280aSSorin Basca\layout Caption 12701*0c56280aSSorin Basca 12702*0c56280aSSorin Basca 12703*0c56280aSSorin Basca\begin_inset LatexCommand \label{StaerkJByteCode} 12704*0c56280aSSorin Basca 12705*0c56280aSSorin Basca\end_inset 12706*0c56280aSSorin Basca 12707*0c56280aSSorin BascaSt�rk and Schmid's Rejected Class, JVM Bytecode Version 12708*0c56280aSSorin Basca\layout Standard 12709*0c56280aSSorin Basca 12710*0c56280aSSorin Basca 12711*0c56280aSSorin Basca\family typewriter 12712*0c56280aSSorin Bascaint test(boolean arg1) 12713*0c56280aSSorin Basca\layout Standard 12714*0c56280aSSorin Basca 12715*0c56280aSSorin Basca 12716*0c56280aSSorin Basca\family typewriter 12717*0c56280aSSorin BascaCode(max_stack = 1, max_locals = 6, code_length = 39) 12718*0c56280aSSorin Basca\layout Standard 12719*0c56280aSSorin Basca 12720*0c56280aSSorin Basca 12721*0c56280aSSorin Basca\family typewriter 12722*0c56280aSSorin Basca0: iload_1 12723*0c56280aSSorin Basca\layout Standard 12724*0c56280aSSorin Basca 12725*0c56280aSSorin Basca 12726*0c56280aSSorin Basca\family typewriter 12727*0c56280aSSorin Basca1: ifeq #11 12728*0c56280aSSorin Basca\layout Standard 12729*0c56280aSSorin Basca 12730*0c56280aSSorin Basca 12731*0c56280aSSorin Basca\family typewriter 12732*0c56280aSSorin Basca4: iconst_1 12733*0c56280aSSorin Basca\layout Standard 12734*0c56280aSSorin Basca 12735*0c56280aSSorin Basca 12736*0c56280aSSorin Basca\family typewriter 12737*0c56280aSSorin Basca5: istore_3 12738*0c56280aSSorin Basca\layout Standard 12739*0c56280aSSorin Basca 12740*0c56280aSSorin Basca 12741*0c56280aSSorin Basca\family typewriter 12742*0c56280aSSorin Basca6: jsr #27 12743*0c56280aSSorin Basca\layout Standard 12744*0c56280aSSorin Basca 12745*0c56280aSSorin Basca 12746*0c56280aSSorin Basca\family typewriter 12747*0c56280aSSorin Basca9: iload_3 12748*0c56280aSSorin Basca\layout Standard 12749*0c56280aSSorin Basca 12750*0c56280aSSorin Basca 12751*0c56280aSSorin Basca\family typewriter 12752*0c56280aSSorin Basca10: ireturn 12753*0c56280aSSorin Basca\layout Standard 12754*0c56280aSSorin Basca 12755*0c56280aSSorin Basca 12756*0c56280aSSorin Basca\family typewriter 12757*0c56280aSSorin Basca11: iconst_2 12758*0c56280aSSorin Basca\layout Standard 12759*0c56280aSSorin Basca 12760*0c56280aSSorin Basca 12761*0c56280aSSorin Basca\family typewriter 12762*0c56280aSSorin Basca12: istore_2 12763*0c56280aSSorin Basca\layout Standard 12764*0c56280aSSorin Basca 12765*0c56280aSSorin Basca 12766*0c56280aSSorin Basca\family typewriter 12767*0c56280aSSorin Basca13: jsr #27 12768*0c56280aSSorin Basca\layout Standard 12769*0c56280aSSorin Basca 12770*0c56280aSSorin Basca 12771*0c56280aSSorin Basca\family typewriter 12772*0c56280aSSorin Basca16: goto #37 12773*0c56280aSSorin Basca\layout Standard 12774*0c56280aSSorin Basca 12775*0c56280aSSorin Basca 12776*0c56280aSSorin Basca\family typewriter 12777*0c56280aSSorin Basca19: astore %4 12778*0c56280aSSorin Basca\layout Standard 12779*0c56280aSSorin Basca 12780*0c56280aSSorin Basca 12781*0c56280aSSorin Basca\family typewriter 12782*0c56280aSSorin Basca21: jsr #27 12783*0c56280aSSorin Basca\layout Standard 12784*0c56280aSSorin Basca 12785*0c56280aSSorin Basca 12786*0c56280aSSorin Basca\family typewriter 12787*0c56280aSSorin Basca24: aload %4 12788*0c56280aSSorin Basca\layout Standard 12789*0c56280aSSorin Basca 12790*0c56280aSSorin Basca 12791*0c56280aSSorin Basca\family typewriter 12792*0c56280aSSorin Basca26: athrow 12793*0c56280aSSorin Basca\layout Standard 12794*0c56280aSSorin Basca 12795*0c56280aSSorin Basca 12796*0c56280aSSorin Basca\family typewriter 12797*0c56280aSSorin Basca27: astore %5 12798*0c56280aSSorin Basca\layout Standard 12799*0c56280aSSorin Basca 12800*0c56280aSSorin Basca 12801*0c56280aSSorin Basca\family typewriter 12802*0c56280aSSorin Basca29: iload_1 12803*0c56280aSSorin Basca\layout Standard 12804*0c56280aSSorin Basca 12805*0c56280aSSorin Basca 12806*0c56280aSSorin Basca\family typewriter 12807*0c56280aSSorin Basca30: ifeq #35 12808*0c56280aSSorin Basca\layout Standard 12809*0c56280aSSorin Basca 12810*0c56280aSSorin Basca 12811*0c56280aSSorin Basca\family typewriter 12812*0c56280aSSorin Basca33: iconst_3 12813*0c56280aSSorin Basca\layout Standard 12814*0c56280aSSorin Basca 12815*0c56280aSSorin Basca 12816*0c56280aSSorin Basca\family typewriter 12817*0c56280aSSorin Basca34: istore_2 12818*0c56280aSSorin Basca\layout Standard 12819*0c56280aSSorin Basca 12820*0c56280aSSorin Basca 12821*0c56280aSSorin Basca\family typewriter 12822*0c56280aSSorin Basca35: ret %5 12823*0c56280aSSorin Basca\layout Standard 12824*0c56280aSSorin Basca 12825*0c56280aSSorin Basca 12826*0c56280aSSorin Basca\family typewriter 12827*0c56280aSSorin Basca37: iload_2 12828*0c56280aSSorin Basca\layout Standard 12829*0c56280aSSorin Basca 12830*0c56280aSSorin Basca 12831*0c56280aSSorin Basca\family typewriter 12832*0c56280aSSorin Basca38: ireturn 12833*0c56280aSSorin Basca\end_float 12834*0c56280aSSorin BascaIf one tries to run this bytecode using a JVM by IBM Corporation, the code 12835*0c56280aSSorin Basca is rejected 12836*0c56280aSSorin Basca\begin_float footnote 12837*0c56280aSSorin Basca\layout Standard 12838*0c56280aSSorin Basca 12839*0c56280aSSorin BascaIt is also rejected by Sun's JVMs and the Kimera verifier 12840*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-WWW} 12841*0c56280aSSorin Basca 12842*0c56280aSSorin Basca\end_inset 12843*0c56280aSSorin Basca 12844*0c56280aSSorin Basca. 12845*0c56280aSSorin Basca\end_float 12846*0c56280aSSorin Basca: 12847*0c56280aSSorin Basca\newline 12848*0c56280aSSorin Basca 12849*0c56280aSSorin Basca\family typewriter 12850*0c56280aSSorin Bascaehaase@haneman:/home/ehaase > java Test1 12851*0c56280aSSorin Basca\newline 12852*0c56280aSSorin Basca\SpecialChar \- 12853*0c56280aSSorin Basca\SpecialChar ~ 12854*0c56280aSSorin Basca\SpecialChar ~ 12855*0c56280aSSorin BascaException in thread "main" java.lang.VerifyError: 12856*0c56280aSSorin Basca\newline 12857*0c56280aSSorin Basca\SpecialChar \- 12858*0c56280aSSorin Basca\SpecialChar ~ 12859*0c56280aSSorin Basca\SpecialChar ~ 12860*0c56280aSSorin Basca(class: Test1, method: test signature: (Z)I) 12861*0c56280aSSorin Basca\newline 12862*0c56280aSSorin Basca\SpecialChar \- 12863*0c56280aSSorin Basca\SpecialChar ~ 12864*0c56280aSSorin Basca\SpecialChar ~ 12865*0c56280aSSorin BascaLocalvariable 2 contains wrong type 12866*0c56280aSSorin Basca\newline 12867*0c56280aSSorin Basca 12868*0c56280aSSorin Basca\newline 12869*0c56280aSSorin Basca 12870*0c56280aSSorin Basca\family default 12871*0c56280aSSorin BascaIn his lectures, St�rk explains that the problem lies in the polymorphic 12872*0c56280aSSorin Basca nature of JVM subroutines 12873*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JLectures} 12874*0c56280aSSorin Basca 12875*0c56280aSSorin Basca\end_inset 12876*0c56280aSSorin Basca 12877*0c56280aSSorin Basca. 12878*0c56280aSSorin Basca Consider algorithm 12879*0c56280aSSorin Basca\begin_inset LatexCommand \ref{StaerkJByteCode} 12880*0c56280aSSorin Basca 12881*0c56280aSSorin Basca\end_inset 12882*0c56280aSSorin Basca 12883*0c56280aSSorin Basca. 12884*0c56280aSSorin Basca In line 12, an 12885*0c56280aSSorin Basca\family typewriter 12886*0c56280aSSorin Bascaint 12887*0c56280aSSorin Basca\family default 12888*0c56280aSSorin Basca is put into local variable number 2. 12889*0c56280aSSorin Basca The subroutine starting at line 27 is then called from line number 13. 12890*0c56280aSSorin Basca Note that this subroutine accesses the local variable number 2. 12891*0c56280aSSorin Basca Finally, line 16 transfers control to line 37 where the verification problem 12892*0c56280aSSorin Basca occurs. 12893*0c56280aSSorin Basca An 12894*0c56280aSSorin Basca\family typewriter 12895*0c56280aSSorin Bascaint 12896*0c56280aSSorin Basca\family default 12897*0c56280aSSorin Basca should be read from local variable number 2, but this is marked 12898*0c56280aSSorin Basca\family typewriter 12899*0c56280aSSorin Bascaunusable 12900*0c56280aSSorin Basca\family default 12901*0c56280aSSorin Basca, because it was accessed in the subroutine. 12902*0c56280aSSorin Basca\layout Standard 12903*0c56280aSSorin Basca 12904*0c56280aSSorin BascaHowever, the specification ( 12905*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 12906*0c56280aSSorin Basca 12907*0c56280aSSorin Basca\end_inset 12908*0c56280aSSorin Basca 12909*0c56280aSSorin Basca, page 151) states: 12910*0c56280aSSorin Basca\layout Itemize 12911*0c56280aSSorin Basca 12912*0c56280aSSorin BascaFor any local variable that [\SpecialChar \ldots{} 12913*0c56280aSSorin Basca] has been accessed or modified by the subroutine, 12914*0c56280aSSorin Basca use the type of the local variable at the time of the 12915*0c56280aSSorin Basca\family typewriter 12916*0c56280aSSorin Bascaret 12917*0c56280aSSorin Basca\family default 12918*0c56280aSSorin Basca. 12919*0c56280aSSorin Basca\layout Itemize 12920*0c56280aSSorin Basca 12921*0c56280aSSorin BascaFor any other local variables, use the type of the local variable before 12922*0c56280aSSorin Basca the 12923*0c56280aSSorin Basca\family typewriter 12924*0c56280aSSorin Bascajsr 12925*0c56280aSSorin Basca\family default 12926*0c56280aSSorin Basca instruction. 12927*0c56280aSSorin Basca\layout Standard 12928*0c56280aSSorin Basca 12929*0c56280aSSorin BascaAs one can see, in the above example local variable number 2 holds an 12930*0c56280aSSorin Basca\family typewriter 12931*0c56280aSSorin Bascaint 12932*0c56280aSSorin Basca\family default 12933*0c56280aSSorin Basca data type in both cases; there is no need to mark it 12934*0c56280aSSorin Basca\family typewriter 12935*0c56280aSSorin Bascaunusable 12936*0c56280aSSorin Basca\family default 12937*0c56280aSSorin Basca. 12938*0c56280aSSorin Basca This is the reason why JustIce does not reject the above bytecode, thus 12939*0c56280aSSorin Basca being slightly incompatible with the behaviour of other verifiers. 12940*0c56280aSSorin Basca\layout Paragraph 12941*0c56280aSSorin Basca 12942*0c56280aSSorin BascaThe Maximum Method Length May Be Exceeded 12943*0c56280aSSorin Basca\layout Standard 12944*0c56280aSSorin Basca 12945*0c56280aSSorin BascaThe 12946*0c56280aSSorin Basca\emph on 12947*0c56280aSSorin Bascajavac 12948*0c56280aSSorin Basca\emph default 12949*0c56280aSSorin Basca compiler Sun included in the Java Development Kit version 1.3.0_01 does not 12950*0c56280aSSorin Basca check for the maximum method length of the 12951*0c56280aSSorin Basca\family typewriter 12952*0c56280aSSorin Bascacode 12953*0c56280aSSorin Basca\family default 12954*0c56280aSSorin Basca array in a 12955*0c56280aSSorin Basca\family typewriter 12956*0c56280aSSorin BascaCode 12957*0c56280aSSorin Basca\family default 12958*0c56280aSSorin Basca attribute (see section 12959*0c56280aSSorin Basca\begin_inset LatexCommand \ref{CodeAttribute} 12960*0c56280aSSorin Basca 12961*0c56280aSSorin Basca\end_inset 12962*0c56280aSSorin Basca 12963*0c56280aSSorin Basca). 12964*0c56280aSSorin Basca A test file containing 65000 lines like 12965*0c56280aSSorin Basca\begin_inset Quotes eld 12966*0c56280aSSorin Basca\end_inset 12967*0c56280aSSorin Basca 12968*0c56280aSSorin Basca 12969*0c56280aSSorin Basca\family typewriter 12970*0c56280aSSorin BascaSys\SpecialChar \- 12971*0c56280aSSorin Bascatem.out.println( 12972*0c56280aSSorin Basca\begin_inset Quotes eld 12973*0c56280aSSorin Basca\end_inset 12974*0c56280aSSorin Basca 12975*0c56280aSSorin BascaTest 12976*0c56280aSSorin Basca\begin_inset Quotes erd 12977*0c56280aSSorin Basca\end_inset 12978*0c56280aSSorin Basca 12979*0c56280aSSorin Basca); 12980*0c56280aSSorin Basca\family default 12981*0c56280aSSorin Basca 12982*0c56280aSSorin Basca\begin_inset Quotes erd 12983*0c56280aSSorin Basca\end_inset 12984*0c56280aSSorin Basca 12985*0c56280aSSorin Basca was compiled, but the resulting class file was rejected by the verifier. 12986*0c56280aSSorin Basca\layout Standard 12987*0c56280aSSorin Basca 12988*0c56280aSSorin BascaIBM Corporation's 12989*0c56280aSSorin Basca\emph on 12990*0c56280aSSorin Bascajikes 12991*0c56280aSSorin Basca\emph default 12992*0c56280aSSorin Basca compiler does not even generate code, but it locks up while compiling the 12993*0c56280aSSorin Basca test file. 12994*0c56280aSSorin Basca\layout Subsubsection 12995*0c56280aSSorin Basca 12996*0c56280aSSorin BascaA Compiler Issue Related to Inner Classes 12997*0c56280aSSorin Basca\layout Standard 12998*0c56280aSSorin Basca 12999*0c56280aSSorin BascaThe 13000*0c56280aSSorin Basca\emph on 13001*0c56280aSSorin Bascajavac 13002*0c56280aSSorin Basca\emph default 13003*0c56280aSSorin Basca compiler has to name class files, even those of so-called anonymous classes 13004*0c56280aSSorin Basca 13005*0c56280aSSorin Basca\begin_inset LatexCommand \cite{InnerSpec} 13006*0c56280aSSorin Basca 13007*0c56280aSSorin Basca\end_inset 13008*0c56280aSSorin Basca 13009*0c56280aSSorin Basca. 13010*0c56280aSSorin Basca\layout Standard 13011*0c56280aSSorin Basca 13012*0c56280aSSorin BascaThis can cause problems: an inner class 13013*0c56280aSSorin Basca\emph on 13014*0c56280aSSorin BascaI 13015*0c56280aSSorin Basca\emph default 13016*0c56280aSSorin Basca defined in a class 13017*0c56280aSSorin Basca\emph on 13018*0c56280aSSorin BascaA 13019*0c56280aSSorin Basca\emph default 13020*0c56280aSSorin Basca will be compiled into a class file called 13021*0c56280aSSorin Basca\emph on 13022*0c56280aSSorin BascaA$I.class 13023*0c56280aSSorin Basca\emph default 13024*0c56280aSSorin Basca. 13025*0c56280aSSorin Basca A Java class named 13026*0c56280aSSorin Basca\emph on 13027*0c56280aSSorin BascaA$I 13028*0c56280aSSorin Basca\emph default 13029*0c56280aSSorin Basca will also be compiled into a class file named 13030*0c56280aSSorin Basca\emph on 13031*0c56280aSSorin BascaA$I.class 13032*0c56280aSSorin Basca\emph default 13033*0c56280aSSorin Basca overwriting the former class file. 13034*0c56280aSSorin Basca Because Sun did not forbid the ' 13035*0c56280aSSorin Basca\emph on 13036*0c56280aSSorin Basca$ 13037*0c56280aSSorin Basca\emph default 13038*0c56280aSSorin Basca' character as a legal part of a Java identifier, the 13039*0c56280aSSorin Basca\emph on 13040*0c56280aSSorin Bascajavac 13041*0c56280aSSorin Basca\emph default 13042*0c56280aSSorin Basca compiler should use a more sophisticated naming scheme. 13043*0c56280aSSorin Basca\layout Subsubsection 13044*0c56280aSSorin Basca 13045*0c56280aSSorin Basca 13046*0c56280aSSorin Basca\begin_inset LatexCommand \label{PassFourBug} 13047*0c56280aSSorin Basca 13048*0c56280aSSorin Basca\end_inset 13049*0c56280aSSorin Basca 13050*0c56280aSSorin BascaPass Four is Only Partially Implemented 13051*0c56280aSSorin Basca\layout Standard 13052*0c56280aSSorin Basca 13053*0c56280aSSorin BascaPass four defines run-time tests for constraints that could also be verified 13054*0c56280aSSorin Basca in pass three; it is only for performance reasons that these tests are 13055*0c56280aSSorin Basca delayed. 13056*0c56280aSSorin Basca Instead of having all the tests in one place, they are unnecessarily spread 13057*0c56280aSSorin Basca 13058*0c56280aSSorin Basca\begin_inset Quotes eld 13059*0c56280aSSorin Basca\end_inset 13060*0c56280aSSorin Basca 13061*0c56280aSSorin Bascamaking the validation of the verification algorithm itself extremely difficult 13062*0c56280aSSorin Basca\begin_inset Quotes erd 13063*0c56280aSSorin Basca\end_inset 13064*0c56280aSSorin Basca 13065*0c56280aSSorin Basca 13066*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Fong-WWW} 13067*0c56280aSSorin Basca 13068*0c56280aSSorin Basca\end_inset 13069*0c56280aSSorin Basca 13070*0c56280aSSorin Basca. 13071*0c56280aSSorin Basca Risking security for better performance is often regarded as a bad decision. 13072*0c56280aSSorin Basca For instance, in the 13073*0c56280aSSorin Basca\layout Standard 13074*0c56280aSSorin Basca 13075*0c56280aSSorin Basca 13076*0c56280aSSorin Basca\family typewriter 13077*0c56280aSSorin Bascajava version "1.3.0_01" 13078*0c56280aSSorin Basca\layout Standard 13079*0c56280aSSorin Basca 13080*0c56280aSSorin Basca 13081*0c56280aSSorin Basca\family typewriter 13082*0c56280aSSorin BascaJava(TM) 2 Runtime Environment, Standard Edition (build 1.3.0_01) 13083*0c56280aSSorin Basca\layout Standard 13084*0c56280aSSorin Basca 13085*0c56280aSSorin Basca 13086*0c56280aSSorin Basca\family typewriter 13087*0c56280aSSorin BascaJava HotSpot(TM) Client VM (build 1.3.0_01, mixed mode) 13088*0c56280aSSorin Basca\layout Standard 13089*0c56280aSSorin Basca 13090*0c56280aSSorin BascaJava Virtual Machine, the pass four check for access rights was unintentionally 13091*0c56280aSSorin Basca omitted. 13092*0c56280aSSorin Basca Sadly, other vendors license Sun's code and base their own implementations 13093*0c56280aSSorin Basca on that code. 13094*0c56280aSSorin Basca Therefore, mistakes are often inherited throughout the JVM vendors. 13095*0c56280aSSorin Basca The 13096*0c56280aSSorin Basca\layout Standard 13097*0c56280aSSorin Basca 13098*0c56280aSSorin Basca 13099*0c56280aSSorin Basca\family typewriter 13100*0c56280aSSorin Bascajava version "1.3.0" 13101*0c56280aSSorin Basca\layout Standard 13102*0c56280aSSorin Basca 13103*0c56280aSSorin Basca 13104*0c56280aSSorin Basca\family typewriter 13105*0c56280aSSorin BascaJava(TM) 2 Runtime Environment, Standard Edition (build 1.3.0) 13106*0c56280aSSorin Basca\layout Standard 13107*0c56280aSSorin Basca 13108*0c56280aSSorin Basca 13109*0c56280aSSorin Basca\family typewriter 13110*0c56280aSSorin BascaClassic VM (build 1.3.0, J2RE 1.3.0 IBM build cx130-20010626 (JIT enabled: jitc)) 13111*0c56280aSSorin Basca\layout Standard 13112*0c56280aSSorin Basca 13113*0c56280aSSorin BascaJava Virtual Machine by IBM Corporation, for example, exposes the same mistake. 13114*0c56280aSSorin Basca\layout Section 13115*0c56280aSSorin Basca 13116*0c56280aSSorin BascaRelated Work 13117*0c56280aSSorin Basca\layout Subsection 13118*0c56280aSSorin Basca 13119*0c56280aSSorin BascaThe Kimera Project 13120*0c56280aSSorin Basca\layout Standard 13121*0c56280aSSorin Basca 13122*0c56280aSSorin BascaIt is a misfortune that the Kimera 13123*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-WWW} 13124*0c56280aSSorin Basca 13125*0c56280aSSorin Basca\end_inset 13126*0c56280aSSorin Basca 13127*0c56280aSSorin Basca project closed the World Wide Web presence and that the source code of 13128*0c56280aSSorin Basca the Kimera verifier was never released -- it would have been quite interesting 13129*0c56280aSSorin Basca to see how that respected verifier implementation deals with the problems 13130*0c56280aSSorin Basca arising concerning subroutine verification. 13131*0c56280aSSorin Basca\layout Standard 13132*0c56280aSSorin Basca 13133*0c56280aSSorin BascaHowever, Kimera is the single other stand-alone verifier besides JustIce 13134*0c56280aSSorin Basca the author knows of. 13135*0c56280aSSorin Basca The people behind the project found important security breaches in JVM 13136*0c56280aSSorin Basca implementations of various World Wide Web browsers. 13137*0c56280aSSorin Basca\layout Standard 13138*0c56280aSSorin Basca 13139*0c56280aSSorin BascaAlso, they validated their verifier implementation and published several 13140*0c56280aSSorin Basca papers on JVM implementation verification 13141*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} 13142*0c56280aSSorin Basca 13143*0c56280aSSorin Basca\end_inset 13144*0c56280aSSorin Basca 13145*0c56280aSSorin Basca. 13146*0c56280aSSorin Basca\layout Subsection 13147*0c56280aSSorin Basca 13148*0c56280aSSorin BascaThe Verifier by St�rk, Schmid and B�rger 13149*0c56280aSSorin Basca\layout Standard 13150*0c56280aSSorin Basca 13151*0c56280aSSorin BascaIn 13152*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JBook} 13153*0c56280aSSorin Basca 13154*0c56280aSSorin Basca\end_inset 13155*0c56280aSSorin Basca 13156*0c56280aSSorin Basca, the authors define the Java programming language and the Java virtual 13157*0c56280aSSorin Basca machine formally using 13158*0c56280aSSorin Basca\emph on 13159*0c56280aSSorin BascaAbstract State Machines 13160*0c56280aSSorin Basca\emph default 13161*0c56280aSSorin Basca (ASM). 13162*0c56280aSSorin Basca This also includes the verifier; its specifications have also been implemented 13163*0c56280aSSorin Basca in the functional programming language AsmGofer 13164*0c56280aSSorin Basca\begin_inset LatexCommand \cite{AsmGofer} 13165*0c56280aSSorin Basca 13166*0c56280aSSorin Basca\end_inset 13167*0c56280aSSorin Basca 13168*0c56280aSSorin Basca. 13169*0c56280aSSorin Basca This implementation is included on the CD-ROM that accompanies the book. 13170*0c56280aSSorin Basca\layout Standard 13171*0c56280aSSorin Basca 13172*0c56280aSSorin BascaThe 13173*0c56280aSSorin Basca\begin_inset Quotes eld 13174*0c56280aSSorin Basca\end_inset 13175*0c56280aSSorin Basca 13176*0c56280aSSorin Basca 13177*0c56280aSSorin Basca\emph on 13178*0c56280aSSorin BascaJBook verifier 13179*0c56280aSSorin Basca\emph default 13180*0c56280aSSorin Basca 13181*0c56280aSSorin Basca\begin_inset Quotes erd 13182*0c56280aSSorin Basca\end_inset 13183*0c56280aSSorin Basca 13184*0c56280aSSorin Basca does not implement a complete class file verifier. 13185*0c56280aSSorin Basca It currently only implements the bytecode verification. 13186*0c56280aSSorin Basca Its input files are not class files itself, but a textual representation 13187*0c56280aSSorin Basca of class files in so-called Jasmin format 13188*0c56280aSSorin Basca\begin_inset LatexCommand \cite{JVM} 13189*0c56280aSSorin Basca 13190*0c56280aSSorin Basca\end_inset 13191*0c56280aSSorin Basca 13192*0c56280aSSorin Basca. 13193*0c56280aSSorin Basca Therefore, this implementation is merely of theoretical interest. 13194*0c56280aSSorin Basca\layout Standard 13195*0c56280aSSorin Basca 13196*0c56280aSSorin BascaIt does, however, implement a bytecode verifier that is founded on a 13197*0c56280aSSorin Basca\emph on 13198*0c56280aSSorin Bascasolid 13199*0c56280aSSorin Basca\emph default 13200*0c56280aSSorin Basca theory. 13201*0c56280aSSorin Basca This theory could become the standard for the interpretation of the JVM 13202*0c56280aSSorin Basca specification 13203*0c56280aSSorin Basca\begin_inset LatexCommand \cite{vmspec2} 13204*0c56280aSSorin Basca 13205*0c56280aSSorin Basca\end_inset 13206*0c56280aSSorin Basca 13207*0c56280aSSorin Basca. 13208*0c56280aSSorin Basca It could even change the specification to remove its ambiguities. 13209*0c56280aSSorin Basca\layout Standard 13210*0c56280aSSorin Basca 13211*0c56280aSSorin BascaThere is also an unreleased version of this verifier implemented in the 13212*0c56280aSSorin Basca Java programming language using the BCEL. 13213*0c56280aSSorin Basca This implementation, if it should ever be released, promises a lot as it 13214*0c56280aSSorin Basca could combine usability and a solid theory. 13215*0c56280aSSorin Basca\layout Section 13216*0c56280aSSorin Basca 13217*0c56280aSSorin Basca 13218*0c56280aSSorin Basca\begin_inset LatexCommand \label{GPL} 13219*0c56280aSSorin Basca 13220*0c56280aSSorin Basca\end_inset 13221*0c56280aSSorin Basca 13222*0c56280aSSorin BascaThe GNU General Public License 13223*0c56280aSSorin Basca\layout Standard 13224*0c56280aSSorin Basca 13225*0c56280aSSorin Basca 13226*0c56280aSSorin Basca\emph on 13227*0c56280aSSorin BascaGNU GENERAL PUBLIC LICENSE 13228*0c56280aSSorin Basca\layout Standard 13229*0c56280aSSorin Basca 13230*0c56280aSSorin BascaVersion 2, June 1991 13231*0c56280aSSorin Basca\layout Standard 13232*0c56280aSSorin Basca 13233*0c56280aSSorin BascaCopyright (C) 1989, 1991 Free Software Foundation, Inc. 13234*0c56280aSSorin Basca\layout Standard 13235*0c56280aSSorin Basca 13236*0c56280aSSorin Basca59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 13237*0c56280aSSorin Basca\layout Standard 13238*0c56280aSSorin Basca 13239*0c56280aSSorin BascaEveryone is permitted to copy and distribute verbatim copies of this license 13240*0c56280aSSorin Basca document, but changing it is not allowed. 13241*0c56280aSSorin Basca\layout Standard 13242*0c56280aSSorin Basca 13243*0c56280aSSorin Basca 13244*0c56280aSSorin Basca\emph on 13245*0c56280aSSorin BascaPreamble 13246*0c56280aSSorin Basca\layout Standard 13247*0c56280aSSorin Basca 13248*0c56280aSSorin BascaThe licenses for most software are designed to take away your freedom to 13249*0c56280aSSorin Basca share and change it. 13250*0c56280aSSorin Basca By contrast, the GNU General Public License is intended to guarantee your 13251*0c56280aSSorin Basca freedom to share and change free software--to make sure the software is 13252*0c56280aSSorin Basca free for all its users. 13253*0c56280aSSorin Basca This General Public License applies to most of the Free Software Foundation's 13254*0c56280aSSorin Basca software and to any other program whose authors commit to using it. 13255*0c56280aSSorin Basca (Some other Free Software Foundation software is covered by the GNU Library 13256*0c56280aSSorin Basca General Public License instead.) You can apply it to your programs, too.When 13257*0c56280aSSorin Basca we speak of free software, we are referring to freedom, not price. 13258*0c56280aSSorin Basca Our General Public Licenses are designed to make sure that you have the 13259*0c56280aSSorin Basca freedom to distribute copies of free software (and charge for this service 13260*0c56280aSSorin Basca if you wish), that you receive source code or can get it if you want it, 13261*0c56280aSSorin Basca that you can change the software or use pieces of it in new free programs; 13262*0c56280aSSorin Basca and that you know you can do these things. 13263*0c56280aSSorin Basca\layout Standard 13264*0c56280aSSorin Basca 13265*0c56280aSSorin BascaTo protect your rights, we need to make restrictions that forbid anyone 13266*0c56280aSSorin Basca to deny you these rights or to ask you to surrender the rights. 13267*0c56280aSSorin Basca\layout Standard 13268*0c56280aSSorin Basca 13269*0c56280aSSorin BascaThese restrictions translate to certain responsibilities for you if you 13270*0c56280aSSorin Basca distribute copies of the software, or if you modify it. 13271*0c56280aSSorin Basca For example, if you distribute copies of such a program, whether gratis 13272*0c56280aSSorin Basca or for a fee, you must give the recipients all the rights that you have. 13273*0c56280aSSorin Basca You must make sure that they, too, receive or can get the source code. 13274*0c56280aSSorin Basca And you must show them these terms so they know their rights. 13275*0c56280aSSorin Basca\layout Standard 13276*0c56280aSSorin Basca 13277*0c56280aSSorin BascaWe protect your rights with two steps: 13278*0c56280aSSorin Basca\layout Standard 13279*0c56280aSSorin Basca 13280*0c56280aSSorin Basca(1) copyright the software, and 13281*0c56280aSSorin Basca\layout Standard 13282*0c56280aSSorin Basca 13283*0c56280aSSorin Basca(2) offer you this license which gives you legal permission to copy, distribute 13284*0c56280aSSorin Basca and/or modify the software. 13285*0c56280aSSorin Basca\layout Standard 13286*0c56280aSSorin Basca 13287*0c56280aSSorin BascaAlso, for each author's protection and ours, we want to make certain that 13288*0c56280aSSorin Basca everyone understands that there is no warranty for this free software. 13289*0c56280aSSorin Basca If the software is modified by someone else and passed on, we want its 13290*0c56280aSSorin Basca recipients to know that what they have is not the original, so that any 13291*0c56280aSSorin Basca problems introduced by others will not reflect on the original authors' 13292*0c56280aSSorin Basca reputations. 13293*0c56280aSSorin Basca\layout Standard 13294*0c56280aSSorin Basca 13295*0c56280aSSorin BascaFinally, any free program is threatened constantly by software patents. 13296*0c56280aSSorin Basca We wish to avoid the danger that redistributors of a free program will 13297*0c56280aSSorin Basca individually obtain patent licenses, in effect making the program proprietary. 13298*0c56280aSSorin Basca To prevent this, we have made it clear that any patent must be licensed 13299*0c56280aSSorin Basca for everyone's free use or not licensed at all. 13300*0c56280aSSorin Basca\layout Standard 13301*0c56280aSSorin Basca 13302*0c56280aSSorin BascaThe precise terms and conditions for copying, distribution and modification 13303*0c56280aSSorin Basca follow. 13304*0c56280aSSorin Basca\layout Standard 13305*0c56280aSSorin Basca 13306*0c56280aSSorin Basca 13307*0c56280aSSorin Basca\emph on 13308*0c56280aSSorin BascaGNU GENERAL PUBLIC LICENSE 13309*0c56280aSSorin Basca\layout Standard 13310*0c56280aSSorin Basca 13311*0c56280aSSorin Basca 13312*0c56280aSSorin Basca\emph on 13313*0c56280aSSorin BascaTERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 13314*0c56280aSSorin Basca\layout Standard 13315*0c56280aSSorin Basca 13316*0c56280aSSorin Basca0. 13317*0c56280aSSorin Basca This License applies to any program or other work which contains a notice 13318*0c56280aSSorin Basca placed by the copyright holder saying it may be distributed under the terms 13319*0c56280aSSorin Basca of this General Public License. 13320*0c56280aSSorin Basca The "Program", below, refers to any such program or work, and a "work based 13321*0c56280aSSorin Basca on the Program" means either the Program or any derivative work under copyright 13322*0c56280aSSorin Basca law: that is to say, a work containing the Program or a portion of it, 13323*0c56280aSSorin Basca either verbatim or with modifications and/or translated into another language. 13324*0c56280aSSorin Basca (Hereinafter, translation is included without limitation in the term "modificat 13325*0c56280aSSorin Bascaion".) Each licensee is addressed as "you". 13326*0c56280aSSorin Basca Activities other than copying, distribution and modification are not covered 13327*0c56280aSSorin Basca by this License; they are outside its scope. 13328*0c56280aSSorin Basca The act of running the Program is not restricted, and the output from the 13329*0c56280aSSorin Basca Program is covered only if its contents constitute a work based on the 13330*0c56280aSSorin Basca Program (independent of having been made by running the Program). 13331*0c56280aSSorin Basca Whether that is true depends on what the Program does. 13332*0c56280aSSorin Basca\layout Standard 13333*0c56280aSSorin Basca 13334*0c56280aSSorin Basca1. 13335*0c56280aSSorin Basca You may copy and distribute verbatim copies of the Program's source code 13336*0c56280aSSorin Basca as you receive it, in any medium, provided that you conspicuously and appropria 13337*0c56280aSSorin Bascately publish on each copy an appropriate copyright notice and disclaimer 13338*0c56280aSSorin Basca of warranty; keep intact all the notices that refer to this License and 13339*0c56280aSSorin Basca to the absence of any warranty; and give any other recipients of the Program 13340*0c56280aSSorin Basca a copy of this License along with the Program. 13341*0c56280aSSorin Basca You may charge a fee for the physical act of transferring a copy, and you 13342*0c56280aSSorin Basca may at your option offer warranty protection in exchange for a fee. 13343*0c56280aSSorin Basca\layout Standard 13344*0c56280aSSorin Basca 13345*0c56280aSSorin Basca2. 13346*0c56280aSSorin Basca You may modify your copy or copies of the Program or any portion of it, 13347*0c56280aSSorin Basca thus forming a work based on the Program, and copy and distribute such 13348*0c56280aSSorin Basca modifications or work under the terms of Section 1 above, provided that 13349*0c56280aSSorin Basca you also meet all of these conditions: 13350*0c56280aSSorin Basca\layout Standard 13351*0c56280aSSorin Basca 13352*0c56280aSSorin Bascaa) You must cause the modified files to carry prominent notices stating 13353*0c56280aSSorin Basca that you changed the files and the date of any change. 13354*0c56280aSSorin Basca\layout Standard 13355*0c56280aSSorin Basca 13356*0c56280aSSorin Bascab) You must cause any work that you distribute or publish, that in whole 13357*0c56280aSSorin Basca or in part contains or is derived from the Program or any part thereof, 13358*0c56280aSSorin Basca to be licensed as a whole at no charge to all third parties under the terms 13359*0c56280aSSorin Basca of this License. 13360*0c56280aSSorin Basca\layout Standard 13361*0c56280aSSorin Basca 13362*0c56280aSSorin Bascac) If the modified program normally reads commands interactively when run, 13363*0c56280aSSorin Basca you must cause it, when started running for such interactive use in the 13364*0c56280aSSorin Basca most ordinary way, to print or display an announcement including an appropriate 13365*0c56280aSSorin Basca copyright notice and a notice that there is no warranty (or else, saying 13366*0c56280aSSorin Basca that you provide a warranty) and that users may redistribute the program 13367*0c56280aSSorin Basca under these conditions, and telling the user how to view a copy of this 13368*0c56280aSSorin Basca License. 13369*0c56280aSSorin Basca (Exception: if the Program itself is interactive but does not normally 13370*0c56280aSSorin Basca print such an announcement, your work based on the Program is not required 13371*0c56280aSSorin Basca to print an announcement.) These requirements apply to the modified work 13372*0c56280aSSorin Basca as a whole. 13373*0c56280aSSorin Basca If identifiable sections of that work are not derived from the Program, 13374*0c56280aSSorin Basca and can be reasonably considered independent and separate works in themselves, 13375*0c56280aSSorin Basca then this License, and its terms, do not apply to those sections when you 13376*0c56280aSSorin Basca distribute them as separate works. 13377*0c56280aSSorin Basca But when you distribute the same sections as part of a whole which is a 13378*0c56280aSSorin Basca work based on the Program, the distribution of the whole must be on the 13379*0c56280aSSorin Basca terms of this License, whose permissions for other licensees extend to 13380*0c56280aSSorin Basca the entire whole, and thus to each and every part regardless of who wrote 13381*0c56280aSSorin Basca it. 13382*0c56280aSSorin Basca Thus, it is not the intent of this section to claim rights or contest your 13383*0c56280aSSorin Basca rights to work written entirely by you; rather, the intent is to exercise 13384*0c56280aSSorin Basca the right to control the distribution of derivative or collective works 13385*0c56280aSSorin Basca based on the Program. 13386*0c56280aSSorin Basca In addition, mere aggregation of another work not based on the Program 13387*0c56280aSSorin Basca with the Program (or with a work based on the Program) on a volume of a 13388*0c56280aSSorin Basca storage or distribution medium does not bring the other work under the 13389*0c56280aSSorin Basca scope of this License. 13390*0c56280aSSorin Basca\layout Standard 13391*0c56280aSSorin Basca 13392*0c56280aSSorin Basca3. 13393*0c56280aSSorin Basca You may copy and distribute the Program (or a work based on it, under Section 13394*0c56280aSSorin Basca 2) in object code or executable form under the terms of Sections 1 and 13395*0c56280aSSorin Basca 2 above provided that you also do one of the following: 13396*0c56280aSSorin Basca\layout Standard 13397*0c56280aSSorin Basca 13398*0c56280aSSorin Bascaa) Accompany it with the complete corresponding machine-readable source 13399*0c56280aSSorin Basca code, which must be distributed under the terms of Sections 1 and 2 above 13400*0c56280aSSorin Basca on a medium customarily used for software interchange; or, 13401*0c56280aSSorin Basca\layout Standard 13402*0c56280aSSorin Basca 13403*0c56280aSSorin Bascab) Accompany it with a written offer, valid for at least three years, to 13404*0c56280aSSorin Basca give any third party, for a charge no more than your cost of physically 13405*0c56280aSSorin Basca performing source distribution, a complete machine-readable copy of the 13406*0c56280aSSorin Basca corresponding source code, to be distributed under the terms of Sections 13407*0c56280aSSorin Basca 1 and 2 above on a medium customarily used for software interchange; or, 13408*0c56280aSSorin Basca\layout Standard 13409*0c56280aSSorin Basca 13410*0c56280aSSorin Bascac) Accompany it with the information you received as to the offer to distribute 13411*0c56280aSSorin Basca corresponding source code. 13412*0c56280aSSorin Basca (This alternative is allowed only for noncommercial distribution and only 13413*0c56280aSSorin Basca if you received the program in object code or executable form with such 13414*0c56280aSSorin Basca an offer, in accord with Subsection b above.) The source code for a work 13415*0c56280aSSorin Basca means the preferred form of the work for making modifications to it. 13416*0c56280aSSorin Basca For an executable work, complete source code means all the source code 13417*0c56280aSSorin Basca for all modules it contains, plus any associated interface definition files, 13418*0c56280aSSorin Basca plus the scripts used to control compilation and installation of the executable. 13419*0c56280aSSorin Basca However, as a special exception, the source code distributed need not include 13420*0c56280aSSorin Basca anything that is normally distributed (in either source or binary form) 13421*0c56280aSSorin Basca with the major components (compiler, kernel, and so on) of the operating 13422*0c56280aSSorin Basca system on which the executable runs, unless that component itself accompanies 13423*0c56280aSSorin Basca the executable. 13424*0c56280aSSorin Basca If distribution of executable or object code is made by offering access 13425*0c56280aSSorin Basca to copy from a designated place, then offering equivalent access to copy 13426*0c56280aSSorin Basca the source code from the same place counts as distribution of the source 13427*0c56280aSSorin Basca code, even though third parties are not compelled to copy the source along 13428*0c56280aSSorin Basca with the object code. 13429*0c56280aSSorin Basca\layout Standard 13430*0c56280aSSorin Basca 13431*0c56280aSSorin Basca4. 13432*0c56280aSSorin Basca You may not copy, modify, sublicense, or distribute the Program except 13433*0c56280aSSorin Basca as expressly provided under this License. 13434*0c56280aSSorin Basca Any attempt otherwise to copy, modify, sublicense or distribute the Program 13435*0c56280aSSorin Basca is void, and will automatically terminate your rights under this License. 13436*0c56280aSSorin Basca However, parties who have received copies, or rights, from you under this 13437*0c56280aSSorin Basca License will not have their licenses terminated so long as such parties 13438*0c56280aSSorin Basca remain in full compliance. 13439*0c56280aSSorin Basca\layout Standard 13440*0c56280aSSorin Basca 13441*0c56280aSSorin Basca5. 13442*0c56280aSSorin Basca You are not required to accept this License, since you have not signed 13443*0c56280aSSorin Basca it. 13444*0c56280aSSorin Basca However, nothing else grants you permission to modify or distribute the 13445*0c56280aSSorin Basca Program or its derivative works. 13446*0c56280aSSorin Basca These actions are prohibited by law if you do not accept this License. 13447*0c56280aSSorin Basca Therefore, by modifying or distributing the Program (or any work based 13448*0c56280aSSorin Basca on the Program), you indicate your acceptance of this License to do so, 13449*0c56280aSSorin Basca and all its terms and conditions for copying, distributing or modifying 13450*0c56280aSSorin Basca the Program or works based on it. 13451*0c56280aSSorin Basca\layout Standard 13452*0c56280aSSorin Basca 13453*0c56280aSSorin Basca6. 13454*0c56280aSSorin Basca Each time you redistribute the Program (or any work based on the Program), 13455*0c56280aSSorin Basca the recipient automatically receives a license from the original licensor 13456*0c56280aSSorin Basca to copy, distribute or modify the Program subject to these terms and conditions. 13457*0c56280aSSorin Basca You may not impose any further restrictions on the recipients' exercise 13458*0c56280aSSorin Basca of the rights granted herein. 13459*0c56280aSSorin Basca You are not responsible for enforcing compliance by third parties to this 13460*0c56280aSSorin Basca License. 13461*0c56280aSSorin Basca\layout Standard 13462*0c56280aSSorin Basca 13463*0c56280aSSorin Basca7. 13464*0c56280aSSorin Basca If, as a consequence of a court judgment or allegation of patent infringement 13465*0c56280aSSorin Basca or for any other reason (not limited to patent issues), conditions are 13466*0c56280aSSorin Basca imposed on you (whether by court order, agreement or otherwise) that contradict 13467*0c56280aSSorin Basca the conditions of this License, they do not excuse you from the conditions 13468*0c56280aSSorin Basca of this License. 13469*0c56280aSSorin Basca If you cannot distribute so as to satisfy simultaneously your obligations 13470*0c56280aSSorin Basca under this License and any other pertinent obligations, then as a consequence 13471*0c56280aSSorin Basca you may not distribute the Program at all. 13472*0c56280aSSorin Basca For example, if a patent license would not permit royalty-free redistribution 13473*0c56280aSSorin Basca of the Program by all those who receive copies directly or indirectly through 13474*0c56280aSSorin Basca you, then the only way you could satisfy both it and this License would 13475*0c56280aSSorin Basca be to refrain entirely from distribution of the Program. 13476*0c56280aSSorin Basca If any portion of this section is held invalid or unenforceable under any 13477*0c56280aSSorin Basca particular circumstance, the balance of the section is intended to apply 13478*0c56280aSSorin Basca and the section as a whole is intended to apply in other circumstances. 13479*0c56280aSSorin Basca It is not the purpose of this section to induce you to infringe any patents 13480*0c56280aSSorin Basca or other property right claims or to contest validity of any such claims; 13481*0c56280aSSorin Basca this section has the sole purpose of protecting the integrity of the free 13482*0c56280aSSorin Basca software distribution system, which is implemented by public license practices. 13483*0c56280aSSorin Basca Many people have made generous contributions to the wide range of software 13484*0c56280aSSorin Basca distributed through that system in reliance on consistent application of 13485*0c56280aSSorin Basca that system; it is up to the author/donor to decide if he or she is willing 13486*0c56280aSSorin Basca to distribute software through any other system and a licensee cannot impose 13487*0c56280aSSorin Basca that choice. 13488*0c56280aSSorin Basca This section is intended to make thoroughly clear what is believed to be 13489*0c56280aSSorin Basca a consequence of the rest of this License. 13490*0c56280aSSorin Basca\layout Standard 13491*0c56280aSSorin Basca 13492*0c56280aSSorin Basca8. 13493*0c56280aSSorin Basca If the distribution and/or use of the Program is restricted in certain 13494*0c56280aSSorin Basca countries either by patents or by copyrighted interfaces, the original 13495*0c56280aSSorin Basca copyright holder who places the Program under this License may add an explicit 13496*0c56280aSSorin Basca geographical distribution limitation excluding those countries, so that 13497*0c56280aSSorin Basca distribution is permitted only in or among countries not thus excluded. 13498*0c56280aSSorin Basca In such case, this License incorporates the limitation as if written in 13499*0c56280aSSorin Basca the body of this License. 13500*0c56280aSSorin Basca\layout Standard 13501*0c56280aSSorin Basca 13502*0c56280aSSorin Basca9. 13503*0c56280aSSorin Basca The Free Software Foundation may publish revised and/or new versions of 13504*0c56280aSSorin Basca the General Public License from time to time. 13505*0c56280aSSorin Basca Such new versions will be similar in spirit to the present version, but 13506*0c56280aSSorin Basca may differ in detail to address new problems or concerns. 13507*0c56280aSSorin Basca Each version is given a distinguishing version number. 13508*0c56280aSSorin Basca If the Program specifies a version number of this License which applies 13509*0c56280aSSorin Basca to it and "any later version", you have the option of following the terms 13510*0c56280aSSorin Basca and conditions either of that version or of any later version published 13511*0c56280aSSorin Basca by the Free Software Foundation. 13512*0c56280aSSorin Basca If the Program does not specify a version number of this License, you may 13513*0c56280aSSorin Basca choose any version ever published by the Free Software Foundation. 13514*0c56280aSSorin Basca\layout Standard 13515*0c56280aSSorin Basca 13516*0c56280aSSorin Basca10. 13517*0c56280aSSorin Basca If you wish to incorporate parts of the Program into other free programs 13518*0c56280aSSorin Basca whose distribution conditions are different, write to the author to ask 13519*0c56280aSSorin Basca for permission. 13520*0c56280aSSorin Basca For software which is copyrighted by the Free Software Foundation, write 13521*0c56280aSSorin Basca to the Free Software Foundation; we sometimes make exceptions for this. 13522*0c56280aSSorin Basca Our decision will be guided by the two goals of preserving the free status 13523*0c56280aSSorin Basca of all derivatives of our free software and of promoting the sharing and 13524*0c56280aSSorin Basca reuse of software generally. 13525*0c56280aSSorin Basca\layout Standard 13526*0c56280aSSorin Basca 13527*0c56280aSSorin Basca 13528*0c56280aSSorin Basca\emph on 13529*0c56280aSSorin BascaNO WARRANTY 13530*0c56280aSSorin Basca\layout Standard 13531*0c56280aSSorin Basca 13532*0c56280aSSorin Basca11. 13533*0c56280aSSorin Basca BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 13534*0c56280aSSorin Basca THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 13535*0c56280aSSorin Basca EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER 13536*0c56280aSSorin Basca PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER 13537*0c56280aSSorin Basca EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 13538*0c56280aSSorin Basca OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13539*0c56280aSSorin Basca THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH 13540*0c56280aSSorin Basca YOU. 13541*0c56280aSSorin Basca SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY 13542*0c56280aSSorin Basca SERVICING, REPAIR OR CORRECTION. 13543*0c56280aSSorin Basca\layout Standard 13544*0c56280aSSorin Basca 13545*0c56280aSSorin Basca12. 13546*0c56280aSSorin Basca IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 13547*0c56280aSSorin Basca ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 13548*0c56280aSSorin Basca THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING 13549*0c56280aSSorin Basca ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF 13550*0c56280aSSorin Basca THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS 13551*0c56280aSSorin Basca OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR 13552*0c56280aSSorin Basca THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 13553*0c56280aSSorin Basca EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY 13554*0c56280aSSorin Basca OF SUCH DAMAGES. 13555*0c56280aSSorin Basca\layout Standard 13556*0c56280aSSorin Basca 13557*0c56280aSSorin Basca 13558*0c56280aSSorin Basca\emph on 13559*0c56280aSSorin BascaEND OF TERMS AND CONDITIONS 13560*0c56280aSSorin Basca\layout Addchap 13561*0c56280aSSorin Basca 13562*0c56280aSSorin BascaGlossary 13563*0c56280aSSorin Basca\layout Description 13564*0c56280aSSorin Basca 13565*0c56280aSSorin BascaAccess\SpecialChar ~ 13566*0c56280aSSorin Bascamodifiers In the Java programming language, the use of the keywords 13567*0c56280aSSorin Basca 13568*0c56280aSSorin Basca\family typewriter 13569*0c56280aSSorin Bascaprivate 13570*0c56280aSSorin Basca\family default 13571*0c56280aSSorin Basca, 13572*0c56280aSSorin Basca\family typewriter 13573*0c56280aSSorin Bascaprotected 13574*0c56280aSSorin Basca\family default 13575*0c56280aSSorin Basca, 13576*0c56280aSSorin Basca\family typewriter 13577*0c56280aSSorin Bascapublic 13578*0c56280aSSorin Basca\family default 13579*0c56280aSSorin Basca (or the use of no keyword) defines the access rights for data or program 13580*0c56280aSSorin Basca code (also called visibility). 13581*0c56280aSSorin Basca This information is also used by the JVM: it is part of the class files. 13582*0c56280aSSorin Basca The most important modifier is 13583*0c56280aSSorin Basca\family typewriter 13584*0c56280aSSorin Bascaprivate 13585*0c56280aSSorin Basca\family default 13586*0c56280aSSorin Basca which is used to globally deny access to a field or method. 13587*0c56280aSSorin Basca\layout Description 13588*0c56280aSSorin Basca 13589*0c56280aSSorin BascaAccess\SpecialChar ~ 13590*0c56280aSSorin Bascarights Access rights are granted or denied by the use of 13591*0c56280aSSorin Basca\latex latex 13592*0c56280aSSorin Basca 13593*0c56280aSSorin Basca\backslash 13594*0c56280aSSorin Basca( 13595*0c56280aSSorin Basca\backslash 13596*0c56280aSSorin Bascatriangleright 13597*0c56280aSSorin Basca\backslash 13598*0c56280aSSorin Basca) 13599*0c56280aSSorin Basca\latex default 13600*0c56280aSSorin Bascaaccess modifiers. 13601*0c56280aSSorin Basca\layout Description 13602*0c56280aSSorin Basca 13603*0c56280aSSorin BascaAPI Applications Programming Interface. 13604*0c56280aSSorin Basca Such an interface is used to include functionality of foreign program modules 13605*0c56280aSSorin Basca (often 13606*0c56280aSSorin Basca\latex latex 13607*0c56280aSSorin Basca 13608*0c56280aSSorin Basca\latex default 13609*0c56280aSSorin BascaJava 13610*0c56280aSSorin Basca\latex latex 13611*0c56280aSSorin Basca 13612*0c56280aSSorin Basca\backslash 13613*0c56280aSSorin Basca( 13614*0c56280aSSorin Basca\backslash 13615*0c56280aSSorin Bascatriangleright 13616*0c56280aSSorin Basca\backslash 13617*0c56280aSSorin Basca) 13618*0c56280aSSorin Basca\latex default 13619*0c56280aSSorin Bascapackages) into own programs. 13620*0c56280aSSorin Basca\layout Description 13621*0c56280aSSorin Basca 13622*0c56280aSSorin BascaDebugger A program used to investigate the behaviour of another program. 13623*0c56280aSSorin Basca Often used to find and remove programming errors, so-called bugs. 13624*0c56280aSSorin Basca\layout Description 13625*0c56280aSSorin Basca 13626*0c56280aSSorin BascaDescriptor A symbolic description of type information. 13627*0c56280aSSorin Basca In the JVM's class files, strings in UTF-8 format 13628*0c56280aSSorin Basca\begin_inset LatexCommand \cite{Unicode} 13629*0c56280aSSorin Basca 13630*0c56280aSSorin Basca\end_inset 13631*0c56280aSSorin Basca 13632*0c56280aSSorin Basca are used to describe type information. 13633*0c56280aSSorin Basca\layout Description 13634*0c56280aSSorin Basca 13635*0c56280aSSorin BascaField A member of a Java object or class, also called variable or attribute. 13636*0c56280aSSorin Basca\layout Description 13637*0c56280aSSorin Basca 13638*0c56280aSSorin BascaMethod A member of a Java object or class. 13639*0c56280aSSorin Basca Methods include program code or they are abstract representatives for program 13640*0c56280aSSorin Basca code. 13641*0c56280aSSorin Basca A method can be compared to a 13642*0c56280aSSorin Basca\emph on 13643*0c56280aSSorin Bascafunction 13644*0c56280aSSorin Basca\emph default 13645*0c56280aSSorin Bascain programming languages like C or Pascal. 13646*0c56280aSSorin Basca\layout Description 13647*0c56280aSSorin Basca 13648*0c56280aSSorin BascaOpcode Operation Code. 13649*0c56280aSSorin Basca This denotes an instruction in an assembly-like computer language; to some 13650*0c56280aSSorin Basca people it means its binary representation. 13651*0c56280aSSorin Basca\layout Description 13652*0c56280aSSorin Basca 13653*0c56280aSSorin BascaPackage A package is an entity used in both the Java programming language 13654*0c56280aSSorin Basca and the Java Virtual Machine definition. 13655*0c56280aSSorin Basca It is used to group classes that in the eyes of the programmer belong together. 13656*0c56280aSSorin Basca Package definitions have impact on 13657*0c56280aSSorin Basca\latex latex 13658*0c56280aSSorin Basca 13659*0c56280aSSorin Basca\backslash 13660*0c56280aSSorin Basca( 13661*0c56280aSSorin Basca\backslash 13662*0c56280aSSorin Bascatriangleright 13663*0c56280aSSorin Basca\backslash 13664*0c56280aSSorin Basca) 13665*0c56280aSSorin Basca\latex default 13666*0c56280aSSorin Bascaaccess rights granted to other classes. 13667*0c56280aSSorin Basca\layout Description 13668*0c56280aSSorin Basca 13669*0c56280aSSorin BascaSignature A method has a (possibly empty) set of arguments it expects, and 13670*0c56280aSSorin Basca it has a return type (possibly the 13671*0c56280aSSorin Basca\family typewriter 13672*0c56280aSSorin Bascavoid 13673*0c56280aSSorin Basca\family default 13674*0c56280aSSorin Basca type). 13675*0c56280aSSorin Basca The type information of the arguments and the return type together is called 13676*0c56280aSSorin Basca signature. 13677*0c56280aSSorin Basca A signature can be expressed in terms of a 13678*0c56280aSSorin Basca\latex latex 13679*0c56280aSSorin Basca 13680*0c56280aSSorin Basca\backslash 13681*0c56280aSSorin Basca( 13682*0c56280aSSorin Basca\backslash 13683*0c56280aSSorin Bascatriangleright 13684*0c56280aSSorin Basca\backslash 13685*0c56280aSSorin Basca) 13686*0c56280aSSorin Basca\latex default 13687*0c56280aSSorin Bascadescriptor. 13688*0c56280aSSorin Basca\layout Description 13689*0c56280aSSorin Basca 13690*0c56280aSSorin BascaType A field or a method argument has a type such as 13691*0c56280aSSorin Basca\family typewriter 13692*0c56280aSSorin Bascaint 13693*0c56280aSSorin Basca\family default 13694*0c56280aSSorin Basca or 13695*0c56280aSSorin Basca\family typewriter 13696*0c56280aSSorin BascaString 13697*0c56280aSSorin Basca\family default 13698*0c56280aSSorin Basca. 13699*0c56280aSSorin Basca In the JVM's context, all values are typed. 13700*0c56280aSSorin Basca Types can be expressed in terms of a 13701*0c56280aSSorin Basca\latex latex 13702*0c56280aSSorin Basca 13703*0c56280aSSorin Basca\backslash 13704*0c56280aSSorin Basca( 13705*0c56280aSSorin Basca\backslash 13706*0c56280aSSorin Bascatriangleright 13707*0c56280aSSorin Basca\backslash 13708*0c56280aSSorin Basca) 13709*0c56280aSSorin Basca\latex default 13710*0c56280aSSorin Bascadescriptor. 13711*0c56280aSSorin Basca\layout Standard 13712*0c56280aSSorin Basca 13713*0c56280aSSorin Basca 13714*0c56280aSSorin Basca\begin_inset LatexCommand \listoffigures{} 13715*0c56280aSSorin Basca 13716*0c56280aSSorin Basca\end_inset 13717*0c56280aSSorin Basca 13718*0c56280aSSorin Basca 13719*0c56280aSSorin Basca\layout Standard 13720*0c56280aSSorin Basca 13721*0c56280aSSorin Basca 13722*0c56280aSSorin Basca\latex latex 13723*0c56280aSSorin Basca 13724*0c56280aSSorin Basca\backslash 13725*0c56280aSSorin Bascaaddcontentsline{toc}{chapter}{List Of Figures} 13726*0c56280aSSorin Basca\layout Standard 13727*0c56280aSSorin Basca 13728*0c56280aSSorin Basca 13729*0c56280aSSorin Basca\begin_inset LatexCommand \listofalgorithms{} 13730*0c56280aSSorin Basca 13731*0c56280aSSorin Basca\end_inset 13732*0c56280aSSorin Basca 13733*0c56280aSSorin Basca 13734*0c56280aSSorin Basca\layout Standard 13735*0c56280aSSorin Basca 13736*0c56280aSSorin Basca 13737*0c56280aSSorin Basca\latex latex 13738*0c56280aSSorin Basca 13739*0c56280aSSorin Basca\backslash 13740*0c56280aSSorin Bascaaddcontentsline{toc}{chapter}{List Of Algorithms} 13741*0c56280aSSorin Basca\layout Bibliography 13742*0c56280aSSorin Basca\bibitem [AppMag-WWW]{AppMag-WWW} 13743*0c56280aSSorin Basca 13744*0c56280aSSorin Basca 13745*0c56280aSSorin Basca\latex latex 13746*0c56280aSSorin Basca 13747*0c56280aSSorin Basca\backslash 13748*0c56280aSSorin Bascaaddcontentsline{toc}{chapter}{Bibliography} 13749*0c56280aSSorin Basca\latex default 13750*0c56280aSSorin BascaAverStar's AppletMagic(tm): Ada for the Java Virtual Machine. 13751*0c56280aSSorin Basca\newline 13752*0c56280aSSorin Basca 13753*0c56280aSSorin Basca\emph on 13754*0c56280aSSorin Bascahttp://www.appletmagic.com 13755*0c56280aSSorin Basca\layout Bibliography 13756*0c56280aSSorin Basca\bibitem [AsmGofer]{AsmGofer} 13757*0c56280aSSorin Basca 13758*0c56280aSSorin BascaJoachim Schmid: AsmGofer. 13759*0c56280aSSorin Basca\newline 13760*0c56280aSSorin Basca 13761*0c56280aSSorin Basca\emph on 13762*0c56280aSSorin Bascahttp://www.tydo.org 13763*0c56280aSSorin Basca\layout Bibliography 13764*0c56280aSSorin Basca\bibitem [BCEL98]{BCEL98} 13765*0c56280aSSorin Basca 13766*0c56280aSSorin BascaMarkus Dahm: Byte Code Engineering with the BCEL API. 13767*0c56280aSSorin Basca Freie Universit�t Berlin, Institut f�r Informatik. 13768*0c56280aSSorin Basca Technical Report B-17-98. 13769*0c56280aSSorin Basca\layout Bibliography 13770*0c56280aSSorin Basca\bibitem [BCEL-WWW]{BCEL-WWW} 13771*0c56280aSSorin Basca 13772*0c56280aSSorin BascaMarkus Dahm: Byte Code Engineering Library. 13773*0c56280aSSorin Basca\emph on 13774*0c56280aSSorin Basca 13775*0c56280aSSorin Basca\newline 13776*0c56280aSSorin Bascahttp://bcel.sourceforge.net 13777*0c56280aSSorin Basca\layout Bibliography 13778*0c56280aSSorin Basca\bibitem [BCV-Soundness]{BCV-Soundness} 13779*0c56280aSSorin Basca 13780*0c56280aSSorin BascaCornelia Pusch: Proving the Soundness of a Java Bytecode Verifier Specification 13781*0c56280aSSorin Basca in Isabelle/HOL. 13782*0c56280aSSorin Basca Technische Universit�t M�nchen, Institut f�r Informatik. 13783*0c56280aSSorin Basca 13784*0c56280aSSorin Basca\newline 13785*0c56280aSSorin Basca 13786*0c56280aSSorin Basca\emph on 13787*0c56280aSSorin Bascahttp://www.in.tum.de/~pusch/ 13788*0c56280aSSorin Basca\layout Bibliography 13789*0c56280aSSorin Basca\bibitem [C]{C} 13790*0c56280aSSorin Basca 13791*0c56280aSSorin BascaBrian W. 13792*0c56280aSSorin Basca Kerninghan, Dennis M. 13793*0c56280aSSorin Basca Ritchie: The C Programming Language, Second Edition, ANSI C. 13794*0c56280aSSorin Basca Prentice-Hall 1998, ISBN 0131103628. 13795*0c56280aSSorin Basca\layout Bibliography 13796*0c56280aSSorin Basca\bibitem [CPP-D]{CPP-D} 13797*0c56280aSSorin Basca 13798*0c56280aSSorin BascaBjarne Stroustrup: Die C++ Programmiersprache. 13799*0c56280aSSorin Basca Addison-Wesly-Longman, 1998, ISBN 3-8273-1296-5. 13800*0c56280aSSorin Basca\layout Bibliography 13801*0c56280aSSorin Basca\bibitem [CPP-E]{CPP-E} 13802*0c56280aSSorin Basca 13803*0c56280aSSorin BascaBjarne Stroustrup: The C++-Programming Language, Third Edition. 13804*0c56280aSSorin Basca Addison-Wesley 1997, ISBN 0-201-88954-4. 13805*0c56280aSSorin Basca\layout Bibliography 13806*0c56280aSSorin Basca\bibitem [D3]{D3} 13807*0c56280aSSorin Basca 13808*0c56280aSSorin BascaGuido Lang, Andreas Bohne: Delphi 3.0 lernen. 13809*0c56280aSSorin Basca Addison-Wesley-Longman 1997, ISBN 3-8273-1190-x. 13810*0c56280aSSorin Basca\layout Bibliography 13811*0c56280aSSorin Basca\bibitem [DesignPatterns]{DesignPatterns} 13812*0c56280aSSorin Basca 13813*0c56280aSSorin BascaErich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns 13814*0c56280aSSorin Basca Elements of Reusable Object-Oriented Software. 13815*0c56280aSSorin Basca Addison-Wesley 1995, ISBN: 0201633612. 13816*0c56280aSSorin Basca\layout Bibliography 13817*0c56280aSSorin Basca\bibitem [DragonBook]{DragonBook} 13818*0c56280aSSorin Basca 13819*0c56280aSSorin BascaAlfred V. 13820*0c56280aSSorin Basca Aho, Ravi Sethi, Jeffrey D. 13821*0c56280aSSorin Basca Ullman: Compilers: Principles, Techniques, and Tools. 13822*0c56280aSSorin Basca Addison-Wesley 1985, ISBN: 0201100886. 13823*0c56280aSSorin Basca\layout Bibliography 13824*0c56280aSSorin Basca\bibitem [EF]{EF} 13825*0c56280aSSorin Basca 13826*0c56280aSSorin BascaElectricalFire. 13827*0c56280aSSorin Basca\emph on 13828*0c56280aSSorin Basca 13829*0c56280aSSorin Basca\newline 13830*0c56280aSSorin Bascahttp://www.mozilla.org/projects/ef/ 13831*0c56280aSSorin Basca\layout Bibliography 13832*0c56280aSSorin Basca\bibitem [f2j]{f2j} 13833*0c56280aSSorin Basca 13834*0c56280aSSorin BascaKeith Seymour: f2j - Fortran-to-Java Compiler. 13835*0c56280aSSorin Basca\newline 13836*0c56280aSSorin Basca 13837*0c56280aSSorin Basca\emph on 13838*0c56280aSSorin Bascahttp://cs.utk.edu/f2j/ 13839*0c56280aSSorin Basca\layout Bibliography 13840*0c56280aSSorin Basca\bibitem [Fong-WWW]{Fong-WWW} 13841*0c56280aSSorin Basca 13842*0c56280aSSorin BascaPhilip W. 13843*0c56280aSSorin Basca L. 13844*0c56280aSSorin Basca Fong: The mysterious Pass One, first draft, September 2, 1997. 13845*0c56280aSSorin Basca 13846*0c56280aSSorin Basca\newline 13847*0c56280aSSorin Basca 13848*0c56280aSSorin Basca\emph on 13849*0c56280aSSorin Bascahttp://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/pass1/ 13850*0c56280aSSorin Basca\layout Bibliography 13851*0c56280aSSorin Basca\bibitem [Fong2-WWW]{Fong2-WWW} 13852*0c56280aSSorin Basca 13853*0c56280aSSorin BascaPhilip W. 13854*0c56280aSSorin Basca L. 13855*0c56280aSSorin Basca Fong: A Flaw with the Specification of the Invokeinterface Opcode. 13856*0c56280aSSorin Basca 13857*0c56280aSSorin Basca\newline 13858*0c56280aSSorin Basca 13859*0c56280aSSorin Basca\emph on 13860*0c56280aSSorin Bascahttp://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/invokeinterface/ 13861*0c56280aSSorin Basca\layout Bibliography 13862*0c56280aSSorin Basca\bibitem [FreundMitchell]{FreundMitchell} 13863*0c56280aSSorin Basca 13864*0c56280aSSorin BascaStephen N. 13865*0c56280aSSorin Basca Freund, John Mitchell: A Formal Framework for the Java Bytecode Language 13866*0c56280aSSorin Basca and Verifier. 13867*0c56280aSSorin Basca Department of Computer Science, Stanford University. 13868*0c56280aSSorin Basca Stanford, CA 94305-9045. 13869*0c56280aSSorin Basca Appeared in OOPSLA '99. 13870*0c56280aSSorin Basca\layout Bibliography 13871*0c56280aSSorin Basca\bibitem [GCC-WWW]{GCC-WWW} 13872*0c56280aSSorin Basca 13873*0c56280aSSorin BascaGCC, The GNU compiler collection. 13874*0c56280aSSorin Basca\emph on 13875*0c56280aSSorin Basca 13876*0c56280aSSorin Basca\newline 13877*0c56280aSSorin Bascahttp://gcc.gnu.org 13878*0c56280aSSorin Basca\layout Bibliography 13879*0c56280aSSorin Basca\bibitem [GJ-WWW]{GJ-WWW} 13880*0c56280aSSorin Basca 13881*0c56280aSSorin BascaGJ. 13882*0c56280aSSorin Basca A Generic Java Language Extension. 13883*0c56280aSSorin Basca\newline 13884*0c56280aSSorin Basca 13885*0c56280aSSorin Basca\emph on 13886*0c56280aSSorin Bascahttp://www.cis.unisa.edu.au/~pizza/gj/ 13887*0c56280aSSorin Basca\layout Bibliography 13888*0c56280aSSorin Basca\bibitem [InnerSpec]{InnerSpec} 13889*0c56280aSSorin Basca 13890*0c56280aSSorin BascaSun Microsystems: Inner Classes Specification. 13891*0c56280aSSorin Basca\newline 13892*0c56280aSSorin Basca 13893*0c56280aSSorin Basca\emph on 13894*0c56280aSSorin Bascahttp://java.sun.com/products/jdk/1.1/docs/guide/ 13895*0c56280aSSorin Basca\newline 13896*0c56280aSSorin Bascainnerclasses/spec/innerclasses.doc.html 13897*0c56280aSSorin Basca\layout Bibliography 13898*0c56280aSSorin Basca\bibitem [J2ME-CLDCS]{J2ME-CLDCS} 13899*0c56280aSSorin Basca 13900*0c56280aSSorin BascaSun Microsystems: J2ME 13901*0c56280aSSorin Basca\latex latex 13902*0c56280aSSorin Basca 13903*0c56280aSSorin Basca\backslash 13904*0c56280aSSorin Bascatexttrademark 13905*0c56280aSSorin Basca\latex default 13906*0c56280aSSorin Basca\SpecialChar ~ 13907*0c56280aSSorin Basca Connected Limited Device Configuration Specification. 13908*0c56280aSSorin Basca\newline 13909*0c56280aSSorin Basca 13910*0c56280aSSorin Basca\emph on 13911*0c56280aSSorin Bascahttp://jcp.org/aboutJava/communityprocess/final/jsr030/ 13912*0c56280aSSorin Basca\layout Bibliography 13913*0c56280aSSorin Basca\bibitem [JBook]{JBook} 13914*0c56280aSSorin Basca 13915*0c56280aSSorin BascaRobert St�rk, Joachim Schmid, Egon B�rger: Java 13916*0c56280aSSorin Basca\latex latex 13917*0c56280aSSorin Basca 13918*0c56280aSSorin Basca\backslash 13919*0c56280aSSorin Bascatexttrademark\SpecialChar ~ 13920*0c56280aSSorin Basca 13921*0c56280aSSorin Basca\latex default 13922*0c56280aSSorin Basca and the Java 13923*0c56280aSSorin Basca\latex latex 13924*0c56280aSSorin Basca 13925*0c56280aSSorin Basca\backslash 13926*0c56280aSSorin Bascatexttrademark\SpecialChar ~ 13927*0c56280aSSorin Basca 13928*0c56280aSSorin Basca\latex default 13929*0c56280aSSorin Basca Virtual Machine. 13930*0c56280aSSorin Basca Springer-Verlag 2001, ISBN 3-540-42088-6. 13931*0c56280aSSorin Basca\newline 13932*0c56280aSSorin Basca 13933*0c56280aSSorin Basca\emph on 13934*0c56280aSSorin Bascahttp://www.inf.ethz.ch/~jbook/ 13935*0c56280aSSorin Basca\layout Bibliography 13936*0c56280aSSorin Basca\bibitem [JPaper]{JPaper} 13937*0c56280aSSorin Basca 13938*0c56280aSSorin BascaRobert F. 13939*0c56280aSSorin Basca St�rk, Joachim Schmid: Java bytecode verification is not possible. 13940*0c56280aSSorin Basca ETH Z�rich, Department of Computer Science 2000. 13941*0c56280aSSorin Basca\emph on 13942*0c56280aSSorin Basca 13943*0c56280aSSorin Basca\newline 13944*0c56280aSSorin Bascahttp://www.inf.ethz.ch/~staerk/pdf/jbv00.pdf 13945*0c56280aSSorin Basca\layout Bibliography 13946*0c56280aSSorin Basca\bibitem [JLectures]{JLectures} 13947*0c56280aSSorin Basca 13948*0c56280aSSorin BascaRobert F. 13949*0c56280aSSorin Basca St�rk: Java and the JVM: Definition and Verification (37-474). 13950*0c56280aSSorin Basca\newline 13951*0c56280aSSorin Basca 13952*0c56280aSSorin Basca\emph on 13953*0c56280aSSorin Bascahttp://www.inf.ethz.ch/~jbook/eth37474/ 13954*0c56280aSSorin Basca\newline 13955*0c56280aSSorin Bascahttp://www.inf.ethz.ch/~jbook/eth37474/javaBV.pdf 13956*0c56280aSSorin Basca\layout Bibliography 13957*0c56280aSSorin Basca\bibitem [JNS]{JNS} 13958*0c56280aSSorin Basca 13959*0c56280aSSorin BascaRobert Macgregor, Dave Durbin, John Owlett, Andrew Yeomans: JAVA 13960*0c56280aSSorin Basca\latex latex 13961*0c56280aSSorin Basca 13962*0c56280aSSorin Basca\backslash 13963*0c56280aSSorin Bascatexttrademark 13964*0c56280aSSorin Basca\latex default 13965*0c56280aSSorin Basca\SpecialChar ~ 13966*0c56280aSSorin Basca Network Security. 13967*0c56280aSSorin Basca Prentice Hall 1998, ISBN 0137615299. 13968*0c56280aSSorin Basca\layout Bibliography 13969*0c56280aSSorin Basca\bibitem [JODE-WWW]{JODE-WWW} 13970*0c56280aSSorin Basca 13971*0c56280aSSorin BascaJODE is a java package containing a decompiler and an optimizer for java. 13972*0c56280aSSorin Basca\newline 13973*0c56280aSSorin Basca 13974*0c56280aSSorin Basca\emph on 13975*0c56280aSSorin Bascahttp://jode.sourceforge.net 13976*0c56280aSSorin Basca\layout Bibliography 13977*0c56280aSSorin Basca\bibitem [JustIce]{JustIce} 13978*0c56280aSSorin Basca 13979*0c56280aSSorin BascaEnver Haase: JustIce. 13980*0c56280aSSorin Basca A Free Class File Verifier for Java 13981*0c56280aSSorin Basca\latex latex 13982*0c56280aSSorin Basca 13983*0c56280aSSorin Basca\backslash 13984*0c56280aSSorin Bascatexttrademark 13985*0c56280aSSorin Basca\latex default 13986*0c56280aSSorin Basca\SpecialChar ~ 13987*0c56280aSSorin Basca.Freie Universit�t Berlin, Takustra�e 9, D-14195 Berlin; September 2001. 13988*0c56280aSSorin Basca\newline 13989*0c56280aSSorin Basca 13990*0c56280aSSorin Basca\emph on 13991*0c56280aSSorin Bascahttp://bcel.sourceforge.net/ 13992*0c56280aSSorin Basca\newline 13993*0c56280aSSorin Bascahttp://bcel.sourceforge.net/justice 13994*0c56280aSSorin Basca\layout Bibliography 13995*0c56280aSSorin Basca\bibitem [JVM]{JVM} 13996*0c56280aSSorin Basca 13997*0c56280aSSorin BascaJon Meyer, Troy Downing: JAVA Virtual Machine. 13998*0c56280aSSorin Basca O'Reilly 1997, ISBN 1-56592-194-1. 13999*0c56280aSSorin Basca\layout Bibliography 14000*0c56280aSSorin Basca\bibitem [Kaffe-WWW]{Kaffe-WWW} 14001*0c56280aSSorin Basca 14002*0c56280aSSorin BascaKaffe. 14003*0c56280aSSorin Basca Kaffe is a cleanroom, open source implementation of a Java virtual machine 14004*0c56280aSSorin Basca and class libraries. 14005*0c56280aSSorin Basca\emph on 14006*0c56280aSSorin Basca 14007*0c56280aSSorin Basca\newline 14008*0c56280aSSorin Bascahttp://www.kaffe.org 14009*0c56280aSSorin Basca\layout Bibliography 14010*0c56280aSSorin Basca\bibitem [KAWA-WWW]{KAWA-WWW} 14011*0c56280aSSorin Basca 14012*0c56280aSSorin BascaKawa, the Java-based Scheme system. 14013*0c56280aSSorin Basca\emph on 14014*0c56280aSSorin Basca 14015*0c56280aSSorin Basca\newline 14016*0c56280aSSorin Bascahttp://http://www.gnu.org/software/kawa/ 14017*0c56280aSSorin Basca\layout Bibliography 14018*0c56280aSSorin Basca\bibitem [KDE]{KDE} 14019*0c56280aSSorin Basca 14020*0c56280aSSorin BascaKDE, the K desktop environment. 14021*0c56280aSSorin Basca\newline 14022*0c56280aSSorin Basca 14023*0c56280aSSorin Basca\emph on 14024*0c56280aSSorin Bascahttp://www.kde.org 14025*0c56280aSSorin Basca\layout Bibliography 14026*0c56280aSSorin Basca\bibitem [Kimera-WWW]{Kimera-WWW} 14027*0c56280aSSorin Basca 14028*0c56280aSSorin BascaThe Kimera Verifier. 14029*0c56280aSSorin Basca 14030*0c56280aSSorin Basca\emph on 14031*0c56280aSSorin Basca 14032*0c56280aSSorin Basca\emph default 14033*0c56280aSSorin Basca 14034*0c56280aSSorin Basca\newline 14035*0c56280aSSorin BascaCurrently off-line because of a World Wide Web presentation rework. 14036*0c56280aSSorin Basca\emph on 14037*0c56280aSSorin Basca 14038*0c56280aSSorin Basca\newline 14039*0c56280aSSorin Bascahttp://kimera.cs.washington.edu/verifier.html 14040*0c56280aSSorin Basca\newline 14041*0c56280aSSorin Bascahttp://www-kimera.cs.washington.edu 14042*0c56280aSSorin Basca\layout Bibliography 14043*0c56280aSSorin Basca\bibitem [Kimera-TestingJVM]{Kimera-TestingJVM} 14044*0c56280aSSorin Basca 14045*0c56280aSSorin BascaEmin G�n Sirer: Testing Java Virtual Machines. 14046*0c56280aSSorin Basca An Experience Report on Automatically Testing Java Virtual Machines. 14047*0c56280aSSorin Basca University of Washington, Dept. 14048*0c56280aSSorin Basca of Computer Science and Engineering. 14049*0c56280aSSorin Basca\newline 14050*0c56280aSSorin Basca 14051*0c56280aSSorin Basca\emph on 14052*0c56280aSSorin Bascahttp://kimera.cs.washington.edu 14053*0c56280aSSorin Basca\layout Bibliography 14054*0c56280aSSorin Basca\bibitem [Kimera-ProdGram]{Kimera-ProdGram} 14055*0c56280aSSorin Basca 14056*0c56280aSSorin BascaEmin G�n Sirer, Brian N. 14057*0c56280aSSorin Basca Bershad: Using Production Grammars in Software Testing. 14058*0c56280aSSorin Basca University of Washington, Department of Computer Science. 14059*0c56280aSSorin Basca\newline 14060*0c56280aSSorin Basca 14061*0c56280aSSorin Basca\emph on 14062*0c56280aSSorin Bascahttp://kimera.cs.washington.edu 14063*0c56280aSSorin Basca\layout Bibliography 14064*0c56280aSSorin Basca\bibitem [kissme-WWW]{kissme-WWW} 14065*0c56280aSSorin Basca 14066*0c56280aSSorin Bascakissme. 14067*0c56280aSSorin Basca A free Java Virtual Machine. 14068*0c56280aSSorin Basca\emph on 14069*0c56280aSSorin Basca 14070*0c56280aSSorin Basca\newline 14071*0c56280aSSorin Bascahttp://kissme.sourceforge.net 14072*0c56280aSSorin Basca\layout Bibliography 14073*0c56280aSSorin Basca\bibitem [Krakatoa-WWW]{Krakatoa-WWW} 14074*0c56280aSSorin Basca 14075*0c56280aSSorin BascaTodd A. 14076*0c56280aSSorin Basca Proebsting, Scott A. 14077*0c56280aSSorin Basca Watterson: Krakatoa: Decompilation in Java (Does Bytecode Reveal Source?). 14078*0c56280aSSorin Basca The University of Arizona, Department of Computer Science. 14079*0c56280aSSorin Basca\newline 14080*0c56280aSSorin Basca 14081*0c56280aSSorin Basca\emph on 14082*0c56280aSSorin Bascahttp://www.cs.arizona.edu/people/saw/papers/Krakatoa-COOTS97.ps.Z 14083*0c56280aSSorin Basca\layout Bibliography 14084*0c56280aSSorin Basca\bibitem [langspec2]{langspec2} 14085*0c56280aSSorin Basca 14086*0c56280aSSorin BascaJames Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specificati 14087*0c56280aSSorin Bascaon, Second Edition. 14088*0c56280aSSorin Basca Addison-Wesley 2000, ISBN 0201310082. 14089*0c56280aSSorin Basca\layout Bibliography 14090*0c56280aSSorin Basca\bibitem [M2]{M2} 14091*0c56280aSSorin Basca 14092*0c56280aSSorin BascaNiklaus Wirth: Programming in Modula-2, Fourth Edition. 14093*0c56280aSSorin Basca Springer-Verlag 1988, ISBN 3-540-50150-9. 14094*0c56280aSSorin Basca\layout Bibliography 14095*0c56280aSSorin Basca\bibitem [Mozilla]{Mozilla} 14096*0c56280aSSorin Basca 14097*0c56280aSSorin BascaMozilla.org (The Mozilla Origanization): Mozilla. 14098*0c56280aSSorin Basca\newline 14099*0c56280aSSorin Basca 14100*0c56280aSSorin Basca\emph on 14101*0c56280aSSorin Bascahttp://www.mozilla.org 14102*0c56280aSSorin Basca\layout Bibliography 14103*0c56280aSSorin Basca\bibitem [Neuromancer]{Neuromancer} 14104*0c56280aSSorin Basca 14105*0c56280aSSorin BascaWilliam Gibson: Neuromancer. 14106*0c56280aSSorin Basca Ace Books 1994, ISBN 0441000681. 14107*0c56280aSSorin Basca\layout Bibliography 14108*0c56280aSSorin Basca\bibitem [ORP-WWW]{ORP-WWW} 14109*0c56280aSSorin Basca 14110*0c56280aSSorin BascaOpen Runtime Platform. 14111*0c56280aSSorin Basca A Platform For Bytecode System Research. 14112*0c56280aSSorin Basca\newline 14113*0c56280aSSorin Basca 14114*0c56280aSSorin Basca\emph on 14115*0c56280aSSorin Bascahttp://www.intel.com/research/mrl/orp/index.htm 14116*0c56280aSSorin Basca\layout Bibliography 14117*0c56280aSSorin Basca\bibitem [PL4JVM]{PL4JVM} 14118*0c56280aSSorin Basca 14119*0c56280aSSorin BascaRobert Tolksdorf: Programming Languages for the Java Virtual Machine. 14120*0c56280aSSorin Basca\newline 14121*0c56280aSSorin Basca 14122*0c56280aSSorin Basca\emph on 14123*0c56280aSSorin Bascahttp://www.robert-tolksdorf.de/vmlanguages.html 14124*0c56280aSSorin Basca\layout Bibliography 14125*0c56280aSSorin Basca\bibitem [PMG-WWW]{PMG-WWW} 14126*0c56280aSSorin Basca 14127*0c56280aSSorin BascaPMG. 14128*0c56280aSSorin Basca Poor Man's Genericity for Java. 14129*0c56280aSSorin Basca 14130*0c56280aSSorin Basca\newline 14131*0c56280aSSorin Basca 14132*0c56280aSSorin Basca\emph on 14133*0c56280aSSorin Basca 14134*0c56280aSSorin Basca\layout Bibliography 14135*0c56280aSSorin Basca\bibitem [Qian]{Qian} 14136*0c56280aSSorin Basca 14137*0c56280aSSorin BascaZhenyu Qian: A Formal Specification of Java 14138*0c56280aSSorin Basca\latex latex 14139*0c56280aSSorin Basca 14140*0c56280aSSorin Basca\backslash 14141*0c56280aSSorin Bascatexttrademark 14142*0c56280aSSorin Basca\latex default 14143*0c56280aSSorin Basca\SpecialChar ~ 14144*0c56280aSSorin Basca Virtual Machine Instructions for Objects, Methods and Subroutines. 14145*0c56280aSSorin Basca Bremen Institute for Safe Systems (BISS), FB3 Informatik, Universit�t Bremen, 14146*0c56280aSSorin Basca D-28334 Bremen, Germany. 14147*0c56280aSSorin Basca\layout Bibliography 14148*0c56280aSSorin Basca\bibitem [SableVM-WWW]{SableVM-WWW} 14149*0c56280aSSorin Basca 14150*0c56280aSSorin BascaSableVM. 14151*0c56280aSSorin Basca A Bytecode Interpreter. 14152*0c56280aSSorin Basca\emph on 14153*0c56280aSSorin Basca 14154*0c56280aSSorin Basca\newline 14155*0c56280aSSorin Bascahttp://www.sablevm.org 14156*0c56280aSSorin Basca\layout Bibliography 14157*0c56280aSSorin Basca\bibitem [StataAbadi]{StataAbadi} 14158*0c56280aSSorin Basca 14159*0c56280aSSorin BascaRaymie Stata and Martin Abadi: A Type System for Java Bytecode Subroutines. 14160*0c56280aSSorin Basca In: ACM Transactions on Programming Languages and Systems, Vol. 14161*0c56280aSSorin Basca 21, No. 14162*0c56280aSSorin Basca 1, January 1999, Pages 90-137. 14163*0c56280aSSorin Basca\layout Bibliography 14164*0c56280aSSorin Basca\bibitem [Unknowable]{Unknowable} 14165*0c56280aSSorin Basca 14166*0c56280aSSorin BascaG.J. 14167*0c56280aSSorin Basca Chaitin: The Unknowable. 14168*0c56280aSSorin Basca Springer-Verlag 1999, ISBN 981-4021-72-5. 14169*0c56280aSSorin Basca\newline 14170*0c56280aSSorin Basca 14171*0c56280aSSorin Basca\emph on 14172*0c56280aSSorin Bascahttp://www.umcs.maine.edu/~chaitin/unknowable/ 14173*0c56280aSSorin Basca\layout Bibliography 14174*0c56280aSSorin Basca\bibitem [Unicode]{Unicode} 14175*0c56280aSSorin Basca 14176*0c56280aSSorin BascaThe Unicode Consortium: The Unicode Standard, Version 2.0. 14177*0c56280aSSorin Basca Niso Press 1996, ISBN 0-201-48345-9. 14178*0c56280aSSorin Basca\newline 14179*0c56280aSSorin Basca 14180*0c56280aSSorin Basca\emph on 14181*0c56280aSSorin Bascahttp://www.unicode.org 14182*0c56280aSSorin Basca\layout Bibliography 14183*0c56280aSSorin Basca\bibitem [Yellin-WWW]{Yellin-WWW} 14184*0c56280aSSorin Basca 14185*0c56280aSSorin BascaFrank Yellin: Low Level Security in Java. 14186*0c56280aSSorin Basca\emph on 14187*0c56280aSSorin Basca 14188*0c56280aSSorin Basca\newline 14189*0c56280aSSorin Bascahttp://java.sun.com/sfaq/verifier.html 14190*0c56280aSSorin Basca\layout Bibliography 14191*0c56280aSSorin Basca\bibitem [VMSPEC2]{vmspec2} 14192*0c56280aSSorin Basca 14193*0c56280aSSorin BascaTim Lindholm, Frank Yellin: The Java 14194*0c56280aSSorin Basca\latex latex 14195*0c56280aSSorin Basca 14196*0c56280aSSorin Basca\backslash 14197*0c56280aSSorin Bascatexttrademark\SpecialChar ~ 14198*0c56280aSSorin Basca 14199*0c56280aSSorin Basca\latex default 14200*0c56280aSSorin Basca Virtual Machine Specification, Second Edition. 14201*0c56280aSSorin Basca Addison-Wesley 1999, ISBN 0-201-43294-4. 14202*0c56280aSSorin Basca\the_end 14203