xref: /aosp_15_r20/external/apache-commons-bcel/docs/verifier/JustIce.lyx (revision 0c56280ab0842982c46a149f7b9eaa497e31e292)
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