1 # LyX 1.1 created this file. For more info see http://www.lyx.org/ 2 # 3 # Licensed to the Apache Software Foundation (ASF) under one or more 4 # contributor license agreements. See the NOTICE file distributed with 5 # this work for additional information regarding copyright ownership. 6 # The ASF licenses this file to You under the Apache License, Version 2.0 7 # (the "License"); you may not use this file except in compliance with 8 # the License. You may obtain a copy of the License at 9 # 10 # http://www.apache.org/licenses/LICENSE-2.0 11 # 12 # Unless required by applicable law or agreed to in writing, software 13 # distributed under the License is distributed on an "AS IS" BASIS, 14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 # See the License for the specific language governing permissions and 16 # limitations under the License. 17 18 \lyxformat 218 19 \textclass scrbook 20 \begin_preamble 21 22 \end_preamble 23 \language english 24 \inputencoding latin1 25 \fontscheme default 26 \graphics default 27 \float_placement !htp 28 \paperfontsize default 29 \spacing single 30 \papersize Default 31 \paperpackage a4wide 32 \use_geometry 0 33 \use_amsmath 0 34 \paperorientation portrait 35 \secnumdepth 2 36 \tocdepth 2 37 \paragraph_separation indent 38 \defskip medskip 39 \quotes_language english 40 \quotes_times 2 41 \papercolumns 1 42 \papersides 2 43 \paperpagestyle default 44 45 \layout Subject 46 47 48 \emph on 49 Diplomarbeit 50 \layout Title 51 52 JustIce 53 \newline 54 55 \size small 56 A Free Class File Verifier for Java 57 \latex latex 58 59 \backslash 60 texttrademark\SpecialChar ~ 61 62 \layout Author 63 64 Enver Haase 65 \newline 66 67 \size tiny 68 <ehaase (a] inf.fu-berlin.de> 69 \layout Date 70 71 September 2001 72 \layout Publishers 73 74 Freie Universitt Berlin 75 \newline 76 Institut fr Informatik 77 \newline 78 Takustrae 9 79 \newline 80 D-14195 Berlin 81 \layout Lowertitleback 82 83 84 \series bold 85 \size scriptsize 86 Revision 87 \series default 88 89 \series bold 90 \shape smallcaps 91 $Id$ 92 \layout Minisec 93 94 Erklrung 95 \begin_float footnote 96 \layout Standard 97 98 I declare that I wrote this 99 \emph on 100 Diplomarbeit 101 \emph default 102 completely on my own and without the help of persons not listed. 103 All sources of information are listed in the Bibliography section. 104 \end_float 105 \layout Standard 106 107 Hiermit versichere ich, die vorliegende Diplomarbeit selbstndig und ohne 108 fremde Hilfe verfat zu haben. 109 Es wurden nur die in der Bibliographie angegebenen Quellen benutzt. 110 \layout Minisec 111 112 Danksagung 113 \begin_float footnote 114 \layout Standard 115 116 The creation of this 117 \emph on 118 Diplomarbeit 119 \emph default 120 paper was supported and supervised by Prof. 121 Dr. 122 Elfriede Fehr and Dipl.-Inform. 123 Markus Dahm. 124 Keith Seymour suggested a lot of language-related improvements. 125 Thank you. 126 \end_float 127 \layout Standard 128 129 Whrend der Anfertigung dieser Diplomarbeit wurde ich von Prof. 130 Dr. 131 Elfriede Fehr und Dipl.-Inform. 132 Markus Dahm betreut, wofr ich mich an dieser Stelle herzlich bedanke. 133 \layout Standard 134 135 Desweiteren bedanke ich mich bei Keith Seymour, der mir eine Reihe sprachspezifi 136 scher Verbesserungsvorschlge sandte. 137 \layout Minisec 138 139 Autor 140 \begin_float footnote 141 \layout Standard 142 143 Author 144 \end_float 145 \layout Standard 146 147 Enver Haase 148 \newline 149 Gubener Strae 18 150 \newline 151 D-10243 Berlin 152 \newline 153 154 \layout Standard 155 156 157 \begin_inset LatexCommand \tableofcontents{} 158 159 \end_inset 160 161 162 \layout Addchap 163 164 Abstract 165 \layout Standard 166 167 When Sun Microsystems developed their 168 \emph on 169 Java Platform 170 \emph default 171 in the early 1990s, it was originally designed for use in networked and 172 embedded consumer-electronics applications. 173 But when they introduced it around 1995, it quickly became used in World 174 Wide Web browser software. 175 This was a way to bring interactive content to demanding World Wide Web 176 users. 177 Sun took great care for the robustness of the platform: they planned to 178 connect embedded devices and let them share data and code over a network. 179 Defective devices transmitting bad data or unreliable network connections 180 should not cause other devices to crash. 181 This property made Java a good choice for the code-executing engine in 182 World Wide Web browsers: defective server software or transmission errors 183 would not cause the 184 \emph on 185 Java Platform 186 \emph default 187 to crash; this is also true for purposely malicious code hidden on the 188 Web. 189 The code-executing part of the 190 \emph on 191 Java Platform 192 \emph default 193 is called 194 \emph on 195 The Java Virtual Machine 196 \emph default 197 (the 198 \emph on 199 JVM 200 \emph default 201 , for short). 202 This execution engine has to assure that the code to be executed is well-behave 203 d; it has to 204 \emph on 205 verify 206 \emph default 207 the code. 208 Therefore, the 209 \emph on 210 verifier 211 \emph default 212 is an integral part of every JVM, but JustIce implements a verifier that 213 is not integrated in a JVM. 214 It was implemented using a software library called the 215 \emph on 216 Byte Code Engineering Library 217 \emph default 218 (the 219 \emph on 220 BCEL 221 \emph default 222 , for short) by Markus Dahm 223 \begin_inset LatexCommand \cite{BCEL98,BCEL-WWW} 224 225 \end_inset 226 227 . 228 \layout Standard 229 230 The BCEL is intended to give users a convenient mechanism to analyze, create 231 and manipulate (binary) Java class files. 232 It offers an object-oriented view of otherwise raw data, including program 233 code. 234 This library is, therefore, well-respected especially in the compiler-writer 235 community whenever the JVM is chosen as the target machine of the compiler. 236 Compiler back-ends use the BCEL to produce code for the JVM; and as new 237 compilers may be faulty, they may produce bad code. 238 Testing these compilers often is a difficult task. 239 The generated code should not only be semantically correct, but it also 240 has to pass the verifiers of all existing JVM implementations. 241 Normally, a lot of human interaction is required to run test cases. 242 If the code is rejected by a verifier, one often does not know why. 243 Most verifiers emit error messages which do not identify the offending 244 instruction. 245 \layout Standard 246 247 JustIce presents an Application Programming Interface (API) that may be 248 used to automate the procedure sketched above. 249 The constraints imposed on class files are designed to be strict, therefore 250 eleminating the need to run several verifiers on the generated code. 251 If code passes the JustIce verifier, it should pass all other verifiers. 252 JustIce was also designed to output human-understandable messages if the 253 verification of some code fails. 254 \layout Standard 255 256 The application range of JustIce is not limited to compiler back-ends, in 257 the same sense as the BCEL is not only useful in this area. 258 Transformations of existing code and even generation of hand-crafted code 259 fall into its scope, too. 260 As a side effect, JustIce exports some data structures such as a control 261 flow graph; so its API may also be used for applications targeting other 262 problem areas such as static analyses of program code. 263 \layout Chapter 264 265 Introduction 266 \layout Section 267 268 Low Level Security as a Part of a Many-Tiered Strategy 269 \layout Standard 270 271 The Java programming language is well-known for its inherent security facilities 272 such as the lack of pointer arithmetic or the need for memory allocation 273 and deallocation. 274 Lesser known is that this is only the top of an iceberg; the 275 \emph on 276 Java Platform 277 \emph default 278 implements a many-tiered security strategy 279 \begin_inset LatexCommand \cite{Yellin-WWW} 280 281 \end_inset 282 283 . 284 It was designed to run even untrusted code -- code that possibly was not 285 produced by a compiler for the Java programming language, code that may 286 be corrupt or code that may have malicious intent (such as stealing credit 287 card number information from a hard disk drive). 288 Three considerations were made: 289 \layout Itemize 290 291 Untrusted code could damage hardware, software, or information on the host 292 machine. 293 \layout Itemize 294 295 It could pass unauthorized information to anyone. 296 \layout Itemize 297 298 It could cause the host machine to become unusable through resource depletion. 299 \layout Standard 300 301 While some security features such as type-safety or the already-mentioned 302 lack of pointer arithmetic of the Java programming language are a convenient 303 help for programmers, they can only help to reduce programming errors. 304 Of course these features do not help targeting the above problems. 305 At a lower level, however, the 306 \emph on 307 Java Plat\SpecialChar \- 308 form 309 \emph default 310 implements a so-called sandbox: an area where code can be executed but 311 that has well-defined boundaries shielding the rest of the system. 312 This is achieved by means of a 313 \emph on 314 Java Virtual Machine 315 \emph default 316 (JVM) emulation; the host platform does not directly run untrusted code, 317 but a 318 \emph on 319 run-time system 320 \emph default 321 which in turn runs the code, restricting its access to system resources. 322 \layout Standard 323 324 A run-time system cannot safely assume that untrusted code is well-behaved. 325 Code could cause stack overflows, stack underruns, or otherwise erroneous 326 behaviour that may bring the run-time system into an undefined state -- 327 possibly allowing access to protected memory areas. 328 One could protect the run-time system by letting it predict the effects 329 of every single instruction just in time while actually executing it -- 330 but that would be too time-consuming to be applicable in practice. 331 \layout Standard 332 333 Therefore, good behaviour of program code has to be enforced 334 \emph on 335 before 336 \emph default 337 it is actually executed -- at least as far as this is possible. 338 This is the lowest level of Java security; there has to be an integral 339 component in every JVM implementation doing so ( 340 \begin_inset LatexCommand \cite{vmspec2} 341 342 \end_inset 343 344 , page 420). 345 This part of the JVM is called the 346 \emph on 347 class file verifier 348 \emph default 349 , yet better known as the 350 \emph on 351 bytecode verifier. 352 353 \emph default 354 Technically speaking, bytecode verification is only a part of class file 355 verification so 356 \emph on 357 class file verifier 358 \emph default 359 is a more embracing term. 360 JustIce implements a whole class file verifier. 361 \layout Standard 362 363 \begin_float fig 364 \layout Standard 365 \align center 366 367 \begin_inset Figure size 595 396 368 file chap1.eps 369 width 3 100 370 flags 9 371 372 \end_inset 373 374 375 \layout Caption 376 377 Concept of Class File Verification 378 \end_float 379 \layout Section 380 381 Why Another Verifier? 382 \layout Standard 383 384 As said before, every JVM implementation must contain a class file verifier, 385 so it is reasonable to ask for the motivation behind creating just another 386 class file verifier -- especially one that is 387 \emph on 388 not 389 \emph default 390 part of a JVM implementation. 391 \layout Subsection 392 393 Bytecode Engineers Need JustIce 394 \layout Standard 395 396 Shortly after the 397 \emph on 398 Java Platform 399 \emph default 400 was introduced, it was adopted with pleasure because of its inherent independen 401 ce from operating systems and concrete hardware. 402 Industry and educational institutions with heterogenous networked computers 403 could now run the same software program on different host machines. 404 Soon, many efforts were put into research and development of compilers 405 for programming languages other than the Java programming language that 406 use the JVM bytecode as target. 407 \layout Standard 408 409 Nowadays, many other programming languages do have the JVM as its target 410 platform; e.g. 411 Fortran 412 \begin_inset LatexCommand \cite{f2j} 413 414 \end_inset 415 416 , Ada 417 \begin_inset LatexCommand \cite{AppMag-WWW} 418 419 \end_inset 420 421 , Scheme 422 \begin_inset LatexCommand \cite{KAWA-WWW} 423 424 \end_inset 425 426 or modified Java language versions 427 \begin_inset LatexCommand \cite{GJ-WWW,PMG-WWW} 428 429 \end_inset 430 431 . 432 A vast collection of programming languages targeting the JVM can be found 433 on the World Wide Web 434 \begin_inset LatexCommand \cite{PL4JVM} 435 436 \end_inset 437 438 . 439 \layout Standard 440 441 All these compilers emit code for the JVM -- and so all these compilers 442 have to pass the JVM's verifier. 443 Implementors of such compilers have to consider the security related constraint 444 s the JVM poses on the generated code. 445 It is difficult to test if the emitted code works on all JVM implementations, 446 passing all JVM verifier implementations. 447 This is especially problematic if not all of the project's class files 448 are loaded into the JVM during a test run, because then they will not be 449 verified. 450 \layout Standard 451 452 Having an opportunity to verify the transitive hull of referenced class 453 files (starting with some main class file) would be of help; JustIce offers 454 it. 455 \layout Standard 456 457 The Bytecode Engineering Library by Markus Dahm is often used as a compiler 458 back-end to emit code, but it is also used to hand-craft code or to implement 459 bytecode transformations. 460 Because JustIce works closely together with the BCEL, users of the BCEL 461 do not even have to leave their development environment to run the JustIce 462 verifier. 463 \layout Standard 464 465 To our knowledge, JustIce is the only implementation of a Java class file 466 verifier that was written in the Java programming language 467 \begin_inset LatexCommand \cite{langspec2} 468 469 \end_inset 470 471 itself 472 \begin_float footnote 473 \layout Standard 474 475 In a personal communication, Robert Strk told the author that there was 476 a Java implementation of the verifier discussed in 477 \begin_inset LatexCommand \cite{JBook} 478 479 \end_inset 480 481 , written by Joachim Schmid using the BCEL. 482 However, it is not released for public use yet. 483 \end_float 484 . 485 Because of its 486 \emph on 487 Verification API 488 \emph default 489 , it can be included in other software projects written in Java with more 490 ease than any other verifier implementation in a different programming 491 language could provide. 492 \layout Subsection 493 494 JustIce is Verbose 495 \layout Standard 496 497 Usually, when classes pass the verifier, it is mute. 498 JustIce, in contrast, distinguishes between verification results and messages. 499 Messages are often warnings, but the reason for emitting such a warning 500 instead of a negative verification result is because the class file does 501 not pose a threat to the integrity of the JVM and thus does not have to 502 be rejected. 503 \layout Standard 504 505 When a verification error occurs and the class file is rejected, even the 506 built-in verifiers usually produce some output saying so. 507 As an example, consider the following verifier run: 508 \newline 509 510 \newline 511 512 \family typewriter 513 ehaase@haneman:/home/ehaase > java Cc 514 \newline 515 Exception in thread "main" java.lang.VerifyError: 516 \newline 517 (class: Cc, method: ttt signature: ()V) 518 \newline 519 Recursive call to jsr entry 520 \family default 521 522 \newline 523 524 \latex latex 525 526 \newline 527 528 \layout Standard 529 530 One might ask 531 \emph on 532 which 533 \emph default 534 535 \begin_inset Quotes eld 536 \end_inset 537 538 jsr entry 539 \begin_inset Quotes erd 540 \end_inset 541 542 (a branch target of a 543 \latex latex 544 545 \backslash 546 texttt{jsr} 547 \latex default 548 or a 549 \latex latex 550 551 \backslash 552 texttt{jsr 553 \backslash 554 _w} 555 \latex default 556 instruction) is called recursively and which instructions may be responsible 557 for this. 558 Compare this to JustIce's output: 559 \newline 560 561 \newline 562 [...] 563 \layout Standard 564 565 566 \family typewriter 567 Pass 3b, method number 0 ['public static void ttt()']: 568 \layout Standard 569 570 571 \family typewriter 572 VERIFIED_REJECTED 573 \layout Standard 574 575 576 \family typewriter 577 Constraint violated in method 'public static void ttt()': 578 \layout Standard 579 580 581 \family typewriter 582 Subroutine with local variable '1', JSRs '[ 36: jsr[168](3) -> astore_1, 583 8: jsr[168](3) -> astore_1, 30: jsr[168](3) -> astore_1, 23: jsr[168](3) 584 -> astore_1]', RET ' 62: ret[169](2) 1' is called by a subroutine which 585 uses the same local variable index as itself; maybe even a recursive call? 586 JustIce's clean definition of a subroutine forbids both. 587 \newline 588 589 \family default 590 [...] 591 \layout Standard 592 593 594 \family typewriter 595 Warnings: 596 \layout Standard 597 598 599 \family typewriter 600 Pass 2: Attribute 'LineNumber(0, 4), LineNumber(0, 5), LineNumber(15, 8), 601 LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 13), LineNumber(64, 602 15)' as an attribute of Code attribute '<CODE>' (method 'public static 603 void ttt()') will effectively be ignored and is only useful for debuggers 604 and such. 605 \layout Standard 606 607 608 \family typewriter 609 Pass 2: Attribute 'LineNumber(0, 1), LineNumber(4, 1)' as an attribute of 610 Code attribute '<CODE>' (method 'public void <init>()') will effectively 611 be ignored and is only useful for debuggers and such. 612 \layout Standard 613 614 615 \family typewriter 616 Pass 3a: LineNumberTable attribute 'LineNumber(0, 4), LineNumber(0, 5), 617 LineNumber(15, 8), LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 618 13), LineNumber(64, 15)' refers to the same code offset ('0') more than 619 once which is violating the semantics [but is sometimes produced by IBM's 620 'jikes' compiler]. 621 \newline 622 623 \layout Standard 624 625 This output obviously has an answer to the above question; it shows the 626 only 627 \latex latex 628 629 \backslash 630 texttt{jsr} 631 \latex default 632 or 633 \latex latex 634 635 \backslash 636 texttt{jsr 637 \backslash 638 _w} 639 \latex default 640 instructions possibly responsible for a recursive call (which is not allowed 641 by the specification of the JVM). 642 For the special --but clean-- definition of subroutines JustIce uses, please 643 see section 644 \begin_inset LatexCommand \ref{Subroutines_Def} 645 646 \end_inset 647 648 . 649 \layout Standard 650 651 Note also the warning messages. 652 Class files that were not generated by Sun's 653 \emph on 654 javac 655 \emph default 656 compiler have a tendency to look a little different in some corner cases. 657 IBM's 658 \emph on 659 jikes 660 \emph default 661 compiler, for instance, produces LineNumberTable attributes (see 662 \begin_inset LatexCommand \ref{LineNumberTableAttribute} 663 664 \end_inset 665 666 ) which look different from those created by 667 \emph on 668 javac 669 \emph default 670 . 671 Detecting such differences is desirable because future JVMs will have stricter 672 verification checks 673 \begin_float footnote 674 \layout Standard 675 676 The Solaris port of Sun's JVM, version 1.3.0_01, already has (some of) the 677 stricter checks built in. 678 You may enable them using the command-line option '-Xfuture'. 679 Nothing about this issue is mentioned in the specification 680 \begin_inset LatexCommand \cite{vmspec2} 681 682 \end_inset 683 684 . 685 \end_float 686 (which most old 687 \emph on 688 javac 689 \emph default 690 -compiled class files will probably still pass). 691 JustIce guides bytecode engineers to create class files that are indistinguisha 692 ble from those created by 693 \emph on 694 javac 695 \emph default 696 to retain compatibility with Sun's future JVM implementations. 697 Figure 698 \begin_inset LatexCommand \ref{FigVenn} 699 700 \end_inset 701 702 graphically shows the relationship between class files and the verifier 703 \begin_float footnote 704 \layout Standard 705 706 This is a simplicistic figure; unfortunately, there are class files produced 707 by the 708 \emph on 709 javac 710 \emph default 711 compiler that do not pass the verifier. 712 Please see section 713 \begin_inset LatexCommand \ref{javacRejected} 714 715 \end_inset 716 717 for more details. 718 \end_float 719 . 720 \begin_float fig 721 \layout Standard 722 \align center 723 724 \begin_inset Figure size 595 378 725 file VennDiag.eps 726 width 3 100 727 height 3 45 728 flags 9 729 730 \end_inset 731 732 733 \layout Caption 734 735 736 \begin_inset LatexCommand \label{FigVenn} 737 738 \end_inset 739 740 Venn diagram showing the operating domain of the Java verifier. 741 \end_float 742 \layout Subsection 743 744 JustIce is Free 745 \layout Standard 746 747 Currently, there is no other free and complete open source verifier available 748 known to the author. 749 You may have a look at the JVM's source code by Sun Microsystems but you 750 are not allowed to use the knowledge from that inspection for your own 751 projects or even use their code. 752 JustIce is a clean-room implementation: the author wrote JustIce by only 753 reading the Java 754 \latex latex 755 756 \backslash 757 texttrademark 758 \latex default 759 \SpecialChar ~ 760 Virtual Machine Specification, Second Edition 761 \begin_inset LatexCommand \cite{vmspec2} 762 763 \end_inset 764 765 and comparing the behaviour of JustIce with the behaviour of commercial 766 implementations of Sun Microsystems and IBM Corporation. 767 \layout Standard 768 769 The open source JVM implementation 770 \emph on 771 Kaffe 772 \emph default 773 774 \begin_inset LatexCommand \cite{Kaffe-WWW} 775 776 \end_inset 777 778 , for example 779 \emph on 780 , 781 \emph default 782 does not have a 783 \emph on 784 complete 785 \emph default 786 verifier built in (although mandated by the JVM specification). 787 \layout Standard 788 789 790 \emph on 791 Kissme 792 \emph default 793 794 \begin_inset LatexCommand \cite{kissme-WWW} 795 796 \end_inset 797 798 , another open source JVM implementation, currently does not include any 799 verifier at all. 800 801 \layout Standard 802 803 The JVM implementations 804 \emph on 805 SableVM 806 \emph default 807 808 \begin_inset LatexCommand \cite{SableVM-WWW} 809 810 \end_inset 811 812 and Intel Corporation's 813 \emph on 814 Open Runtime Platform 815 \emph default 816 817 \begin_inset LatexCommand \cite{ORP-WWW} 818 819 \end_inset 820 821 are platforms to experiment with performance-enhancements. 822 They are not intended to work as general-purpose JVMs so they do not need 823 to implement verifiers. 824 \layout Standard 825 826 Other open source projects that could make use of a free verifier include 827 the Java compiler 828 \emph on 829 gcj 830 \emph default 831 which is part of the GNU compiler collection 832 \begin_inset LatexCommand \cite{GCC-WWW} 833 834 \end_inset 835 836 . 837 \layout Standard 838 839 JustIce is covered by the well-known and respected software license 840 \emph on 841 GNU General Public License 842 \emph default 843 (GPL); see section 844 \begin_inset LatexCommand \ref{GPL} 845 846 \end_inset 847 848 . 849 The author hopes other free software will benefit from it; from the JustIce 850 software 851 \begin_inset LatexCommand \cite{JustIce} 852 853 \end_inset 854 855 as well as from this paper describing some of the inner workings of JustIce. 856 \layout Chapter 857 858 The Java Virtual Machine 859 \layout Standard 860 861 The Java Virtual Machine (JVM) is an abstract machine specified in 862 \begin_inset LatexCommand \cite{vmspec2} 863 864 \end_inset 865 866 . 867 It has no knowledge about the Java programming language; but only of a 868 certain binary file format: the class file format. 869 A class file contains machine instructions for the JVM (called 870 \emph on 871 bytecodes 872 \emph default 873 ), a symbol table (called 874 \emph on 875 constant pool 876 \emph default 877 ) and some other ancillary information. 878 \layout Standard 879 880 On method invocation, a local stack frame is set up called the 881 \emph on 882 execution frame 883 \emph default 884 . 885 It consists of an 886 \emph on 887 operand stack 888 \emph default 889 and 890 \emph on 891 local variables 892 \emph default 893 (which may be compared to registers of traditional machines). 894 \layout Standard 895 896 The instructions in the code arrays of class files are interpreted by the 897 JVM. 898 There are 212 legal instructions; they have read-access to the class file's 899 constant pool and they can modify the operand stack and the local variables 900 in their execution frame. 901 An invoked method reads its arguments from the local variables. 902 Certain instructions pass a return value to the invoking method. 903 \layout Section 904 905 906 \begin_inset LatexCommand \label{Classfile Structure} 907 908 \end_inset 909 910 The ClassFile Structure 911 \layout Standard 912 913 Traditionally, the JVM loads its programs from files stored on file systems 914 of host machines; these files have names that end with 915 \emph on 916 917 \begin_inset Quotes eld 918 \end_inset 919 920 .class 921 \begin_inset Quotes erd 922 \end_inset 923 924 925 \emph default 926 . 927 It is possible to store the files in various other ways; a so-called 928 \emph on 929 class loader 930 \emph default 931 is then used to transform the files internally to the desired, basic class 932 file format. 933 Therefore, it suffices to explain the structure of traditional class files. 934 Every class file consists of a single 935 \family typewriter 936 ClassFile 937 \family default 938 structure as defined below. 939 It defines a single class as known from the Java Programming Language 940 \begin_inset LatexCommand \cite{langspec2} 941 942 \end_inset 943 944 . 945 The terms 946 \emph on 947 class 948 \emph default 949 and 950 \emph on 951 class file 952 \emph default 953 may therefore be used interchangeably. 954 \begin_float fig 955 \layout Standard 956 \align center 957 958 \begin_inset Figure size 595 526 959 file classfile.eps 960 width 3 100 961 flags 9 962 963 \end_inset 964 965 966 \layout Standard 967 968 A class file consists of constants, fields, methods, attributes and some 969 ancillary information. 970 This figure was taken from 971 \begin_inset LatexCommand \cite{BCEL98} 972 973 \end_inset 974 975 , used with permission of the author. 976 \layout Caption 977 978 A Class File 979 \end_float 980 \layout Standard 981 982 As we will see, the 983 \family typewriter 984 ClassFile 985 \family default 986 structure and its sub-structures are defined for upwards compatibility, 987 i.e., new structure definitions can be added to the specification easily 988 at a later time. 989 \newline 990 991 \newline 992 993 \family typewriter 994 ClassFile { 995 \newline 996 \SpecialChar \- 997 \SpecialChar ~ 998 \SpecialChar ~ 999 u4 magic; 1000 \newline 1001 \SpecialChar \- 1002 \SpecialChar ~ 1003 \SpecialChar ~ 1004 u2 minor_version; 1005 \newline 1006 \SpecialChar \- 1007 \SpecialChar ~ 1008 \SpecialChar ~ 1009 u2 major_version; 1010 \newline 1011 \SpecialChar \- 1012 \SpecialChar ~ 1013 \SpecialChar ~ 1014 u2 constant_pool_count; 1015 \newline 1016 \SpecialChar \- 1017 \SpecialChar ~ 1018 \SpecialChar ~ 1019 cp_info constant_pool[constant_pool_count-1]; 1020 \newline 1021 \SpecialChar \- 1022 \SpecialChar ~ 1023 \SpecialChar ~ 1024 u2 access_flags; 1025 \newline 1026 \SpecialChar \- 1027 \SpecialChar ~ 1028 \SpecialChar ~ 1029 u2 this_class; 1030 \newline 1031 \SpecialChar \- 1032 \SpecialChar ~ 1033 \SpecialChar ~ 1034 u2 super_class; 1035 \newline 1036 \SpecialChar \- 1037 \SpecialChar ~ 1038 \SpecialChar ~ 1039 u2 interfaces_count; 1040 \newline 1041 \SpecialChar \- 1042 \SpecialChar ~ 1043 \SpecialChar ~ 1044 u2 interfaces[interfaces_count]; 1045 \newline 1046 \SpecialChar \- 1047 \SpecialChar ~ 1048 \SpecialChar ~ 1049 u2 fields_count; 1050 \newline 1051 \SpecialChar \- 1052 \SpecialChar ~ 1053 \SpecialChar ~ 1054 field_info fields[fields_count]; 1055 \newline 1056 \SpecialChar \- 1057 \SpecialChar ~ 1058 \SpecialChar ~ 1059 u2 methods_count; 1060 \newline 1061 \SpecialChar \- 1062 \SpecialChar ~ 1063 \SpecialChar ~ 1064 method_info methods[methods_count]; 1065 \newline 1066 \SpecialChar \- 1067 \SpecialChar ~ 1068 \SpecialChar ~ 1069 u2 attributes_count; 1070 \newline 1071 \SpecialChar \- 1072 \SpecialChar ~ 1073 \SpecialChar ~ 1074 attribute_info attributes[attributes_count]; 1075 \newline 1076 } 1077 \newline 1078 1079 \newline 1080 1081 \family default 1082 You may read an ' 1083 \family typewriter 1084 u 1085 \family default 1086 ' as 'byte times'; e.g., ' 1087 \family typewriter 1088 u2 1089 \family default 1090 ' means 'two bytes in size'. 1091 We will not delve into too much detail here; the exact specification of 1092 the entries are published by Sun 1093 \begin_inset LatexCommand \cite{vmspec2} 1094 1095 \end_inset 1096 1097 . 1098 But one should note that besides some other information, a class file basically 1099 defines 1100 \emph on 1101 attributes 1102 \emph default 1103 , 1104 \emph on 1105 constants 1106 \emph default 1107 , 1108 \emph on 1109 fields 1110 \emph default 1111 and 1112 \emph on 1113 methods 1114 \emph default 1115 . 1116 Also, there are strong structural constraints imposed on class files. 1117 It is a verifier's task to validate them. 1118 \layout Subsection 1119 1120 Attributes 1121 \layout Standard 1122 1123 The general format of an attribute is defined below. 1124 \newline 1125 1126 \newline 1127 1128 \family typewriter 1129 attribute_info { 1130 \newline 1131 \SpecialChar \- 1132 \SpecialChar ~ 1133 \SpecialChar ~ 1134 u2 attribute_name_index; 1135 \newline 1136 \SpecialChar \- 1137 \SpecialChar ~ 1138 \SpecialChar ~ 1139 u4 attribute_length; 1140 \newline 1141 \SpecialChar \- 1142 \SpecialChar ~ 1143 \SpecialChar ~ 1144 u1 info[attribute_length]; 1145 \newline 1146 } 1147 \family default 1148 1149 \newline 1150 1151 \newline 1152 An attribute is basically a typed data container; its type is determined 1153 by its name. 1154 Every JVM is required to be silent about attributes of types it does not 1155 know. 1156 On the other hand, newly defined attributes are required not to impose 1157 a semantical change on the class file. 1158 These attributes should be uniquely named; in fact, the pair (<attribute 1159 name>, <attribute length>) is required to be unique. 1160 This is guaranteed because attributes not defined by Sun Microsystems have 1161 to be named according to the package naming scheme of the Java Programming 1162 Language 1163 \begin_inset LatexCommand \cite{langspec2} 1164 1165 \end_inset 1166 1167 . 1168 Certain basic attributes are predefined. 1169 They are used in the 1170 \family typewriter 1171 ClassFile 1172 \family default 1173 (see section 1174 \begin_inset LatexCommand \ref{Classfile Structure} 1175 1176 \end_inset 1177 1178 ), 1179 \family typewriter 1180 field_info 1181 \family default 1182 (see section 1183 \begin_inset LatexCommand \ref{Fields} 1184 1185 \end_inset 1186 1187 ) and 1188 \family typewriter 1189 method_info 1190 \family default 1191 (see section 1192 \begin_inset LatexCommand \ref{Methods} 1193 1194 \end_inset 1195 1196 ). 1197 Also, attributes may be nested: the 1198 \family typewriter 1199 Code 1200 \family default 1201 attribute references other attributes. 1202 \layout Standard 1203 1204 Some examples for predefined attributes are listed below. 1205 \layout Subsubsection 1206 1207 1208 \begin_inset LatexCommand \label{ConstantValueAttribute} 1209 1210 \end_inset 1211 1212 The ConstantValue attribute 1213 \layout Standard 1214 1215 The ConstantValue attribute has the following format: 1216 \newline 1217 1218 \newline 1219 1220 \family typewriter 1221 ConstantValue_attribute { 1222 \newline 1223 \SpecialChar \- 1224 \SpecialChar ~ 1225 \SpecialChar ~ 1226 u2 attribute_name_index; 1227 \newline 1228 \SpecialChar \- 1229 \SpecialChar ~ 1230 \SpecialChar ~ 1231 u4 attribute_length; 1232 \newline 1233 \SpecialChar \- 1234 \SpecialChar ~ 1235 \SpecialChar ~ 1236 u2 constantvalue_index; 1237 \newline 1238 } 1239 \family default 1240 1241 \newline 1242 1243 \newline 1244 The 1245 \family typewriter 1246 ConstantValue 1247 \family default 1248 attribute represents the value of a constant field. 1249 It has a fixed length: it contains only a two-byte reference into the constant 1250 pool. 1251 Only 1252 \family typewriter 1253 field_info 1254 \family default 1255 structures (see section 1256 \begin_inset LatexCommand \ref{Fields} 1257 1258 \end_inset 1259 1260 ) contain this type of attribute. 1261 \layout Subsubsection 1262 1263 1264 \begin_inset LatexCommand \label{CodeAttribute} 1265 1266 \end_inset 1267 1268 The Code Attribute 1269 \layout Standard 1270 1271 The 1272 \family typewriter 1273 Code 1274 \family default 1275 attribute is used in the 1276 \family typewriter 1277 method_info 1278 \family default 1279 (see section 1280 \begin_inset LatexCommand \ref{Methods} 1281 1282 \end_inset 1283 1284 ) structure. 1285 It represents the program code of a method and it is defined as follows: 1286 \newline 1287 1288 \newline 1289 1290 \family typewriter 1291 Code_attribute { 1292 \newline 1293 \SpecialChar \- 1294 \SpecialChar ~ 1295 \SpecialChar ~ 1296 u2 attribute_name_index; 1297 \newline 1298 \SpecialChar \- 1299 \SpecialChar ~ 1300 \SpecialChar ~ 1301 u4 attribute_length; 1302 \newline 1303 \SpecialChar \- 1304 \SpecialChar ~ 1305 \SpecialChar ~ 1306 u2 max_stack; 1307 \newline 1308 \SpecialChar \- 1309 \SpecialChar ~ 1310 \SpecialChar ~ 1311 u2 max_locals; 1312 \newline 1313 \SpecialChar \- 1314 \SpecialChar ~ 1315 \SpecialChar ~ 1316 u4 code_length; 1317 \newline 1318 \SpecialChar \- 1319 \SpecialChar ~ 1320 \SpecialChar ~ 1321 u1 code[code_length]; 1322 \newline 1323 \SpecialChar \- 1324 \SpecialChar ~ 1325 \SpecialChar ~ 1326 u2 exception_table_length; 1327 \newline 1328 \SpecialChar \- 1329 \SpecialChar ~ 1330 \SpecialChar ~ 1331 { 1332 \newline 1333 \SpecialChar \- 1334 \SpecialChar ~ 1335 \SpecialChar ~ 1336 \SpecialChar \- 1337 \SpecialChar ~ 1338 \SpecialChar ~ 1339 u2 start_pc; 1340 \newline 1341 \SpecialChar \- 1342 \SpecialChar ~ 1343 \SpecialChar ~ 1344 \SpecialChar \- 1345 \SpecialChar ~ 1346 \SpecialChar ~ 1347 u2 end_pc; 1348 \newline 1349 \SpecialChar \- 1350 \SpecialChar ~ 1351 \SpecialChar ~ 1352 \SpecialChar \- 1353 \SpecialChar ~ 1354 \SpecialChar ~ 1355 u2 handler_pc; 1356 \newline 1357 \SpecialChar \- 1358 \SpecialChar ~ 1359 \SpecialChar ~ 1360 \SpecialChar \- 1361 \SpecialChar ~ 1362 \SpecialChar ~ 1363 u2 catch_type; 1364 \newline 1365 \SpecialChar \- 1366 \SpecialChar ~ 1367 \SpecialChar ~ 1368 } exception_table[exception_table_length]; 1369 \newline 1370 \SpecialChar \- 1371 \SpecialChar ~ 1372 \SpecialChar ~ 1373 u2 attributes_count; 1374 \newline 1375 \SpecialChar \- 1376 \SpecialChar ~ 1377 \SpecialChar ~ 1378 attribute_info attributes[attributes_count]; 1379 \newline 1380 } 1381 \family default 1382 1383 \newline 1384 1385 \newline 1386 This is the most complex of all predefined attributes. 1387 Every method that has code (i.e., every non-native, non-abstract method) 1388 must have such an attribute. 1389 Note that the maximum stack depth and the number of local variables for 1390 a method invocation are defined here. 1391 This is important for the JVM when it creates an 1392 \emph on 1393 execution frame 1394 \emph default 1395 (see section 1396 \begin_inset LatexCommand \ref{LV_and_OpStack} 1397 1398 \end_inset 1399 1400 ) at the time the method is invoked. 1401 \layout Standard 1402 1403 Also, the exception handlers are defined here. 1404 Exception handlers prevent an executing method from an abrupt completion 1405 if an exceptional situation occurs. 1406 Code areas are said to be protected against a class of exceptional situations 1407 by an exception handler 1408 \begin_float footnote 1409 \layout Standard 1410 1411 The JVM closely reflects the 1412 \emph on 1413 exception 1414 \emph default 1415 mechanism of the Java programming language 1416 \begin_inset LatexCommand \cite{langspec2} 1417 1418 \end_inset 1419 1420 . 1421 In the Java programming language, exceptions can be 1422 \emph on 1423 thrown 1424 \emph default 1425 , and they can be 1426 \emph on 1427 caught 1428 \emph default 1429 explicitly. 1430 If an internal JVM error occurs, the JVM also --implicitly-- throws an 1431 exception. 1432 \end_float 1433 . 1434 Algorithm 1435 \begin_inset LatexCommand \ref{ExcHdAlgo} 1436 1437 \end_inset 1438 1439 shows an example for the use of exception handlers. 1440 The exact meaning of the instruction opcodes is not important here, the 1441 most common instructions are explained later in this paper. 1442 \layout Standard 1443 1444 \begin_float alg 1445 \layout Standard 1446 1447 [Let 1448 \family typewriter 1449 start_pc 1450 \family default 1451 and 1452 \family typewriter 1453 end_pc 1454 \family default 1455 protect the area A to B, inclusive. 1456 Let the 1457 \family typewriter 1458 catch_type 1459 \family default 1460 be 1461 \begin_inset Quotes eld 1462 \end_inset 1463 1464 1465 \family typewriter 1466 java.lang.NullPointerException 1467 \family default 1468 1469 \begin_inset Quotes erd 1470 \end_inset 1471 1472 . 1473 Let the 1474 \family typewriter 1475 handler_pc 1476 \family default 1477 point to C.] 1478 \layout Standard 1479 1480 1481 \family typewriter 1482 \SpecialChar ~ 1483 \SpecialChar ~ 1484 \SpecialChar ~ 1485 aconst_null\SpecialChar ~ 1486 \SpecialChar ~ 1487 \SpecialChar ~ 1488 \SpecialChar ~ 1489 \SpecialChar ~ 1490 \SpecialChar ~ 1491 \SpecialChar ~ 1492 \SpecialChar ~ 1493 ; push a NULL onto the operand stack. 1494 \layout Standard 1495 1496 1497 \family typewriter 1498 A:\SpecialChar ~ 1499 nop\SpecialChar ~ 1500 \SpecialChar ~ 1501 \SpecialChar ~ 1502 \SpecialChar ~ 1503 \SpecialChar ~ 1504 \SpecialChar ~ 1505 \SpecialChar ~ 1506 \SpecialChar ~ 1507 \SpecialChar ~ 1508 \SpecialChar ~ 1509 \SpecialChar ~ 1510 \SpecialChar ~ 1511 \SpecialChar ~ 1512 \SpecialChar ~ 1513 \SpecialChar ~ 1514 \SpecialChar ~ 1515 ; do nothing 1516 \layout Standard 1517 1518 1519 \family typewriter 1520 B:\SpecialChar ~ 1521 getfield Foo::bar\SpecialChar ~ 1522 \SpecialChar ~ 1523 ; dereference NULL, cause NullPointerExc. 1524 \layout Standard 1525 1526 1527 \family typewriter 1528 \SpecialChar ~ 1529 \SpecialChar ~ 1530 \SpecialChar ~ 1531 return\SpecialChar ~ 1532 \SpecialChar ~ 1533 \SpecialChar ~ 1534 \SpecialChar ~ 1535 \SpecialChar ~ 1536 \SpecialChar ~ 1537 \SpecialChar ~ 1538 \SpecialChar ~ 1539 \SpecialChar ~ 1540 \SpecialChar ~ 1541 \SpecialChar ~ 1542 \SpecialChar ~ 1543 \SpecialChar ~ 1544 ;\SpecialChar ~ 1545 never executed 1546 \layout Standard 1547 1548 1549 \family typewriter 1550 C:\SpecialChar ~ 1551 nop\SpecialChar ~ 1552 \SpecialChar ~ 1553 \SpecialChar ~ 1554 \SpecialChar ~ 1555 \SpecialChar ~ 1556 \SpecialChar ~ 1557 \SpecialChar ~ 1558 \SpecialChar ~ 1559 \SpecialChar ~ 1560 \SpecialChar ~ 1561 \SpecialChar ~ 1562 \SpecialChar ~ 1563 \SpecialChar ~ 1564 \SpecialChar ~ 1565 \SpecialChar ~ 1566 \SpecialChar ~ 1567 ;\SpecialChar ~ 1568 this is executed: we could handle 1569 \layout Standard 1570 1571 1572 \family typewriter 1573 \SpecialChar ~ 1574 \SpecialChar ~ 1575 \SpecialChar ~ 1576 nop\SpecialChar ~ 1577 \SpecialChar ~ 1578 \SpecialChar ~ 1579 \SpecialChar ~ 1580 \SpecialChar ~ 1581 \SpecialChar ~ 1582 \SpecialChar ~ 1583 \SpecialChar ~ 1584 \SpecialChar ~ 1585 \SpecialChar ~ 1586 \SpecialChar ~ 1587 \SpecialChar ~ 1588 \SpecialChar ~ 1589 \SpecialChar ~ 1590 \SpecialChar ~ 1591 \SpecialChar ~ 1592 ;\SpecialChar ~ 1593 the NullPointerException 1594 \layout Standard 1595 1596 1597 \family typewriter 1598 \SpecialChar ~ 1599 \SpecialChar ~ 1600 \SpecialChar ~ 1601 return\SpecialChar ~ 1602 \SpecialChar ~ 1603 \SpecialChar ~ 1604 \SpecialChar ~ 1605 \SpecialChar ~ 1606 \SpecialChar ~ 1607 \SpecialChar ~ 1608 \SpecialChar ~ 1609 \SpecialChar ~ 1610 \SpecialChar ~ 1611 \SpecialChar ~ 1612 \SpecialChar ~ 1613 \SpecialChar ~ 1614 ;\SpecialChar ~ 1615 leave method (complete normally) 1616 \layout Caption 1617 1618 1619 \begin_inset LatexCommand \label{ExcHdAlgo} 1620 1621 \end_inset 1622 1623 Use of Exception Handlers 1624 \end_float 1625 \layout Standard 1626 1627 The most important item, however, is the 1628 \family typewriter 1629 code 1630 \family default 1631 item. 1632 It defines the bytecode of this method; i.e., the JVM machine instructions. 1633 \layout Subsubsection 1634 1635 1636 \begin_inset LatexCommand \label{LineNumberTableAttribute} 1637 1638 \end_inset 1639 1640 The LineNumberTable Attribute 1641 \layout Standard 1642 1643 The 1644 \family typewriter 1645 LineNumberTable 1646 \family default 1647 attribute is defined as follows: 1648 \newline 1649 1650 \newline 1651 1652 \family typewriter 1653 LineNumberTable_attribute { 1654 \newline 1655 \SpecialChar \- 1656 \SpecialChar ~ 1657 \SpecialChar ~ 1658 u2 attribute_name_index; 1659 \newline 1660 \SpecialChar \- 1661 \SpecialChar ~ 1662 \SpecialChar ~ 1663 u4 attribute_length; 1664 \newline 1665 \SpecialChar \- 1666 \SpecialChar ~ 1667 \SpecialChar ~ 1668 u2 line_number_table_length; 1669 \newline 1670 \SpecialChar \- 1671 \SpecialChar ~ 1672 \SpecialChar ~ 1673 { 1674 \newline 1675 \SpecialChar \- 1676 \SpecialChar ~ 1677 \SpecialChar ~ 1678 \SpecialChar \- 1679 \SpecialChar ~ 1680 \SpecialChar ~ 1681 u2 start_pc; 1682 \newline 1683 \SpecialChar \- 1684 \SpecialChar ~ 1685 \SpecialChar ~ 1686 \SpecialChar \- 1687 \SpecialChar ~ 1688 \SpecialChar ~ 1689 u2 line_number; 1690 \newline 1691 \SpecialChar \- 1692 \SpecialChar ~ 1693 \SpecialChar ~ 1694 } line_number_table[line_number_table_length]; 1695 \newline 1696 } 1697 \newline 1698 1699 \family default 1700 1701 \newline 1702 This attribute describes the relation between source code line numbers and 1703 JVM instruction offsets in the 1704 \family typewriter 1705 code 1706 \family default 1707 array of the 1708 \family typewriter 1709 Code_attribute 1710 \family default 1711 ; it can be used by debuggers to show the source code of currently executing 1712 JVM machine instructions. 1713 This attribute is usually a sub-attribute of a 1714 \family typewriter 1715 Code_attribute 1716 \family default 1717 . 1718 Multiple 1719 \family typewriter 1720 LineNumberTable 1721 \family default 1722 attributes may together represent a given line of a source code file. 1723 1724 \layout Subsection 1725 1726 Constants 1727 \layout Standard 1728 1729 All the constants together form the 1730 \emph on 1731 constant pool 1732 \emph default 1733 . 1734 The general 1735 \family typewriter 1736 cp_info 1737 \family default 1738 structure is straightforward. 1739 \newline 1740 1741 \newline 1742 1743 \family typewriter 1744 cp_info { 1745 \newline 1746 \SpecialChar \- 1747 \SpecialChar ~ 1748 \SpecialChar ~ 1749 u1 tag; 1750 \newline 1751 \SpecialChar \- 1752 \SpecialChar ~ 1753 \SpecialChar ~ 1754 u1 info[]; 1755 \newline 1756 } 1757 \family default 1758 1759 \newline 1760 1761 \newline 1762 The 'tag' defines what 'info' follows it. 1763 Constants define either constant values or constant symbolic references, 1764 such as references to other classes. 1765 Currently, eleven constant types are defined: 1766 \family typewriter 1767 Class 1768 \family default 1769 , 1770 \family typewriter 1771 Field\SpecialChar \- 1772 ref 1773 \family default 1774 , 1775 \family typewriter 1776 Method\SpecialChar \- 1777 ref 1778 \family default 1779 , 1780 \family typewriter 1781 In\SpecialChar \- 1782 ter\SpecialChar \- 1783 face\SpecialChar \- 1784 Method\SpecialChar \- 1785 ref 1786 \family default 1787 , 1788 \family typewriter 1789 String 1790 \family default 1791 , 1792 \family typewriter 1793 In\SpecialChar \- 1794 teger 1795 \family default 1796 , 1797 \family typewriter 1798 Float 1799 \family default 1800 , 1801 \family typewriter 1802 Long 1803 \family default 1804 , 1805 \family typewriter 1806 Double 1807 \family default 1808 , 1809 \family typewriter 1810 Name\SpecialChar \- 1811 And\SpecialChar \- 1812 Type 1813 \family default 1814 and 1815 \family typewriter 1816 Utf8 1817 \family default 1818 . 1819 \layout Standard 1820 1821 Most of the names are self-explanatory; the interested reader will find 1822 more information in the specification 1823 \begin_inset LatexCommand \cite{vmspec2} 1824 1825 \end_inset 1826 1827 . 1828 Constants can be nested; this is done by referring to the constant pool 1829 index of the enclosed constant. 1830 \layout Standard 1831 1832 See the following examples. 1833 \newline 1834 1835 \newline 1836 1837 \family typewriter 1838 CONSTANT_Utf8_info { 1839 \newline 1840 \SpecialChar \- 1841 \SpecialChar ~ 1842 \SpecialChar ~ 1843 u1 tag; 1844 \newline 1845 \SpecialChar \- 1846 \SpecialChar ~ 1847 \SpecialChar ~ 1848 u2 length; 1849 \newline 1850 \SpecialChar \- 1851 \SpecialChar ~ 1852 \SpecialChar ~ 1853 u1 bytes[length]; 1854 \newline 1855 } 1856 \newline 1857 1858 \newline 1859 1860 \family default 1861 A CONSTANT_Utf8 represents a constant string. 1862 Such a string is e.g. 1863 used to describe names of methods, names of fields, names of attributes, 1864 types of methods or types of fields. 1865 This string is encoded in UTF-8 format, a variant of the unicode character 1866 set 1867 \begin_inset LatexCommand \cite{Unicode} 1868 1869 \end_inset 1870 1871 . 1872 1873 \family typewriter 1874 1875 \family default 1876 The tag for this type of constant is simply the number 1, as defined in 1877 the Java Virtual Machine Specification, Second Edition 1878 \begin_inset LatexCommand \cite{vmspec2} 1879 1880 \end_inset 1881 1882 . 1883 \family typewriter 1884 1885 \newline 1886 1887 \newline 1888 CONSTANT_NameAndType_info { 1889 \newline 1890 \SpecialChar \- 1891 \SpecialChar ~ 1892 \SpecialChar ~ 1893 u1 tag; 1894 \newline 1895 \SpecialChar \- 1896 \SpecialChar ~ 1897 \SpecialChar ~ 1898 u2 name_index; 1899 \newline 1900 \SpecialChar \- 1901 \SpecialChar ~ 1902 \SpecialChar ~ 1903 u2 descriptor_index; 1904 \newline 1905 } 1906 \family default 1907 1908 \newline 1909 1910 \newline 1911 A Constant_NameAndType represents a name and a signature of a method, the 1912 tag is the number 12. 1913 1914 \family typewriter 1915 1916 \family default 1917 Both 1918 \family typewriter 1919 class_index 1920 \family default 1921 and 1922 \family typewriter 1923 descriptor_index 1924 \family default 1925 refer to a 1926 \family typewriter 1927 CONSTANT_Utf8 1928 \family default 1929 . 1930 \family typewriter 1931 1932 \newline 1933 1934 \newline 1935 CONSTANT_InterfaceMethodref_info { 1936 \newline 1937 \SpecialChar \- 1938 \SpecialChar ~ 1939 \SpecialChar ~ 1940 u1 tag; 1941 \newline 1942 \SpecialChar \- 1943 \SpecialChar ~ 1944 \SpecialChar ~ 1945 u2 class_index; 1946 \newline 1947 \SpecialChar \- 1948 \SpecialChar ~ 1949 \SpecialChar ~ 1950 u2 name_and_type_index; 1951 \newline 1952 } 1953 \family default 1954 1955 \newline 1956 1957 \newline 1958 A 1959 \family typewriter 1960 CONSTANT_InterfaceMethodref 1961 \family default 1962 describes a reference to a method defined in an interface class (see section 1963 1964 \begin_inset LatexCommand \cite{langspec2} 1965 1966 \end_inset 1967 1968 for an explanation of interfaces), the tag is number 11. 1969 The interface class is referenced via a two-byte index into the constant 1970 pool. 1971 A 1972 \family typewriter 1973 Constant_Class 1974 \family default 1975 is expected there describing a reference to some class file. 1976 Every method has a name, zero or more argument types and a return type; 1977 this is described in the 1978 \family typewriter 1979 CONSTANT_NameAndType 1980 \family default 1981 that is also referenced via a two-byte constant pool index. 1982 \layout Standard 1983 1984 Note that there are implicit constraints on the integrity of a class file: 1985 for example, there must not be a 1986 \family typewriter 1987 CONSTANT_Integer 1988 \family default 1989 where a 1990 \family typewriter 1991 CONSTANT_Utf8 1992 \family default 1993 is expected for a certain entity. 1994 As another example, the names and the types of methods are encoded as strings 1995 in UTF-8 format 1996 \begin_inset LatexCommand \cite{Unicode} 1997 1998 \end_inset 1999 2000 . 2001 They have to be well-formed (according to the specification) to be valid. 2002 \layout Subsection 2003 2004 2005 \begin_inset LatexCommand \label{Fields} 2006 2007 \end_inset 2008 2009 Fields 2010 \layout Standard 2011 2012 Each field is described by a field_info structure as defined below. 2013 \newline 2014 2015 \newline 2016 2017 \family typewriter 2018 field_info { 2019 \newline 2020 \SpecialChar \- 2021 \SpecialChar ~ 2022 \SpecialChar ~ 2023 u2 access_flags; 2024 \newline 2025 \SpecialChar \- 2026 \SpecialChar ~ 2027 \SpecialChar ~ 2028 u2 name_index; 2029 \newline 2030 \SpecialChar \- 2031 \SpecialChar ~ 2032 \SpecialChar ~ 2033 u2 descriptor_index; 2034 \newline 2035 \SpecialChar \- 2036 \SpecialChar ~ 2037 \SpecialChar ~ 2038 u2 attributes_count; 2039 \newline 2040 \SpecialChar \- 2041 \SpecialChar ~ 2042 \SpecialChar ~ 2043 attribute_info attributes[attributes_count]; 2044 \family default 2045 2046 \newline 2047 } 2048 \newline 2049 2050 \newline 2051 A field has to be unique in a class file with respect to its name and descriptor 2052 \begin_float footnote 2053 \layout Standard 2054 2055 The descriptor of a field describes its type. 2056 E.g., a descriptor of 2057 \begin_inset Quotes eld 2058 \end_inset 2059 2060 [I 2061 \begin_inset Quotes erd 2062 \end_inset 2063 2064 means 2065 \begin_inset Quotes eld 2066 \end_inset 2067 2068 one-dimensional array of 2069 \family typewriter 2070 int 2071 \family default 2072 2073 \begin_inset Quotes erd 2074 \end_inset 2075 2076 . 2077 \end_float 2078 . 2079 We see that fields reference constants in the constant pool via their constant 2080 pool indices (such as a 2081 \family typewriter 2082 CONSTANT_Utf8 2083 \family default 2084 describing a field's name). 2085 An important attribute used by fields is the ConstantValue attribute (see 2086 section 2087 \begin_inset LatexCommand \ref{ConstantValueAttribute} 2088 2089 \end_inset 2090 2091 ). 2092 \layout Standard 2093 2094 The 2095 \family typewriter 2096 access_flags 2097 \family default 2098 entry is a bit vector that specifies the accessibility and other properties 2099 \begin_float footnote 2100 \layout Standard 2101 2102 Often called 2103 \emph on 2104 visibility 2105 \emph default 2106 . 2107 \end_float 2108 of the field. 2109 E.g., a field with the 2110 \family typewriter 2111 ACC_PRIVATE 2112 \begin_float footnote 2113 \layout Standard 2114 2115 Bit number 1. 2116 \end_float 2117 bit set is not accessible to other classes. 2118 A field with the 2119 \family typewriter 2120 ACC_PUBLIC 2121 \begin_float footnote 2122 \layout Standard 2123 2124 Bit number 0. 2125 \end_float 2126 bit set is accessible to any other class. 2127 Any combination with both the 2128 \family typewriter 2129 ACC_PRIVATE 2130 \family default 2131 and the 2132 \family typewriter 2133 ACC_PUBLIC 2134 \family default 2135 bit set is not valid. 2136 \layout Standard 2137 2138 The 2139 \family typewriter 2140 descriptor_index 2141 \family default 2142 refers to a 2143 \family typewriter 2144 CONSTANT_Utf8 2145 \family default 2146 that symbolically encodes the type of the field. 2147 \layout Subsection 2148 2149 2150 \begin_inset LatexCommand \label{Methods} 2151 2152 \end_inset 2153 2154 Methods 2155 \layout Standard 2156 2157 Each method is described by a method_info structure as defined below. 2158 \newline 2159 2160 \newline 2161 2162 \family typewriter 2163 method_info { 2164 \newline 2165 \SpecialChar \- 2166 \SpecialChar ~ 2167 \SpecialChar ~ 2168 u2 access_flags; 2169 \newline 2170 \SpecialChar \- 2171 \SpecialChar ~ 2172 \SpecialChar ~ 2173 u2 name_index; 2174 \newline 2175 \SpecialChar \- 2176 \SpecialChar ~ 2177 \SpecialChar ~ 2178 u2 descriptor_index; 2179 \newline 2180 \SpecialChar \- 2181 \SpecialChar ~ 2182 \SpecialChar ~ 2183 u2 attributes_count; 2184 \newline 2185 \SpecialChar \- 2186 \SpecialChar ~ 2187 \SpecialChar ~ 2188 attribute_info attributes[attributes_count]; 2189 \newline 2190 } 2191 \family default 2192 2193 \newline 2194 2195 \newline 2196 As we can easily see, this is exactly the same structure we already know 2197 as 2198 \family typewriter 2199 field_info 2200 \family default 2201 (see section 2202 \begin_inset LatexCommand \ref{Fields} 2203 2204 \end_inset 2205 2206 ). 2207 The difference lies in the meaning of the enlisted entities. 2208 For example, an access flag saying a field was volatile (non-cacheable) 2209 would not make any sense if set in a 2210 \family typewriter 2211 method_info 2212 \family default 2213 structure. 2214 Vice versa, an access flag saying the floating point instructions should 2215 work in 2216 \begin_inset Quotes eld 2217 \end_inset 2218 2219 FP-strict 2220 \begin_inset Quotes erd 2221 \end_inset 2222 2223 mode would be of no use if set in a 2224 \family typewriter 2225 field_info 2226 \family default 2227 structure. 2228 \layout Standard 2229 2230 Methods use a different set of attributes than fields; for example, the 2231 2232 \family typewriter 2233 Constant\SpecialChar \- 2234 Value 2235 \family default 2236 attribute (see section 2237 \begin_inset LatexCommand \ref{ConstantValueAttribute} 2238 2239 \end_inset 2240 2241 ) is of no use here. 2242 The 2243 \family typewriter 2244 Code 2245 \family default 2246 and 2247 \family typewriter 2248 Exceptions 2249 \family default 2250 attributes frequently used by methods are of no use for fields on the other 2251 hand. 2252 \layout Section 2253 2254 The Execution Engine 2255 \layout Standard 2256 2257 Before a piece of code (the code of a 2258 \begin_inset Quotes eld 2259 \end_inset 2260 2261 method 2262 \begin_inset Quotes erd 2263 \end_inset 2264 2265 ) is executed, an 2266 \emph on 2267 execution frame 2268 \emph default 2269 is set up. 2270 It consists of a program counter (as known from traditional CPUs), a set 2271 of local variables (similar to registers known from traditional CPUs), 2272 and an operand stack. 2273 For each new invocation instance of a method, a new execution frame is 2274 set up; it is destroyed on method termination. 2275 \layout Standard 2276 2277 Because a method may invoke other methods or itself recursively, there is 2278 a global method invocation stack. 2279 \layout Standard 2280 2281 There also is a garbage-collected heap shared among the execution frames. 2282 This heap is used for object allocation (see section 2283 \begin_inset LatexCommand \ref{Instructions} 2284 2285 \end_inset 2286 2287 ). 2288 \layout Standard 2289 2290 The number of local variables is not fixed. 2291 Every method defines how many local variables are used for its code (up 2292 to 65536). 2293 \layout Standard 2294 2295 Also note that there is no equivalent of a 2296 \emph on 2297 Processor Status Word 2298 \emph default 2299 (PSW) in the JVM. 2300 Traditionally, a PSW has flags that are set implicitly during execution 2301 of the instructions (such as an overflow or is-zero flag). 2302 This is often used for conditional branching. 2303 The JVM, however, uses the operand stack to store the result of a comparison 2304 instruction explicitly. 2305 This result is often read from the stack by the JVM's conditional branching 2306 instructions. 2307 \layout Standard 2308 2309 Should exceptional situations occur (such as an out-of-memory situation), 2310 the JVM does not lock up. 2311 Instead, an 2312 \begin_inset Quotes eld 2313 \end_inset 2314 2315 exception is thrown 2316 \begin_inset Quotes erd 2317 \end_inset 2318 2319 ; the currently executing program is signalled. 2320 These signals can be processed ( 2321 \begin_inset Quotes eld 2322 \end_inset 2323 2324 exceptions can be caught 2325 \begin_inset Quotes erd 2326 \end_inset 2327 2328 ). 2329 If such a signal is not handled by the currently executing method, the 2330 JVM will search a handler through the invocation hierarchy and stop execution 2331 only if none was found. 2332 \layout Standard 2333 2334 There is a thread mechanism in the JVM. 2335 Basically every thread creates an own method invocation stack (so there 2336 may be more than one active execution frame at a time), but this feature 2337 is not important for the rest of this text. 2338 \layout Standard 2339 2340 \begin_float fig 2341 \layout Standard 2342 \align center 2343 2344 \begin_inset Figure size 595 379 2345 file exframe.eps 2346 width 3 100 2347 flags 9 2348 2349 \end_inset 2350 2351 2352 \layout Standard 2353 2354 This figure shows a method invocation stack. 2355 Method 2356 \family typewriter 2357 main 2358 \family default 2359 was invoked by the system, 2360 \family typewriter 2361 main 2362 \family default 2363 invoked 2364 \family typewriter 2365 foo 2366 \family default 2367 , 2368 \family typewriter 2369 foo 2370 \family default 2371 invoked 2372 \family typewriter 2373 bar 2374 \family default 2375 , and 2376 \family typewriter 2377 bar 2378 \family default 2379 invoked 2380 \family typewriter 2381 foo 2382 \family default 2383 recursively. 2384 This figure assumes 2385 \family typewriter 2386 main 2387 \family default 2388 allocates one local variable and one operand stack slot, 2389 \family typewriter 2390 foo 2391 \family default 2392 allocates three local variables and two operand stack slots and 2393 \family typewriter 2394 bar 2395 \family default 2396 allocates one local variable and two operand stack slots. 2397 \layout Caption 2398 2399 Method Invocation Stack 2400 \end_float 2401 \layout Subsection 2402 2403 2404 \begin_inset LatexCommand \label{LV_and_OpStack} 2405 2406 \end_inset 2407 2408 Local Variables and the Operand Stack 2409 \layout Standard 2410 2411 The method information in a class file defines how many local variables 2412 are used on this method's invocation. 2413 It also defines the maximum operand stack size. 2414 Together, the local variables array and the operand stack are called the 2415 2416 \emph on 2417 execution frame 2418 \emph default 2419 . 2420 \layout Standard 2421 2422 A single stack slot has a width of 32 bits, which is also the width of a 2423 local variable. 2424 Therefore, values of types that occupy 64 bits ( 2425 \emph on 2426 double 2427 \emph default 2428 and 2429 \emph on 2430 long 2431 \emph default 2432 ) must be stored in two consecutive stack slots or local variables. 2433 \layout Standard 2434 2435 The verifier takes care that the stack cannot overflow and that it cannot 2436 underflow. 2437 Also, it takes care that instructions may only access local variables if 2438 they contain a value of a known, correct type (see section 2439 \begin_inset LatexCommand \ref{Pass3Spec} 2440 2441 \end_inset 2442 2443 ). 2444 2445 \layout Subsection 2446 2447 2448 \begin_inset LatexCommand \label{Instructions} 2449 2450 \end_inset 2451 2452 Introduction to JVM Instructions 2453 \layout Standard 2454 2455 This section is derived from section 2.2 of 2456 \begin_inset LatexCommand \cite{BCEL98} 2457 2458 \end_inset 2459 2460 , used with permission of the author. 2461 \layout Standard 2462 2463 The JVM's instruction set currently consists of 212 instructions, 44 opcodes 2464 are marked as reserved and may be used for future extensions or intermediate 2465 optimizations within the Virtual Machine. 2466 The instruction set can be roughly grouped as follows: 2467 \layout Description 2468 2469 Stack\SpecialChar ~ 2470 operations: Constants can be pushed onto the stack either by loading 2471 them from the constant pool with the 2472 \latex latex 2473 2474 \backslash 2475 texttt{ldc} 2476 \latex default 2477 instruction or with special ``short-cut'' instructions where the operand 2478 is encoded into the instructions, e.g., 2479 \latex latex 2480 2481 \backslash 2482 texttt{iconst 2483 \backslash 2484 _0} 2485 \latex default 2486 or 2487 \latex latex 2488 2489 \backslash 2490 texttt{bipush} 2491 \latex default 2492 (push byte value). 2493 \layout Description 2494 2495 Arithmetic\SpecialChar ~ 2496 operations: The instruction set of the JVM distinguishes its operand 2497 types using different instructions to operate on values of specific type. 2498 Arithmetic operations starting with 2499 \latex latex 2500 2501 \backslash 2502 texttt{i} 2503 \latex default 2504 , for example, denote an integer operation. 2505 E.g., 2506 \latex latex 2507 2508 \backslash 2509 texttt{iadd} 2510 \latex default 2511 that adds two integers and pushes the result back on the operand stack. 2512 The Java types 2513 \latex latex 2514 2515 \backslash 2516 texttt{boolean} 2517 \latex default 2518 , 2519 \latex latex 2520 2521 \backslash 2522 texttt{byte} 2523 \latex default 2524 , 2525 \latex latex 2526 2527 \backslash 2528 texttt{short} 2529 \latex default 2530 , and 2531 \latex latex 2532 2533 \backslash 2534 texttt{char} 2535 \latex default 2536 are handled as integers by the JVM. 2537 \layout Description 2538 2539 2540 \begin_inset LatexCommand \label{RetDesc} 2541 2542 \end_inset 2543 2544 Control\SpecialChar ~ 2545 flow: There are branch instructions like 2546 \latex latex 2547 2548 \backslash 2549 texttt{goto} 2550 \latex default 2551 and 2552 \latex latex 2553 2554 \backslash 2555 texttt{if 2556 \backslash 2557 _icmpeq} 2558 \latex default 2559 , which compares two integers for equality. 2560 There is also a 2561 \latex latex 2562 2563 \backslash 2564 texttt{jsr} 2565 \begin_float footnote 2566 \layout Standard 2567 2568 There is a 2569 \begin_inset Quotes eld 2570 \end_inset 2571 2572 wide 2573 \begin_inset Quotes erd 2574 \end_inset 2575 2576 version of 2577 \latex latex 2578 2579 \backslash 2580 texttt{jsr} 2581 \latex default 2582 called 2583 \latex latex 2584 2585 \backslash 2586 texttt{jsr 2587 \backslash 2588 _w} 2589 \latex default 2590 . 2591 The instructions 2592 \latex latex 2593 2594 \backslash 2595 texttt{jsr} 2596 \latex default 2597 / 2598 \latex latex 2599 2600 \backslash 2601 texttt{jsr 2602 \backslash 2603 _w} 2604 \latex default 2605 and 2606 \latex latex 2607 2608 \backslash 2609 texttt{ret} 2610 \latex default 2611 play in important role in chapter 2612 \begin_inset LatexCommand \ref{Pass3Spec} 2613 2614 \end_inset 2615 2616 . 2617 \end_float 2618 (jump into subroutine) and 2619 \latex latex 2620 2621 \backslash 2622 texttt{ret} 2623 \latex default 2624 (return from subroutine) pair of instructions. 2625 Exceptions may be thrown with the 2626 \latex latex 2627 2628 \backslash 2629 texttt{athrow} 2630 \latex default 2631 instruction. 2632 Branch targets are coded as offsets from the current byte code position, 2633 i.e., they are coded with an integer number. 2634 \layout Description 2635 2636 Load\SpecialChar ~ 2637 and\SpecialChar ~ 2638 store\SpecialChar ~ 2639 operations for local variables like 2640 \latex latex 2641 2642 \backslash 2643 texttt{iload} 2644 \latex default 2645 and 2646 \latex latex 2647 2648 \backslash 2649 texttt{istore} 2650 \latex default 2651 . 2652 There are also array operations like 2653 \latex latex 2654 2655 \backslash 2656 texttt{iastore} 2657 \latex default 2658 which stores an integer value into an array. 2659 \layout Description 2660 2661 Field\SpecialChar ~ 2662 access: The value of an instance field may be retrieved with 2663 \latex latex 2664 2665 \backslash 2666 texttt{getfield} 2667 \latex default 2668 and written with 2669 \latex latex 2670 2671 \backslash 2672 texttt{putfield} 2673 \latex default 2674 . 2675 For static fields, there are 2676 \latex latex 2677 2678 \backslash 2679 texttt{getstatic} 2680 \latex default 2681 and 2682 \latex latex 2683 2684 \backslash 2685 texttt{putstatic} 2686 \latex default 2687 counterparts. 2688 \layout Description 2689 2690 Method\SpecialChar ~ 2691 invocation: Methods may either be called via static references with 2692 2693 \latex latex 2694 2695 \backslash 2696 texttt{invokestatic} 2697 \latex default 2698 or be bound virtually with the 2699 \latex latex 2700 2701 \backslash 2702 texttt{invokevirtual} 2703 \latex default 2704 instruction. 2705 Super class methods and private methods are invoked with 2706 \latex latex 2707 2708 \backslash 2709 texttt{invokespecial} 2710 \latex default 2711 . 2712 \layout Description 2713 2714 Object\SpecialChar ~ 2715 allocation: Class instances are allocated with the 2716 \latex latex 2717 2718 \backslash 2719 texttt{new} 2720 \latex default 2721 instruction, arrays of basic type like 2722 \latex latex 2723 2724 \backslash 2725 texttt{int[]} 2726 \latex default 2727 with 2728 \latex latex 2729 2730 \backslash 2731 texttt{newarray} 2732 \latex default 2733 , arrays of references like 2734 \latex latex 2735 2736 \backslash 2737 texttt{String[][]} 2738 \latex default 2739 with 2740 \latex latex 2741 2742 \backslash 2743 texttt{anewarray} 2744 \latex default 2745 or 2746 \latex latex 2747 2748 \backslash 2749 texttt{multianewarray} 2750 \latex default 2751 . 2752 \layout Description 2753 2754 Conversion\SpecialChar ~ 2755 and\SpecialChar ~ 2756 type\SpecialChar ~ 2757 checking: For stack operands of basic type there exist 2758 casting operations like 2759 \latex latex 2760 2761 \backslash 2762 texttt{f2i} 2763 \latex default 2764 which converts a float value into an integer. 2765 The validity of a type cast may be checked with 2766 \latex latex 2767 2768 \backslash 2769 texttt{checkcast} 2770 \latex default 2771 and the 2772 \latex latex 2773 2774 \backslash 2775 texttt{instanceof} 2776 \latex default 2777 operator can be directly mapped to the equally named instruction. 2778 \layout Standard 2779 2780 Most instructions have a fixed length, but there are also some variable-length 2781 instructions: In particular, the 2782 \latex latex 2783 2784 \backslash 2785 texttt{lookupswitch} 2786 \latex default 2787 and 2788 \latex latex 2789 2790 \backslash 2791 texttt{tableswitch} 2792 \latex default 2793 instructions, which are often used by compilers to implement the Java language 2794 2795 \latex latex 2796 2797 \backslash 2798 texttt{switch()} 2799 \latex default 2800 statements. 2801 Since the number of 2802 \latex latex 2803 2804 \backslash 2805 texttt{case} 2806 \latex default 2807 clauses may vary, these instructions contain a variable number of statements. 2808 \layout Standard 2809 2810 In a class file, the 2811 \family typewriter 2812 code 2813 \family default 2814 item in the 2815 \family typewriter 2816 Code 2817 \family default 2818 attributes (which in turn are attributes of 2819 \family typewriter 2820 method_info 2821 \family default 2822 structures), is a byte array in which binary representations of JVM instruction 2823 s are stored sequentially. 2824 This is also called 2825 \emph on 2826 bytecode 2827 \emph default 2828 . 2829 \layout Standard 2830 2831 The JVM is a stack-based machine. 2832 There are local variables which may be compared to registers, but most 2833 instructions work on the operand stack. 2834 E.g., the 2835 \latex latex 2836 2837 \backslash 2838 texttt{iadd} 2839 \latex default 2840 instruction pops two integers from the operand stack and pushes the result 2841 of the add operation on top of the stack. 2842 \layout Standard 2843 2844 We will not list all of the instructions here, since these are explained 2845 in detail in the JVM specification. 2846 However, you will find the most common instructions in table 2847 \begin_inset LatexCommand \ref{typeprefixes} 2848 2849 \end_inset 2850 2851 , cited with slight corrections and modifications from chapter 4 of 2852 \begin_inset LatexCommand \cite{JNS} 2853 2854 \end_inset 2855 2856 . 2857 \layout Standard 2858 2859 \begin_float tab 2860 \layout Caption 2861 2862 2863 \begin_inset LatexCommand \label{typeprefixes} 2864 2865 \end_inset 2866 2867 Type Prefixes and the Most Common JVM Instructions 2868 \layout Standard 2869 \align center 2870 2871 \begin_inset Tabular 2872 <lyxtabular version="2" rows="9" columns="2"> 2873 <features rotate="false" islongtable="false" endhead="0" endfirsthead="0" endfoot="0" endlastfoot="0"> 2874 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 2875 <column alignment="center" valignment="top" leftline="true" rightline="true" width="" special=""> 2876 <row topline="true" bottomline="true" newpage="false"> 2877 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2878 \begin_inset Text 2879 2880 \layout Standard 2881 2882 Prefix 2883 \end_inset 2884 </cell> 2885 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2886 \begin_inset Text 2887 2888 \layout Standard 2889 2890 Bytecode type 2891 \end_inset 2892 </cell> 2893 </row> 2894 <row topline="true" bottomline="false" newpage="false"> 2895 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2896 \begin_inset Text 2897 2898 \layout Standard 2899 2900 i 2901 \end_inset 2902 </cell> 2903 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2904 \begin_inset Text 2905 2906 \layout Standard 2907 2908 Integer 2909 \end_inset 2910 </cell> 2911 </row> 2912 <row topline="true" bottomline="false" newpage="false"> 2913 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2914 \begin_inset Text 2915 2916 \layout Standard 2917 2918 f 2919 \end_inset 2920 </cell> 2921 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2922 \begin_inset Text 2923 2924 \layout Standard 2925 2926 Floating point 2927 \end_inset 2928 </cell> 2929 </row> 2930 <row topline="true" bottomline="false" newpage="false"> 2931 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2932 \begin_inset Text 2933 2934 \layout Standard 2935 2936 l 2937 \end_inset 2938 </cell> 2939 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2940 \begin_inset Text 2941 2942 \layout Standard 2943 2944 Long 2945 \end_inset 2946 </cell> 2947 </row> 2948 <row topline="true" bottomline="false" newpage="false"> 2949 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2950 \begin_inset Text 2951 2952 \layout Standard 2953 2954 d 2955 \end_inset 2956 </cell> 2957 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2958 \begin_inset Text 2959 2960 \layout Standard 2961 2962 Double precision floating point 2963 \end_inset 2964 </cell> 2965 </row> 2966 <row topline="true" bottomline="false" newpage="false"> 2967 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2968 \begin_inset Text 2969 2970 \layout Standard 2971 2972 b 2973 \end_inset 2974 </cell> 2975 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2976 \begin_inset Text 2977 2978 \layout Standard 2979 2980 Byte 2981 \end_inset 2982 </cell> 2983 </row> 2984 <row topline="true" bottomline="false" newpage="false"> 2985 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 2986 \begin_inset Text 2987 2988 \layout Standard 2989 2990 s 2991 \end_inset 2992 </cell> 2993 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 2994 \begin_inset Text 2995 2996 \layout Standard 2997 2998 Short 2999 \end_inset 3000 </cell> 3001 </row> 3002 <row topline="true" bottomline="false" newpage="false"> 3003 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3004 \begin_inset Text 3005 3006 \layout Standard 3007 3008 c 3009 \end_inset 3010 </cell> 3011 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3012 \begin_inset Text 3013 3014 \layout Standard 3015 3016 Character 3017 \end_inset 3018 </cell> 3019 </row> 3020 <row topline="true" bottomline="true" newpage="false"> 3021 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3022 \begin_inset Text 3023 3024 \layout Standard 3025 3026 a 3027 \end_inset 3028 </cell> 3029 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3030 \begin_inset Text 3031 3032 \layout Standard 3033 3034 Object reference 3035 \end_inset 3036 </cell> 3037 </row> 3038 </lyxtabular> 3039 3040 \end_inset 3041 3042 3043 \end_float 3044 \layout Standard 3045 3046 3047 \begin_inset Tabular 3048 <lyxtabular version="2" rows="29" columns="10"> 3049 <features rotate="false" islongtable="true" endhead="1" endfirsthead="0" endfoot="0" endlastfoot="0"> 3050 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3051 <column alignment="left" valignment="top" leftline="true" rightline="false" width="" special=""> 3052 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3053 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3054 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3055 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3056 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3057 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3058 <column alignment="center" valignment="top" leftline="true" rightline="false" width="" special=""> 3059 <column alignment="left" valignment="top" leftline="true" rightline="true" width="4cm" special=""> 3060 <row topline="true" bottomline="true" newpage="false"> 3061 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3062 \begin_inset Text 3063 3064 \layout Standard 3065 3066 3067 \size scriptsize 3068 Instruction 3069 \end_inset 3070 </cell> 3071 <cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3072 \begin_inset Text 3073 3074 \layout Standard 3075 3076 3077 \size scriptsize 3078 int 3079 \end_inset 3080 </cell> 3081 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3082 \begin_inset Text 3083 3084 \layout Standard 3085 3086 3087 \size scriptsize 3088 long 3089 \end_inset 3090 </cell> 3091 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3092 \begin_inset Text 3093 3094 \layout Standard 3095 3096 3097 \size scriptsize 3098 float 3099 \end_inset 3100 </cell> 3101 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3102 \begin_inset Text 3103 3104 \layout Standard 3105 3106 3107 \size scriptsize 3108 double 3109 \end_inset 3110 </cell> 3111 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3112 \begin_inset Text 3113 3114 \layout Standard 3115 3116 3117 \size scriptsize 3118 byte 3119 \end_inset 3120 </cell> 3121 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3122 \begin_inset Text 3123 3124 \layout Standard 3125 3126 3127 \size scriptsize 3128 char 3129 \end_inset 3130 </cell> 3131 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3132 \begin_inset Text 3133 3134 \layout Standard 3135 3136 3137 \size scriptsize 3138 short 3139 \end_inset 3140 </cell> 3141 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3142 \begin_inset Text 3143 3144 \layout Standard 3145 3146 3147 \size scriptsize 3148 object ref. 3149 \end_inset 3150 </cell> 3151 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3152 \begin_inset Text 3153 3154 \layout Standard 3155 3156 3157 \size scriptsize 3158 Function 3159 \end_inset 3160 </cell> 3161 </row> 3162 <row topline="true" bottomline="false" newpage="false"> 3163 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3164 \begin_inset Text 3165 3166 \layout Standard 3167 3168 ?2c 3169 \end_inset 3170 </cell> 3171 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3172 \begin_inset Text 3173 3174 \layout Standard 3175 3176 X 3177 \end_inset 3178 </cell> 3179 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3180 \begin_inset Text 3181 3182 \layout Standard 3183 3184 \end_inset 3185 </cell> 3186 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3187 \begin_inset Text 3188 3189 \layout Standard 3190 3191 \end_inset 3192 </cell> 3193 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3194 \begin_inset Text 3195 3196 \layout Standard 3197 3198 \end_inset 3199 </cell> 3200 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3201 \begin_inset Text 3202 3203 \layout Standard 3204 3205 \end_inset 3206 </cell> 3207 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3208 \begin_inset Text 3209 3210 \layout Standard 3211 3212 \end_inset 3213 </cell> 3214 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3215 \begin_inset Text 3216 3217 \layout Standard 3218 3219 \end_inset 3220 </cell> 3221 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3222 \begin_inset Text 3223 3224 \layout Standard 3225 3226 \end_inset 3227 </cell> 3228 <cell multicolumn="0" alignment="left" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3229 \begin_inset Text 3230 3231 \layout Standard 3232 3233 Convert value of type <?> to character 3234 \end_inset 3235 </cell> 3236 </row> 3237 <row topline="true" bottomline="false" newpage="false"> 3238 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3239 \begin_inset Text 3240 3241 \layout Standard 3242 3243 ?2d 3244 \end_inset 3245 </cell> 3246 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3247 \begin_inset Text 3248 3249 \layout Standard 3250 3251 X 3252 \end_inset 3253 </cell> 3254 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3255 \begin_inset Text 3256 3257 \layout Standard 3258 3259 X 3260 \end_inset 3261 </cell> 3262 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3263 \begin_inset Text 3264 3265 \layout Standard 3266 3267 X 3268 \end_inset 3269 </cell> 3270 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3271 \begin_inset Text 3272 3273 \layout Standard 3274 3275 \end_inset 3276 </cell> 3277 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3278 \begin_inset Text 3279 3280 \layout Standard 3281 3282 \end_inset 3283 </cell> 3284 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3285 \begin_inset Text 3286 3287 \layout Standard 3288 3289 \end_inset 3290 </cell> 3291 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3292 \begin_inset Text 3293 3294 \layout Standard 3295 3296 \end_inset 3297 </cell> 3298 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3299 \begin_inset Text 3300 3301 \layout Standard 3302 3303 \end_inset 3304 </cell> 3305 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3306 \begin_inset Text 3307 3308 \layout Standard 3309 3310 Convert value of type <?> to double 3311 \end_inset 3312 </cell> 3313 </row> 3314 <row topline="true" bottomline="false" newpage="false"> 3315 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3316 \begin_inset Text 3317 3318 \layout Standard 3319 3320 ?2i 3321 \end_inset 3322 </cell> 3323 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3324 \begin_inset Text 3325 3326 \layout Standard 3327 3328 \end_inset 3329 </cell> 3330 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3331 \begin_inset Text 3332 3333 \layout Standard 3334 3335 X 3336 \end_inset 3337 </cell> 3338 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3339 \begin_inset Text 3340 3341 \layout Standard 3342 3343 X 3344 \end_inset 3345 </cell> 3346 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3347 \begin_inset Text 3348 3349 \layout Standard 3350 3351 X 3352 \end_inset 3353 </cell> 3354 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3355 \begin_inset Text 3356 3357 \layout Standard 3358 3359 \end_inset 3360 </cell> 3361 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3362 \begin_inset Text 3363 3364 \layout Standard 3365 3366 \end_inset 3367 </cell> 3368 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3369 \begin_inset Text 3370 3371 \layout Standard 3372 3373 \end_inset 3374 </cell> 3375 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3376 \begin_inset Text 3377 3378 \layout Standard 3379 3380 \end_inset 3381 </cell> 3382 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3383 \begin_inset Text 3384 3385 \layout Standard 3386 3387 Convert value of type <?> to integer 3388 \end_inset 3389 </cell> 3390 </row> 3391 <row topline="true" bottomline="false" newpage="false"> 3392 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3393 \begin_inset Text 3394 3395 \layout Standard 3396 3397 ?2f 3398 \end_inset 3399 </cell> 3400 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3401 \begin_inset Text 3402 3403 \layout Standard 3404 3405 X 3406 \end_inset 3407 </cell> 3408 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3409 \begin_inset Text 3410 3411 \layout Standard 3412 3413 X 3414 \end_inset 3415 </cell> 3416 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3417 \begin_inset Text 3418 3419 \layout Standard 3420 3421 \end_inset 3422 </cell> 3423 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3424 \begin_inset Text 3425 3426 \layout Standard 3427 3428 X 3429 \end_inset 3430 </cell> 3431 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3432 \begin_inset Text 3433 3434 \layout Standard 3435 3436 \end_inset 3437 </cell> 3438 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3439 \begin_inset Text 3440 3441 \layout Standard 3442 3443 \end_inset 3444 </cell> 3445 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3446 \begin_inset Text 3447 3448 \layout Standard 3449 3450 \end_inset 3451 </cell> 3452 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3453 \begin_inset Text 3454 3455 \layout Standard 3456 3457 \end_inset 3458 </cell> 3459 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3460 \begin_inset Text 3461 3462 \layout Standard 3463 3464 Convert value of type <?> to float 3465 \end_inset 3466 </cell> 3467 </row> 3468 <row topline="true" bottomline="false" newpage="false"> 3469 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3470 \begin_inset Text 3471 3472 \layout Standard 3473 3474 ?2l 3475 \end_inset 3476 </cell> 3477 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3478 \begin_inset Text 3479 3480 \layout Standard 3481 3482 X 3483 \end_inset 3484 </cell> 3485 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3486 \begin_inset Text 3487 3488 \layout Standard 3489 3490 \end_inset 3491 </cell> 3492 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3493 \begin_inset Text 3494 3495 \layout Standard 3496 3497 X 3498 \end_inset 3499 </cell> 3500 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3501 \begin_inset Text 3502 3503 \layout Standard 3504 3505 X 3506 \end_inset 3507 </cell> 3508 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3509 \begin_inset Text 3510 3511 \layout Standard 3512 3513 \end_inset 3514 </cell> 3515 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3516 \begin_inset Text 3517 3518 \layout Standard 3519 3520 \end_inset 3521 </cell> 3522 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3523 \begin_inset Text 3524 3525 \layout Standard 3526 3527 \end_inset 3528 </cell> 3529 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3530 \begin_inset Text 3531 3532 \layout Standard 3533 3534 \end_inset 3535 </cell> 3536 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3537 \begin_inset Text 3538 3539 \layout Standard 3540 3541 Convert value of type <?> to long 3542 \end_inset 3543 </cell> 3544 </row> 3545 <row topline="true" bottomline="false" newpage="false"> 3546 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3547 \begin_inset Text 3548 3549 \layout Standard 3550 3551 ?2s 3552 \end_inset 3553 </cell> 3554 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3555 \begin_inset Text 3556 3557 \layout Standard 3558 3559 X 3560 \end_inset 3561 </cell> 3562 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3563 \begin_inset Text 3564 3565 \layout Standard 3566 3567 \end_inset 3568 </cell> 3569 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3570 \begin_inset Text 3571 3572 \layout Standard 3573 3574 \end_inset 3575 </cell> 3576 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3577 \begin_inset Text 3578 3579 \layout Standard 3580 3581 \end_inset 3582 </cell> 3583 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3584 \begin_inset Text 3585 3586 \layout Standard 3587 3588 \end_inset 3589 </cell> 3590 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3591 \begin_inset Text 3592 3593 \layout Standard 3594 3595 \end_inset 3596 </cell> 3597 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3598 \begin_inset Text 3599 3600 \layout Standard 3601 3602 \end_inset 3603 </cell> 3604 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3605 \begin_inset Text 3606 3607 \layout Standard 3608 3609 \end_inset 3610 </cell> 3611 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3612 \begin_inset Text 3613 3614 \layout Standard 3615 3616 Convert value of type <?> to short 3617 \end_inset 3618 </cell> 3619 </row> 3620 <row topline="true" bottomline="false" newpage="false"> 3621 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3622 \begin_inset Text 3623 3624 \layout Standard 3625 3626 ?add 3627 \end_inset 3628 </cell> 3629 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3630 \begin_inset Text 3631 3632 \layout Standard 3633 3634 X 3635 \end_inset 3636 </cell> 3637 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3638 \begin_inset Text 3639 3640 \layout Standard 3641 3642 X 3643 \end_inset 3644 </cell> 3645 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3646 \begin_inset Text 3647 3648 \layout Standard 3649 3650 X 3651 \end_inset 3652 </cell> 3653 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3654 \begin_inset Text 3655 3656 \layout Standard 3657 3658 X 3659 \end_inset 3660 </cell> 3661 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3662 \begin_inset Text 3663 3664 \layout Standard 3665 3666 \end_inset 3667 </cell> 3668 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3669 \begin_inset Text 3670 3671 \layout Standard 3672 3673 \end_inset 3674 </cell> 3675 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3676 \begin_inset Text 3677 3678 \layout Standard 3679 3680 \end_inset 3681 </cell> 3682 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3683 \begin_inset Text 3684 3685 \layout Standard 3686 3687 \end_inset 3688 </cell> 3689 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3690 \begin_inset Text 3691 3692 \layout Standard 3693 3694 Add two values of type <?> 3695 \end_inset 3696 </cell> 3697 </row> 3698 <row topline="true" bottomline="false" newpage="false"> 3699 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3700 \begin_inset Text 3701 3702 \layout Standard 3703 3704 ?aload 3705 \end_inset 3706 </cell> 3707 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3708 \begin_inset Text 3709 3710 \layout Standard 3711 3712 X 3713 \end_inset 3714 </cell> 3715 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3716 \begin_inset Text 3717 3718 \layout Standard 3719 3720 X 3721 \end_inset 3722 </cell> 3723 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3724 \begin_inset Text 3725 3726 \layout Standard 3727 3728 X 3729 \end_inset 3730 </cell> 3731 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3732 \begin_inset Text 3733 3734 \layout Standard 3735 3736 X 3737 \end_inset 3738 </cell> 3739 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3740 \begin_inset Text 3741 3742 \layout Standard 3743 3744 X 3745 \end_inset 3746 </cell> 3747 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3748 \begin_inset Text 3749 3750 \layout Standard 3751 3752 X 3753 \end_inset 3754 </cell> 3755 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3756 \begin_inset Text 3757 3758 \layout Standard 3759 3760 X 3761 \end_inset 3762 </cell> 3763 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3764 \begin_inset Text 3765 3766 \layout Standard 3767 3768 X 3769 \end_inset 3770 </cell> 3771 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3772 \begin_inset Text 3773 3774 \layout Standard 3775 3776 Push an element of type <?> from an array onto the stack 3777 \end_inset 3778 </cell> 3779 </row> 3780 <row topline="true" bottomline="false" newpage="false"> 3781 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3782 \begin_inset Text 3783 3784 \layout Standard 3785 3786 ?and 3787 \end_inset 3788 </cell> 3789 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3790 \begin_inset Text 3791 3792 \layout Standard 3793 3794 X 3795 \end_inset 3796 </cell> 3797 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3798 \begin_inset Text 3799 3800 \layout Standard 3801 3802 X 3803 \end_inset 3804 </cell> 3805 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3806 \begin_inset Text 3807 3808 \layout Standard 3809 3810 \end_inset 3811 </cell> 3812 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3813 \begin_inset Text 3814 3815 \layout Standard 3816 3817 \end_inset 3818 </cell> 3819 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3820 \begin_inset Text 3821 3822 \layout Standard 3823 3824 \end_inset 3825 </cell> 3826 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3827 \begin_inset Text 3828 3829 \layout Standard 3830 3831 \end_inset 3832 </cell> 3833 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3834 \begin_inset Text 3835 3836 \layout Standard 3837 3838 \end_inset 3839 </cell> 3840 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3841 \begin_inset Text 3842 3843 \layout Standard 3844 3845 \end_inset 3846 </cell> 3847 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3848 \begin_inset Text 3849 3850 \layout Standard 3851 3852 Perform logical AND on two values of type <?> 3853 \end_inset 3854 </cell> 3855 </row> 3856 <row topline="true" bottomline="false" newpage="false"> 3857 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3858 \begin_inset Text 3859 3860 \layout Standard 3861 3862 ?astore 3863 \end_inset 3864 </cell> 3865 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3866 \begin_inset Text 3867 3868 \layout Standard 3869 3870 X 3871 \end_inset 3872 </cell> 3873 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3874 \begin_inset Text 3875 3876 \layout Standard 3877 3878 X 3879 \end_inset 3880 </cell> 3881 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3882 \begin_inset Text 3883 3884 \layout Standard 3885 3886 X 3887 \end_inset 3888 </cell> 3889 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3890 \begin_inset Text 3891 3892 \layout Standard 3893 3894 X 3895 \end_inset 3896 </cell> 3897 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3898 \begin_inset Text 3899 3900 \layout Standard 3901 3902 X 3903 \end_inset 3904 </cell> 3905 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3906 \begin_inset Text 3907 3908 \layout Standard 3909 3910 X 3911 \end_inset 3912 </cell> 3913 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3914 \begin_inset Text 3915 3916 \layout Standard 3917 3918 X 3919 \end_inset 3920 </cell> 3921 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3922 \begin_inset Text 3923 3924 \layout Standard 3925 3926 X 3927 \end_inset 3928 </cell> 3929 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 3930 \begin_inset Text 3931 3932 \layout Standard 3933 3934 Pop an element of type <?> from the stack and store it in an array of type 3935 <?> 3936 \end_inset 3937 </cell> 3938 </row> 3939 <row topline="true" bottomline="false" newpage="false"> 3940 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3941 \begin_inset Text 3942 3943 \layout Standard 3944 3945 ?cmp 3946 \end_inset 3947 </cell> 3948 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3949 \begin_inset Text 3950 3951 \layout Standard 3952 3953 \end_inset 3954 </cell> 3955 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3956 \begin_inset Text 3957 3958 \layout Standard 3959 3960 X 3961 \end_inset 3962 </cell> 3963 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3964 \begin_inset Text 3965 3966 \layout Standard 3967 3968 \end_inset 3969 </cell> 3970 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3971 \begin_inset Text 3972 3973 \layout Standard 3974 3975 \end_inset 3976 </cell> 3977 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3978 \begin_inset Text 3979 3980 \layout Standard 3981 3982 \end_inset 3983 </cell> 3984 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3985 \begin_inset Text 3986 3987 \layout Standard 3988 3989 \end_inset 3990 </cell> 3991 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3992 \begin_inset Text 3993 3994 \layout Standard 3995 3996 \end_inset 3997 </cell> 3998 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 3999 \begin_inset Text 4000 4001 \layout Standard 4002 4003 \end_inset 4004 </cell> 4005 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4006 \begin_inset Text 4007 4008 \layout Standard 4009 4010 Compare two long values. 4011 If they are equal push 0, if the first is greater push 1, else push -1 4012 \end_inset 4013 </cell> 4014 </row> 4015 <row topline="true" bottomline="false" newpage="false"> 4016 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4017 \begin_inset Text 4018 4019 \layout Standard 4020 4021 ?cmpg 4022 \end_inset 4023 </cell> 4024 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4025 \begin_inset Text 4026 4027 \layout Standard 4028 4029 \end_inset 4030 </cell> 4031 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4032 \begin_inset Text 4033 4034 \layout Standard 4035 4036 \end_inset 4037 </cell> 4038 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4039 \begin_inset Text 4040 4041 \layout Standard 4042 4043 X 4044 \end_inset 4045 </cell> 4046 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4047 \begin_inset Text 4048 4049 \layout Standard 4050 4051 X 4052 \end_inset 4053 </cell> 4054 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4055 \begin_inset Text 4056 4057 \layout Standard 4058 4059 \end_inset 4060 </cell> 4061 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4062 \begin_inset Text 4063 4064 \layout Standard 4065 4066 \end_inset 4067 </cell> 4068 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4069 \begin_inset Text 4070 4071 \layout Standard 4072 4073 \end_inset 4074 </cell> 4075 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4076 \begin_inset Text 4077 4078 \layout Standard 4079 4080 \end_inset 4081 </cell> 4082 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4083 \begin_inset Text 4084 4085 \layout Standard 4086 4087 Compare two IEEE values of type <?> from the stack. 4088 If they are equal push 0, if the first is greater push 1, if the second 4089 is greater push -1. 4090 If either is NaN (not a number) push 1 4091 \end_inset 4092 </cell> 4093 </row> 4094 <row topline="true" bottomline="false" newpage="false"> 4095 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4096 \begin_inset Text 4097 4098 \layout Standard 4099 4100 ?cmpl 4101 \end_inset 4102 </cell> 4103 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4104 \begin_inset Text 4105 4106 \layout Standard 4107 4108 \end_inset 4109 </cell> 4110 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4111 \begin_inset Text 4112 4113 \layout Standard 4114 4115 \end_inset 4116 </cell> 4117 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4118 \begin_inset Text 4119 4120 \layout Standard 4121 4122 X 4123 \end_inset 4124 </cell> 4125 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4126 \begin_inset Text 4127 4128 \layout Standard 4129 4130 X 4131 \end_inset 4132 </cell> 4133 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4134 \begin_inset Text 4135 4136 \layout Standard 4137 4138 \end_inset 4139 </cell> 4140 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4141 \begin_inset Text 4142 4143 \layout Standard 4144 4145 \end_inset 4146 </cell> 4147 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4148 \begin_inset Text 4149 4150 \layout Standard 4151 4152 \end_inset 4153 </cell> 4154 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4155 \begin_inset Text 4156 4157 \layout Standard 4158 4159 \end_inset 4160 </cell> 4161 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4162 \begin_inset Text 4163 4164 \layout Standard 4165 4166 Compare two IEEE values of type <?> from the stack. 4167 If they are equal push 0, if the first is greater push 1, if the second 4168 is greater push -1. 4169 If either is NaN (not a number) push -1 4170 \end_inset 4171 </cell> 4172 </row> 4173 <row topline="true" bottomline="false" newpage="false"> 4174 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4175 \begin_inset Text 4176 4177 \layout Standard 4178 4179 ?const 4180 \end_inset 4181 </cell> 4182 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4183 \begin_inset Text 4184 4185 \layout Standard 4186 4187 X 4188 \end_inset 4189 </cell> 4190 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4191 \begin_inset Text 4192 4193 \layout Standard 4194 4195 X 4196 \end_inset 4197 </cell> 4198 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4199 \begin_inset Text 4200 4201 \layout Standard 4202 4203 X 4204 \end_inset 4205 </cell> 4206 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4207 \begin_inset Text 4208 4209 \layout Standard 4210 4211 X 4212 \end_inset 4213 </cell> 4214 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4215 \begin_inset Text 4216 4217 \layout Standard 4218 4219 \end_inset 4220 </cell> 4221 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4222 \begin_inset Text 4223 4224 \layout Standard 4225 4226 \end_inset 4227 </cell> 4228 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4229 \begin_inset Text 4230 4231 \layout Standard 4232 4233 \end_inset 4234 </cell> 4235 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4236 \begin_inset Text 4237 4238 \layout Standard 4239 4240 X 4241 \end_inset 4242 </cell> 4243 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4244 \begin_inset Text 4245 4246 \layout Standard 4247 4248 Push a constant value of type <?> onto the stack 4249 \end_inset 4250 </cell> 4251 </row> 4252 <row topline="true" bottomline="false" newpage="false"> 4253 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4254 \begin_inset Text 4255 4256 \layout Standard 4257 4258 ?div 4259 \end_inset 4260 </cell> 4261 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4262 \begin_inset Text 4263 4264 \layout Standard 4265 4266 X 4267 \end_inset 4268 </cell> 4269 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4270 \begin_inset Text 4271 4272 \layout Standard 4273 4274 X 4275 \end_inset 4276 </cell> 4277 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4278 \begin_inset Text 4279 4280 \layout Standard 4281 4282 X 4283 \end_inset 4284 </cell> 4285 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4286 \begin_inset Text 4287 4288 \layout Standard 4289 4290 X 4291 \end_inset 4292 </cell> 4293 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4294 \begin_inset Text 4295 4296 \layout Standard 4297 4298 \end_inset 4299 </cell> 4300 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4301 \begin_inset Text 4302 4303 \layout Standard 4304 4305 \end_inset 4306 </cell> 4307 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4308 \begin_inset Text 4309 4310 \layout Standard 4311 4312 \end_inset 4313 </cell> 4314 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4315 \begin_inset Text 4316 4317 \layout Standard 4318 4319 \end_inset 4320 </cell> 4321 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4322 \begin_inset Text 4323 4324 \layout Standard 4325 4326 Perform a division using two values of type <?> and push the quotient onto 4327 the stack 4328 \end_inset 4329 </cell> 4330 </row> 4331 <row topline="true" bottomline="false" newpage="false"> 4332 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4333 \begin_inset Text 4334 4335 \layout Standard 4336 4337 ?inc 4338 \end_inset 4339 </cell> 4340 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4341 \begin_inset Text 4342 4343 \layout Standard 4344 4345 X 4346 \end_inset 4347 </cell> 4348 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4349 \begin_inset Text 4350 4351 \layout Standard 4352 4353 \end_inset 4354 </cell> 4355 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4356 \begin_inset Text 4357 4358 \layout Standard 4359 4360 \end_inset 4361 </cell> 4362 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4363 \begin_inset Text 4364 4365 \layout Standard 4366 4367 \end_inset 4368 </cell> 4369 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4370 \begin_inset Text 4371 4372 \layout Standard 4373 4374 \end_inset 4375 </cell> 4376 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4377 \begin_inset Text 4378 4379 \layout Standard 4380 4381 \end_inset 4382 </cell> 4383 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4384 \begin_inset Text 4385 4386 \layout Standard 4387 4388 \end_inset 4389 </cell> 4390 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4391 \begin_inset Text 4392 4393 \layout Standard 4394 4395 \end_inset 4396 </cell> 4397 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4398 \begin_inset Text 4399 4400 \layout Standard 4401 4402 Increment the top of the stack (possibly by a negative value) 4403 \end_inset 4404 </cell> 4405 </row> 4406 <row topline="true" bottomline="false" newpage="false"> 4407 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4408 \begin_inset Text 4409 4410 \layout Standard 4411 4412 ?ipush 4413 \end_inset 4414 </cell> 4415 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4416 \begin_inset Text 4417 4418 \layout Standard 4419 4420 \end_inset 4421 </cell> 4422 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4423 \begin_inset Text 4424 4425 \layout Standard 4426 4427 \end_inset 4428 </cell> 4429 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4430 \begin_inset Text 4431 4432 \layout Standard 4433 4434 \end_inset 4435 </cell> 4436 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4437 \begin_inset Text 4438 4439 \layout Standard 4440 4441 \end_inset 4442 </cell> 4443 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4444 \begin_inset Text 4445 4446 \layout Standard 4447 4448 X 4449 \end_inset 4450 </cell> 4451 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4452 \begin_inset Text 4453 4454 \layout Standard 4455 4456 \end_inset 4457 </cell> 4458 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4459 \begin_inset Text 4460 4461 \layout Standard 4462 4463 X 4464 \end_inset 4465 </cell> 4466 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4467 \begin_inset Text 4468 4469 \layout Standard 4470 4471 \end_inset 4472 </cell> 4473 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4474 \begin_inset Text 4475 4476 \layout Standard 4477 4478 Push a sign extended byte or short value onto the stack 4479 \end_inset 4480 </cell> 4481 </row> 4482 <row topline="true" bottomline="false" newpage="false"> 4483 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4484 \begin_inset Text 4485 4486 \layout Standard 4487 4488 ?load 4489 \end_inset 4490 </cell> 4491 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4492 \begin_inset Text 4493 4494 \layout Standard 4495 4496 X 4497 \end_inset 4498 </cell> 4499 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4500 \begin_inset Text 4501 4502 \layout Standard 4503 4504 X 4505 \end_inset 4506 </cell> 4507 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4508 \begin_inset Text 4509 4510 \layout Standard 4511 4512 X 4513 \end_inset 4514 </cell> 4515 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4516 \begin_inset Text 4517 4518 \layout Standard 4519 4520 X 4521 \end_inset 4522 </cell> 4523 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4524 \begin_inset Text 4525 4526 \layout Standard 4527 4528 \end_inset 4529 </cell> 4530 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4531 \begin_inset Text 4532 4533 \layout Standard 4534 4535 \end_inset 4536 </cell> 4537 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4538 \begin_inset Text 4539 4540 \layout Standard 4541 4542 \end_inset 4543 </cell> 4544 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4545 \begin_inset Text 4546 4547 \layout Standard 4548 4549 \end_inset 4550 </cell> 4551 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4552 \begin_inset Text 4553 4554 \layout Standard 4555 4556 Push a value of type <?> from a local variable onto the stack 4557 \end_inset 4558 </cell> 4559 </row> 4560 <row topline="true" bottomline="false" newpage="false"> 4561 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4562 \begin_inset Text 4563 4564 \layout Standard 4565 4566 ?mul 4567 \end_inset 4568 </cell> 4569 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4570 \begin_inset Text 4571 4572 \layout Standard 4573 4574 X 4575 \end_inset 4576 </cell> 4577 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4578 \begin_inset Text 4579 4580 \layout Standard 4581 4582 X 4583 \end_inset 4584 </cell> 4585 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4586 \begin_inset Text 4587 4588 \layout Standard 4589 4590 X 4591 \end_inset 4592 </cell> 4593 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4594 \begin_inset Text 4595 4596 \layout Standard 4597 4598 X 4599 \end_inset 4600 </cell> 4601 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4602 \begin_inset Text 4603 4604 \layout Standard 4605 4606 \end_inset 4607 </cell> 4608 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4609 \begin_inset Text 4610 4611 \layout Standard 4612 4613 \end_inset 4614 </cell> 4615 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4616 \begin_inset Text 4617 4618 \layout Standard 4619 4620 \end_inset 4621 </cell> 4622 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4623 \begin_inset Text 4624 4625 \layout Standard 4626 4627 \end_inset 4628 </cell> 4629 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4630 \begin_inset Text 4631 4632 \layout Standard 4633 4634 Perform multiplication of two values of type <?> 4635 \end_inset 4636 </cell> 4637 </row> 4638 <row topline="true" bottomline="false" newpage="false"> 4639 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4640 \begin_inset Text 4641 4642 \layout Standard 4643 4644 ?neg 4645 \end_inset 4646 </cell> 4647 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4648 \begin_inset Text 4649 4650 \layout Standard 4651 4652 X 4653 \end_inset 4654 </cell> 4655 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4656 \begin_inset Text 4657 4658 \layout Standard 4659 4660 X 4661 \end_inset 4662 </cell> 4663 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4664 \begin_inset Text 4665 4666 \layout Standard 4667 4668 X 4669 \end_inset 4670 </cell> 4671 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4672 \begin_inset Text 4673 4674 \layout Standard 4675 4676 X 4677 \end_inset 4678 </cell> 4679 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4680 \begin_inset Text 4681 4682 \layout Standard 4683 4684 \end_inset 4685 </cell> 4686 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4687 \begin_inset Text 4688 4689 \layout Standard 4690 4691 \end_inset 4692 </cell> 4693 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4694 \begin_inset Text 4695 4696 \layout Standard 4697 4698 \end_inset 4699 </cell> 4700 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4701 \begin_inset Text 4702 4703 \layout Standard 4704 4705 \end_inset 4706 </cell> 4707 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4708 \begin_inset Text 4709 4710 \layout Standard 4711 4712 Negate a value of type <?> 4713 \end_inset 4714 </cell> 4715 </row> 4716 <row topline="true" bottomline="false" newpage="false"> 4717 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4718 \begin_inset Text 4719 4720 \layout Standard 4721 4722 ?newarray 4723 \end_inset 4724 </cell> 4725 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4726 \begin_inset Text 4727 4728 \layout Standard 4729 4730 \end_inset 4731 </cell> 4732 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4733 \begin_inset Text 4734 4735 \layout Standard 4736 4737 \end_inset 4738 </cell> 4739 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4740 \begin_inset Text 4741 4742 \layout Standard 4743 4744 \end_inset 4745 </cell> 4746 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4747 \begin_inset Text 4748 4749 \layout Standard 4750 4751 \end_inset 4752 </cell> 4753 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4754 \begin_inset Text 4755 4756 \layout Standard 4757 4758 \end_inset 4759 </cell> 4760 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4761 \begin_inset Text 4762 4763 \layout Standard 4764 4765 \end_inset 4766 </cell> 4767 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4768 \begin_inset Text 4769 4770 \layout Standard 4771 4772 \end_inset 4773 </cell> 4774 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4775 \begin_inset Text 4776 4777 \layout Standard 4778 4779 X 4780 \end_inset 4781 </cell> 4782 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4783 \begin_inset Text 4784 4785 \layout Standard 4786 4787 Create a new array of object references 4788 \end_inset 4789 </cell> 4790 </row> 4791 <row topline="true" bottomline="false" newpage="false"> 4792 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4793 \begin_inset Text 4794 4795 \layout Standard 4796 4797 ?or 4798 \end_inset 4799 </cell> 4800 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4801 \begin_inset Text 4802 4803 \layout Standard 4804 4805 X 4806 \end_inset 4807 </cell> 4808 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4809 \begin_inset Text 4810 4811 \layout Standard 4812 4813 X 4814 \end_inset 4815 </cell> 4816 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4817 \begin_inset Text 4818 4819 \layout Standard 4820 4821 \end_inset 4822 </cell> 4823 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4824 \begin_inset Text 4825 4826 \layout Standard 4827 4828 \end_inset 4829 </cell> 4830 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4831 \begin_inset Text 4832 4833 \layout Standard 4834 4835 \end_inset 4836 </cell> 4837 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4838 \begin_inset Text 4839 4840 \layout Standard 4841 4842 \end_inset 4843 </cell> 4844 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4845 \begin_inset Text 4846 4847 \layout Standard 4848 4849 \end_inset 4850 </cell> 4851 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4852 \begin_inset Text 4853 4854 \layout Standard 4855 4856 \end_inset 4857 </cell> 4858 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4859 \begin_inset Text 4860 4861 \layout Standard 4862 4863 Perform logical OR on two values of type <?> 4864 \end_inset 4865 </cell> 4866 </row> 4867 <row topline="true" bottomline="false" newpage="false"> 4868 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4869 \begin_inset Text 4870 4871 \layout Standard 4872 4873 ?rem 4874 \end_inset 4875 </cell> 4876 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4877 \begin_inset Text 4878 4879 \layout Standard 4880 4881 X 4882 \end_inset 4883 </cell> 4884 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4885 \begin_inset Text 4886 4887 \layout Standard 4888 4889 X 4890 \end_inset 4891 </cell> 4892 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4893 \begin_inset Text 4894 4895 \layout Standard 4896 4897 X 4898 \end_inset 4899 </cell> 4900 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4901 \begin_inset Text 4902 4903 \layout Standard 4904 4905 X 4906 \end_inset 4907 </cell> 4908 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4909 \begin_inset Text 4910 4911 \layout Standard 4912 4913 \end_inset 4914 </cell> 4915 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4916 \begin_inset Text 4917 4918 \layout Standard 4919 4920 \end_inset 4921 </cell> 4922 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4923 \begin_inset Text 4924 4925 \layout Standard 4926 4927 \end_inset 4928 </cell> 4929 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4930 \begin_inset Text 4931 4932 \layout Standard 4933 4934 \end_inset 4935 </cell> 4936 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 4937 \begin_inset Text 4938 4939 \layout Standard 4940 4941 Perform a division using two values of type <?> and push the remainder onto 4942 the stack 4943 \end_inset 4944 </cell> 4945 </row> 4946 <row topline="true" bottomline="false" newpage="false"> 4947 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4948 \begin_inset Text 4949 4950 \layout Standard 4951 4952 ?return 4953 \end_inset 4954 </cell> 4955 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4956 \begin_inset Text 4957 4958 \layout Standard 4959 4960 X 4961 \end_inset 4962 </cell> 4963 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4964 \begin_inset Text 4965 4966 \layout Standard 4967 4968 X 4969 \end_inset 4970 </cell> 4971 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4972 \begin_inset Text 4973 4974 \layout Standard 4975 4976 X 4977 \end_inset 4978 </cell> 4979 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4980 \begin_inset Text 4981 4982 \layout Standard 4983 4984 X 4985 \end_inset 4986 </cell> 4987 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4988 \begin_inset Text 4989 4990 \layout Standard 4991 4992 \end_inset 4993 </cell> 4994 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 4995 \begin_inset Text 4996 4997 \layout Standard 4998 4999 \end_inset 5000 </cell> 5001 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5002 \begin_inset Text 5003 5004 \layout Standard 5005 5006 \end_inset 5007 </cell> 5008 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5009 \begin_inset Text 5010 5011 \layout Standard 5012 5013 X 5014 \end_inset 5015 </cell> 5016 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5017 \begin_inset Text 5018 5019 \layout Standard 5020 5021 Return a value of type <?> to the invoking method 5022 \end_inset 5023 </cell> 5024 </row> 5025 <row topline="true" bottomline="false" newpage="false"> 5026 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5027 \begin_inset Text 5028 5029 \layout Standard 5030 5031 ?shl 5032 \end_inset 5033 </cell> 5034 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5035 \begin_inset Text 5036 5037 \layout Standard 5038 5039 X 5040 \end_inset 5041 </cell> 5042 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5043 \begin_inset Text 5044 5045 \layout Standard 5046 5047 X 5048 \end_inset 5049 </cell> 5050 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5051 \begin_inset Text 5052 5053 \layout Standard 5054 5055 \end_inset 5056 </cell> 5057 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5058 \begin_inset Text 5059 5060 \layout Standard 5061 5062 \end_inset 5063 </cell> 5064 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5065 \begin_inset Text 5066 5067 \layout Standard 5068 5069 \end_inset 5070 </cell> 5071 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5072 \begin_inset Text 5073 5074 \layout Standard 5075 5076 \end_inset 5077 </cell> 5078 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5079 \begin_inset Text 5080 5081 \layout Standard 5082 5083 \end_inset 5084 </cell> 5085 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5086 \begin_inset Text 5087 5088 \layout Standard 5089 5090 \end_inset 5091 </cell> 5092 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5093 \begin_inset Text 5094 5095 \layout Standard 5096 5097 Perform arithmetic shift left on a value of type <?> 5098 \end_inset 5099 </cell> 5100 </row> 5101 <row topline="true" bottomline="false" newpage="false"> 5102 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5103 \begin_inset Text 5104 5105 \layout Standard 5106 5107 ?shr 5108 \end_inset 5109 </cell> 5110 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5111 \begin_inset Text 5112 5113 \layout Standard 5114 5115 X 5116 \end_inset 5117 </cell> 5118 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5119 \begin_inset Text 5120 5121 \layout Standard 5122 5123 X 5124 \end_inset 5125 </cell> 5126 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5127 \begin_inset Text 5128 5129 \layout Standard 5130 5131 \end_inset 5132 </cell> 5133 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5134 \begin_inset Text 5135 5136 \layout Standard 5137 5138 \end_inset 5139 </cell> 5140 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5141 \begin_inset Text 5142 5143 \layout Standard 5144 5145 \end_inset 5146 </cell> 5147 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5148 \begin_inset Text 5149 5150 \layout Standard 5151 5152 \end_inset 5153 </cell> 5154 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5155 \begin_inset Text 5156 5157 \layout Standard 5158 5159 \end_inset 5160 </cell> 5161 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5162 \begin_inset Text 5163 5164 \layout Standard 5165 5166 \end_inset 5167 </cell> 5168 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5169 \begin_inset Text 5170 5171 \layout Standard 5172 5173 Perform arithmetic shift right on a value of type <?> 5174 \end_inset 5175 </cell> 5176 </row> 5177 <row topline="true" bottomline="false" newpage="false"> 5178 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5179 \begin_inset Text 5180 5181 \layout Standard 5182 5183 ?store 5184 \end_inset 5185 </cell> 5186 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5187 \begin_inset Text 5188 5189 \layout Standard 5190 5191 X 5192 \end_inset 5193 </cell> 5194 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5195 \begin_inset Text 5196 5197 \layout Standard 5198 5199 X 5200 \end_inset 5201 </cell> 5202 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5203 \begin_inset Text 5204 5205 \layout Standard 5206 5207 X 5208 \end_inset 5209 </cell> 5210 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5211 \begin_inset Text 5212 5213 \layout Standard 5214 5215 X 5216 \end_inset 5217 </cell> 5218 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5219 \begin_inset Text 5220 5221 \layout Standard 5222 5223 \end_inset 5224 </cell> 5225 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5226 \begin_inset Text 5227 5228 \layout Standard 5229 5230 \end_inset 5231 </cell> 5232 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5233 \begin_inset Text 5234 5235 \layout Standard 5236 5237 \end_inset 5238 </cell> 5239 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5240 \begin_inset Text 5241 5242 \layout Standard 5243 5244 X 5245 \end_inset 5246 </cell> 5247 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5248 \begin_inset Text 5249 5250 \layout Standard 5251 5252 Pop a value of type <?> and store it into a local variable 5253 \end_inset 5254 </cell> 5255 </row> 5256 <row topline="true" bottomline="true" newpage="false"> 5257 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5258 \begin_inset Text 5259 5260 \layout Standard 5261 5262 ?sub 5263 \end_inset 5264 </cell> 5265 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5266 \begin_inset Text 5267 5268 \layout Standard 5269 5270 X 5271 \end_inset 5272 </cell> 5273 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5274 \begin_inset Text 5275 5276 \layout Standard 5277 5278 X 5279 \end_inset 5280 </cell> 5281 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5282 \begin_inset Text 5283 5284 \layout Standard 5285 5286 X 5287 \end_inset 5288 </cell> 5289 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5290 \begin_inset Text 5291 5292 \layout Standard 5293 5294 X 5295 \end_inset 5296 </cell> 5297 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5298 \begin_inset Text 5299 5300 \layout Standard 5301 5302 \end_inset 5303 </cell> 5304 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5305 \begin_inset Text 5306 5307 \layout Standard 5308 5309 \end_inset 5310 </cell> 5311 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5312 \begin_inset Text 5313 5314 \layout Standard 5315 5316 \end_inset 5317 </cell> 5318 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special=""> 5319 \begin_inset Text 5320 5321 \layout Standard 5322 5323 \end_inset 5324 </cell> 5325 <cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special=""> 5326 \begin_inset Text 5327 5328 \layout Standard 5329 5330 Perform a subtraction using two values of type <?> 5331 \end_inset 5332 </cell> 5333 </row> 5334 </lyxtabular> 5335 5336 \end_inset 5337 5338 5339 \layout Standard 5340 5341 The opcode names are mostly self-explanatory. 5342 In this paper, all bytecode is commented to support the intuitive understanding. 5343 Algorithms 5344 \begin_inset LatexCommand \ref{facjavapl} 5345 5346 \end_inset 5347 5348 and 5349 \begin_inset LatexCommand \ref{facjavabytecode} 5350 5351 \end_inset 5352 5353 show an example bytecode taken from 5354 \begin_inset LatexCommand \cite{BCEL98} 5355 5356 \end_inset 5357 5358 . 5359 It implements the well-known faculty function. 5360 To understand this example, it is important to know that method arguments 5361 are stored into the local variables of a newly created execution frame 5362 upon method invocation. 5363 \layout Standard 5364 5365 \begin_float alg 5366 \layout Caption 5367 5368 5369 \begin_inset LatexCommand \label{facjavapl} 5370 5371 \end_inset 5372 5373 Methed 5374 \emph on 5375 fac 5376 \emph default 5377 in a class 5378 \emph on 5379 Faculty 5380 \emph default 5381 , Java programming language version 5382 \layout Standard 5383 5384 5385 \family typewriter 5386 public static final int fac(int n){ 5387 \layout Standard 5388 5389 5390 \family typewriter 5391 \SpecialChar ~ 5392 \SpecialChar ~ 5393 return (n==0)?1:n*fac(n-1); 5394 \layout Standard 5395 5396 5397 \family typewriter 5398 } 5399 \end_float 5400 \layout Standard 5401 5402 \begin_float alg 5403 \layout Caption 5404 5405 5406 \begin_inset LatexCommand \label{facjavabytecode} 5407 5408 \end_inset 5409 5410 Method 5411 \emph on 5412 fac 5413 \emph default 5414 in a class 5415 \emph on 5416 Faculty 5417 \emph default 5418 , Java bytecode version 5419 \layout Standard 5420 5421 5422 \family typewriter 5423 \size footnotesize 5424 Faculty.fac (I)I 5425 \layout Standard 5426 5427 5428 \family typewriter 5429 \size footnotesize 5430 0:\SpecialChar ~ 5431 \SpecialChar ~ 5432 iload_0\SpecialChar ~ 5433 \SpecialChar ~ 5434 \SpecialChar ~ 5435 \SpecialChar ~ 5436 \SpecialChar ~ 5437 \SpecialChar ~ 5438 \SpecialChar ~ 5439 \SpecialChar ~ 5440 \SpecialChar ~ 5441 \SpecialChar ~ 5442 \SpecialChar ~ 5443 \SpecialChar ~ 5444 \SpecialChar ~ 5445 \SpecialChar ~ 5446 \SpecialChar ~ 5447 \SpecialChar ~ 5448 \SpecialChar ~ 5449 \SpecialChar ~ 5450 \SpecialChar ~ 5451 \SpecialChar ~ 5452 \SpecialChar ~ 5453 \SpecialChar ~ 5454 \SpecialChar ~ 5455 \SpecialChar ~ 5456 ; load argument onto stack 5457 \layout Standard 5458 5459 5460 \family typewriter 5461 \size footnotesize 5462 1:\SpecialChar ~ 5463 \SpecialChar ~ 5464 ifne #8\SpecialChar ~ 5465 \SpecialChar ~ 5466 \SpecialChar ~ 5467 \SpecialChar ~ 5468 \SpecialChar ~ 5469 \SpecialChar ~ 5470 \SpecialChar ~ 5471 \SpecialChar ~ 5472 \SpecialChar ~ 5473 \SpecialChar ~ 5474 \SpecialChar ~ 5475 \SpecialChar ~ 5476 \SpecialChar ~ 5477 \SpecialChar ~ 5478 \SpecialChar ~ 5479 \SpecialChar ~ 5480 \SpecialChar ~ 5481 \SpecialChar ~ 5482 \SpecialChar ~ 5483 \SpecialChar ~ 5484 \SpecialChar ~ 5485 \SpecialChar ~ 5486 \SpecialChar ~ 5487 \SpecialChar ~ 5488 ; non-zero? Then branch to 8. 5489 \layout Standard 5490 5491 5492 \family typewriter 5493 \size footnotesize 5494 4:\SpecialChar ~ 5495 \SpecialChar ~ 5496 iconst_1\SpecialChar ~ 5497 \SpecialChar ~ 5498 \SpecialChar ~ 5499 \SpecialChar ~ 5500 \SpecialChar ~ 5501 \SpecialChar ~ 5502 \SpecialChar ~ 5503 \SpecialChar ~ 5504 \SpecialChar ~ 5505 \SpecialChar ~ 5506 \SpecialChar ~ 5507 \SpecialChar ~ 5508 \SpecialChar ~ 5509 \SpecialChar ~ 5510 \SpecialChar ~ 5511 \SpecialChar ~ 5512 \SpecialChar ~ 5513 \SpecialChar ~ 5514 \SpecialChar ~ 5515 \SpecialChar ~ 5516 \SpecialChar ~ 5517 \SpecialChar ~ 5518 \SpecialChar ~ 5519 ; push constant 1 onto stack 5520 \layout Standard 5521 5522 5523 \family typewriter 5524 \size footnotesize 5525 5:\SpecialChar ~ 5526 \SpecialChar ~ 5527 goto #16\SpecialChar ~ 5528 \SpecialChar ~ 5529 \SpecialChar ~ 5530 \SpecialChar ~ 5531 \SpecialChar ~ 5532 \SpecialChar ~ 5533 \SpecialChar ~ 5534 \SpecialChar ~ 5535 \SpecialChar ~ 5536 \SpecialChar ~ 5537 \SpecialChar ~ 5538 \SpecialChar ~ 5539 \SpecialChar ~ 5540 \SpecialChar ~ 5541 \SpecialChar ~ 5542 \SpecialChar ~ 5543 \SpecialChar ~ 5544 \SpecialChar ~ 5545 \SpecialChar ~ 5546 \SpecialChar ~ 5547 \SpecialChar ~ 5548 \SpecialChar ~ 5549 \SpecialChar ~ 5550 ; jump to 16 5551 \layout Standard 5552 5553 5554 \family typewriter 5555 \size footnotesize 5556 8:\SpecialChar ~ 5557 \SpecialChar ~ 5558 iload_0\SpecialChar ~ 5559 \SpecialChar ~ 5560 \SpecialChar ~ 5561 \SpecialChar ~ 5562 \SpecialChar ~ 5563 \SpecialChar ~ 5564 \SpecialChar ~ 5565 \SpecialChar ~ 5566 \SpecialChar ~ 5567 \SpecialChar ~ 5568 \SpecialChar ~ 5569 \SpecialChar ~ 5570 \SpecialChar ~ 5571 \SpecialChar ~ 5572 \SpecialChar ~ 5573 \SpecialChar ~ 5574 \SpecialChar ~ 5575 \SpecialChar ~ 5576 \SpecialChar ~ 5577 \SpecialChar ~ 5578 \SpecialChar ~ 5579 \SpecialChar ~ 5580 \SpecialChar ~ 5581 \SpecialChar ~ 5582 ; load argument onto stack 5583 \layout Standard 5584 5585 5586 \family typewriter 5587 \size footnotesize 5588 9:\SpecialChar ~ 5589 \SpecialChar ~ 5590 iload_0\SpecialChar ~ 5591 \SpecialChar ~ 5592 \SpecialChar ~ 5593 \SpecialChar ~ 5594 \SpecialChar ~ 5595 \SpecialChar ~ 5596 \SpecialChar ~ 5597 \SpecialChar ~ 5598 \SpecialChar ~ 5599 \SpecialChar ~ 5600 \SpecialChar ~ 5601 \SpecialChar ~ 5602 \SpecialChar ~ 5603 \SpecialChar ~ 5604 \SpecialChar ~ 5605 \SpecialChar ~ 5606 \SpecialChar ~ 5607 \SpecialChar ~ 5608 \SpecialChar ~ 5609 \SpecialChar ~ 5610 \SpecialChar ~ 5611 \SpecialChar ~ 5612 \SpecialChar ~ 5613 \SpecialChar ~ 5614 ; load argument onto stack 5615 \layout Standard 5616 5617 5618 \family typewriter 5619 \size footnotesize 5620 10:\SpecialChar ~ 5621 iconst_1\SpecialChar ~ 5622 \SpecialChar ~ 5623 \SpecialChar ~ 5624 \SpecialChar ~ 5625 \SpecialChar ~ 5626 \SpecialChar ~ 5627 \SpecialChar ~ 5628 \SpecialChar ~ 5629 \SpecialChar ~ 5630 \SpecialChar ~ 5631 \SpecialChar ~ 5632 \SpecialChar ~ 5633 \SpecialChar ~ 5634 \SpecialChar ~ 5635 \SpecialChar ~ 5636 \SpecialChar ~ 5637 \SpecialChar ~ 5638 \SpecialChar ~ 5639 \SpecialChar ~ 5640 \SpecialChar ~ 5641 \SpecialChar ~ 5642 \SpecialChar ~ 5643 \SpecialChar ~ 5644 ; push constant 1 onto stack 5645 \layout Standard 5646 5647 5648 \family typewriter 5649 \size footnotesize 5650 11:\SpecialChar ~ 5651 isub\SpecialChar ~ 5652 \SpecialChar ~ 5653 \SpecialChar ~ 5654 \SpecialChar ~ 5655 \SpecialChar ~ 5656 \SpecialChar ~ 5657 \SpecialChar ~ 5658 \SpecialChar ~ 5659 \SpecialChar ~ 5660 \SpecialChar ~ 5661 \SpecialChar ~ 5662 \SpecialChar ~ 5663 \SpecialChar ~ 5664 \SpecialChar ~ 5665 \SpecialChar ~ 5666 \SpecialChar ~ 5667 \SpecialChar ~ 5668 \SpecialChar ~ 5669 \SpecialChar ~ 5670 \SpecialChar ~ 5671 \SpecialChar ~ 5672 \SpecialChar ~ 5673 \SpecialChar ~ 5674 \SpecialChar ~ 5675 \SpecialChar ~ 5676 \SpecialChar ~ 5677 \SpecialChar ~ 5678 ; subtract the stack top from 5679 \layout Standard 5680 5681 5682 \family typewriter 5683 \size footnotesize 5684 \SpecialChar ~ 5685 \SpecialChar ~ 5686 \SpecialChar ~ 5687 \SpecialChar ~ 5688 \SpecialChar ~ 5689 \SpecialChar ~ 5690 \SpecialChar ~ 5691 \SpecialChar ~ 5692 \SpecialChar ~ 5693 \SpecialChar ~ 5694 \SpecialChar ~ 5695 \SpecialChar ~ 5696 \SpecialChar ~ 5697 \SpecialChar ~ 5698 \SpecialChar ~ 5699 \SpecialChar ~ 5700 \SpecialChar ~ 5701 \SpecialChar ~ 5702 \SpecialChar ~ 5703 \SpecialChar ~ 5704 \SpecialChar ~ 5705 \SpecialChar ~ 5706 \SpecialChar ~ 5707 \SpecialChar ~ 5708 \SpecialChar ~ 5709 \SpecialChar ~ 5710 \SpecialChar ~ 5711 \SpecialChar ~ 5712 \SpecialChar ~ 5713 \SpecialChar ~ 5714 \SpecialChar ~ 5715 \SpecialChar ~ 5716 \SpecialChar ~ 5717 \SpecialChar ~ 5718 \SpecialChar ~ 5719 ; the stack next-to-top which becomes 5720 \layout Standard 5721 5722 5723 \family typewriter 5724 \size footnotesize 5725 \SpecialChar ~ 5726 \SpecialChar ~ 5727 \SpecialChar ~ 5728 \SpecialChar ~ 5729 \SpecialChar ~ 5730 \SpecialChar ~ 5731 \SpecialChar ~ 5732 \SpecialChar ~ 5733 \SpecialChar ~ 5734 \SpecialChar ~ 5735 \SpecialChar ~ 5736 \SpecialChar ~ 5737 \SpecialChar ~ 5738 \SpecialChar ~ 5739 \SpecialChar ~ 5740 \SpecialChar ~ 5741 \SpecialChar ~ 5742 \SpecialChar ~ 5743 \SpecialChar ~ 5744 \SpecialChar ~ 5745 \SpecialChar ~ 5746 \SpecialChar ~ 5747 \SpecialChar ~ 5748 \SpecialChar ~ 5749 \SpecialChar ~ 5750 \SpecialChar ~ 5751 \SpecialChar ~ 5752 \SpecialChar ~ 5753 \SpecialChar ~ 5754 \SpecialChar ~ 5755 \SpecialChar ~ 5756 \SpecialChar ~ 5757 \SpecialChar ~ 5758 \SpecialChar ~ 5759 \SpecialChar ~ 5760 ; the new stack top 5761 \layout Standard 5762 5763 5764 \family typewriter 5765 \size footnotesize 5766 12:\SpecialChar ~ 5767 invokestatic Faculty.fac (I)I\SpecialChar ~ 5768 \SpecialChar ~ 5769 ; call method fac recursively, 5770 \layout Standard 5771 5772 5773 \family typewriter 5774 \size footnotesize 5775 \SpecialChar ~ 5776 \SpecialChar ~ 5777 \SpecialChar ~ 5778 \SpecialChar ~ 5779 \SpecialChar ~ 5780 \SpecialChar ~ 5781 \SpecialChar ~ 5782 \SpecialChar ~ 5783 \SpecialChar ~ 5784 \SpecialChar ~ 5785 \SpecialChar ~ 5786 \SpecialChar ~ 5787 \SpecialChar ~ 5788 \SpecialChar ~ 5789 \SpecialChar ~ 5790 \SpecialChar ~ 5791 \SpecialChar ~ 5792 \SpecialChar ~ 5793 \SpecialChar ~ 5794 \SpecialChar ~ 5795 \SpecialChar ~ 5796 \SpecialChar ~ 5797 \SpecialChar ~ 5798 \SpecialChar ~ 5799 \SpecialChar ~ 5800 \SpecialChar ~ 5801 \SpecialChar ~ 5802 \SpecialChar ~ 5803 \SpecialChar ~ 5804 \SpecialChar ~ 5805 \SpecialChar ~ 5806 \SpecialChar ~ 5807 \SpecialChar ~ 5808 \SpecialChar ~ 5809 \SpecialChar ~ 5810 ; the new invocation 5811 \layout Standard 5812 5813 5814 \family typewriter 5815 \size footnotesize 5816 \SpecialChar ~ 5817 \SpecialChar ~ 5818 \SpecialChar ~ 5819 \SpecialChar ~ 5820 \SpecialChar ~ 5821 \SpecialChar ~ 5822 \SpecialChar ~ 5823 \SpecialChar ~ 5824 \SpecialChar ~ 5825 \SpecialChar ~ 5826 \SpecialChar ~ 5827 \SpecialChar ~ 5828 \SpecialChar ~ 5829 \SpecialChar ~ 5830 \SpecialChar ~ 5831 \SpecialChar ~ 5832 \SpecialChar ~ 5833 \SpecialChar ~ 5834 \SpecialChar ~ 5835 \SpecialChar ~ 5836 \SpecialChar ~ 5837 \SpecialChar ~ 5838 \SpecialChar ~ 5839 \SpecialChar ~ 5840 \SpecialChar ~ 5841 \SpecialChar ~ 5842 \SpecialChar ~ 5843 \SpecialChar ~ 5844 \SpecialChar ~ 5845 \SpecialChar ~ 5846 \SpecialChar ~ 5847 \SpecialChar ~ 5848 \SpecialChar ~ 5849 \SpecialChar ~ 5850 \SpecialChar ~ 5851 ; instance's argument is the stack top 5852 \layout Standard 5853 5854 5855 \family typewriter 5856 \size footnotesize 5857 15:\SpecialChar ~ 5858 imul\SpecialChar ~ 5859 \SpecialChar ~ 5860 \SpecialChar ~ 5861 \SpecialChar ~ 5862 \SpecialChar ~ 5863 \SpecialChar ~ 5864 \SpecialChar ~ 5865 \SpecialChar ~ 5866 \SpecialChar ~ 5867 \SpecialChar ~ 5868 \SpecialChar ~ 5869 \SpecialChar ~ 5870 \SpecialChar ~ 5871 \SpecialChar ~ 5872 \SpecialChar ~ 5873 \SpecialChar ~ 5874 \SpecialChar ~ 5875 \SpecialChar ~ 5876 \SpecialChar ~ 5877 \SpecialChar ~ 5878 \SpecialChar ~ 5879 \SpecialChar ~ 5880 \SpecialChar ~ 5881 \SpecialChar ~ 5882 \SpecialChar ~ 5883 \SpecialChar ~ 5884 \SpecialChar ~ 5885 ; multiply the return value with the 5886 \layout Standard 5887 5888 5889 \family typewriter 5890 \size footnotesize 5891 \SpecialChar ~ 5892 \SpecialChar ~ 5893 \SpecialChar ~ 5894 \SpecialChar ~ 5895 \SpecialChar ~ 5896 \SpecialChar ~ 5897 \SpecialChar ~ 5898 \SpecialChar ~ 5899 \SpecialChar ~ 5900 \SpecialChar ~ 5901 \SpecialChar ~ 5902 \SpecialChar ~ 5903 \SpecialChar ~ 5904 \SpecialChar ~ 5905 \SpecialChar ~ 5906 \SpecialChar ~ 5907 \SpecialChar ~ 5908 \SpecialChar ~ 5909 \SpecialChar ~ 5910 \SpecialChar ~ 5911 \SpecialChar ~ 5912 \SpecialChar ~ 5913 \SpecialChar ~ 5914 \SpecialChar ~ 5915 \SpecialChar ~ 5916 \SpecialChar ~ 5917 \SpecialChar ~ 5918 \SpecialChar ~ 5919 \SpecialChar ~ 5920 \SpecialChar ~ 5921 \SpecialChar ~ 5922 \SpecialChar ~ 5923 \SpecialChar ~ 5924 \SpecialChar ~ 5925 \SpecialChar ~ 5926 ; argument given to the current 5927 \layout Standard 5928 5929 5930 \family typewriter 5931 \size footnotesize 5932 \SpecialChar ~ 5933 \SpecialChar ~ 5934 \SpecialChar ~ 5935 \SpecialChar ~ 5936 \SpecialChar ~ 5937 \SpecialChar ~ 5938 \SpecialChar ~ 5939 \SpecialChar ~ 5940 \SpecialChar ~ 5941 \SpecialChar ~ 5942 \SpecialChar ~ 5943 \SpecialChar ~ 5944 \SpecialChar ~ 5945 \SpecialChar ~ 5946 \SpecialChar ~ 5947 \SpecialChar ~ 5948 \SpecialChar ~ 5949 \SpecialChar ~ 5950 \SpecialChar ~ 5951 \SpecialChar ~ 5952 \SpecialChar ~ 5953 \SpecialChar ~ 5954 \SpecialChar ~ 5955 \SpecialChar ~ 5956 \SpecialChar ~ 5957 \SpecialChar ~ 5958 \SpecialChar ~ 5959 \SpecialChar ~ 5960 \SpecialChar ~ 5961 \SpecialChar ~ 5962 \SpecialChar ~ 5963 \SpecialChar ~ 5964 \SpecialChar ~ 5965 \SpecialChar ~ 5966 \SpecialChar ~ 5967 ; invocation instance 5968 \layout Standard 5969 5970 5971 \family typewriter 5972 \size footnotesize 5973 16:\SpecialChar ~ 5974 ireturn\SpecialChar ~ 5975 \SpecialChar ~ 5976 \SpecialChar ~ 5977 \SpecialChar ~ 5978 \SpecialChar ~ 5979 \SpecialChar ~ 5980 \SpecialChar ~ 5981 \SpecialChar ~ 5982 \SpecialChar ~ 5983 \SpecialChar ~ 5984 \SpecialChar ~ 5985 \SpecialChar ~ 5986 \SpecialChar ~ 5987 \SpecialChar ~ 5988 \SpecialChar ~ 5989 \SpecialChar ~ 5990 \SpecialChar ~ 5991 \SpecialChar ~ 5992 \SpecialChar ~ 5993 \SpecialChar ~ 5994 \SpecialChar ~ 5995 \SpecialChar ~ 5996 \SpecialChar ~ 5997 \SpecialChar ~ 5998 ; return value on top of the 5999 \layout Standard 6000 6001 6002 \family typewriter 6003 \size footnotesize 6004 \SpecialChar ~ 6005 \SpecialChar ~ 6006 \SpecialChar ~ 6007 \SpecialChar ~ 6008 \SpecialChar ~ 6009 \SpecialChar ~ 6010 \SpecialChar ~ 6011 \SpecialChar ~ 6012 \SpecialChar ~ 6013 \SpecialChar ~ 6014 \SpecialChar ~ 6015 \SpecialChar ~ 6016 \SpecialChar ~ 6017 \SpecialChar ~ 6018 \SpecialChar ~ 6019 \SpecialChar ~ 6020 \SpecialChar ~ 6021 \SpecialChar ~ 6022 \SpecialChar ~ 6023 \SpecialChar ~ 6024 \SpecialChar ~ 6025 \SpecialChar ~ 6026 \SpecialChar ~ 6027 \SpecialChar ~ 6028 \SpecialChar ~ 6029 \SpecialChar ~ 6030 \SpecialChar ~ 6031 \SpecialChar ~ 6032 \SpecialChar ~ 6033 \SpecialChar ~ 6034 \SpecialChar ~ 6035 \SpecialChar ~ 6036 \SpecialChar ~ 6037 \SpecialChar ~ 6038 \SpecialChar ~ 6039 ; stack to the invoking method 6040 \end_float 6041 \layout Chapter 6042 6043 6044 \begin_inset LatexCommand \label{SpecPasses} 6045 6046 \end_inset 6047 6048 Specification of the Verification Passes 6049 \layout Standard 6050 6051 Sun describes a four-pass class file verifier in The Java Virtual Machine 6052 Specification, Second Edition 6053 \begin_inset LatexCommand \cite{vmspec2} 6054 6055 \end_inset 6056 6057 . 6058 It is not necessary to implement the verification algorithms literally; 6059 and it is not possible anyway (see section 6060 \begin_inset LatexCommand \ref{SpecSubroutines} 6061 6062 \end_inset 6063 6064 ). 6065 However, implementing a verifier with a multiple-pass architecture makes 6066 sense. 6067 It is a good thing to stay close to the specification because it is well-known 6068 throughout the bytecode engineering community. 6069 Also, the boundaries between the passes are not arbitrary. 6070 They are drawn to improve the performance of the verifiers built into JVMs. 6071 For example, classes are not verified (completely) before they are actually 6072 used but they are loaded as soon as they are referenced in a certain way. 6073 Most verifiers use the traditional multiple-pass architecture, including 6074 Kimera 6075 \begin_inset LatexCommand \cite{Kimera-WWW} 6076 6077 \end_inset 6078 6079 . 6080 Work in other directions (for instance, the one-pass-architecture proposed 6081 by Fong 6082 \begin_inset LatexCommand \cite{Fong-WWW} 6083 6084 \end_inset 6085 6086 ) did not yield lasting results. 6087 \layout Standard 6088 6089 Pass one is basically about loading a class file into the JVM in a sane 6090 way and pass two verifies that the loaded class file information is consistent. 6091 Pass three verifies that the program code is well-behaved; pass four verifies 6092 things that conceptually belong to pass three but are delayed to the run-time 6093 for performance reasons. 6094 \layout Standard 6095 6096 Sometimes implementation details are discussed in this chapter. 6097 Whenever the specification 6098 \begin_inset LatexCommand \cite{vmspec2} 6099 6100 \end_inset 6101 6102 was ambigous about some issue, the behaviour of Sun's JVM implementations 6103 was observed. 6104 The discussed details are part of the specification of the JustIce verifier. 6105 \layout Section 6106 6107 6108 \begin_inset LatexCommand \label{PassOneSpec} 6109 6110 \end_inset 6111 6112 Pass One 6113 \layout Standard 6114 6115 The first pass of the verifier is only vaguely specified. 6116 It is there to assure a class file 6117 \begin_inset Quotes eld 6118 \end_inset 6119 6120 6121 \series bold 6122 has the basic format of a class file. 6123 The first four bytes must contain the right magic number. 6124 All recognized attributes must be of the proper length. 6125 The class file must not be truncated or have any extra bytes at the end. 6126 The constant pool must not contain any superficially unrecognizable information 6127 \series default 6128 6129 \begin_inset Quotes erd 6130 \end_inset 6131 6132 ( 6133 \begin_inset LatexCommand \cite{vmspec2} 6134 6135 \end_inset 6136 6137 , page 141). 6138 \layout Standard 6139 6140 The right magic number is 0xCAFEBABE ( 6141 \begin_inset LatexCommand \cite{vmspec2} 6142 6143 \end_inset 6144 6145 , page 94), which is easy to assure. 6146 \layout Standard 6147 6148 It is not clear what 6149 \begin_inset Quotes eld 6150 \end_inset 6151 6152 superficially unrecognizable information 6153 \begin_inset Quotes erd 6154 \end_inset 6155 6156 exactly is, however. 6157 If an attribute is not known to the JVM (or verifier) implementation, it 6158 has to be ignored -- so this does not seem to be 6159 \begin_inset Quotes eld 6160 \end_inset 6161 6162 superficially unrecognizable information 6163 \begin_inset Quotes erd 6164 \end_inset 6165 6166 . 6167 Attributes that are not used cannot be detected in pass one. 6168 One would have to look at the bytecodes to decide whether an attribute 6169 is used or not (which is not the domain of pass one, but of pass three). 6170 \layout Standard 6171 6172 Observations show that most existing JVM verifiers 6173 \begin_float footnote 6174 \layout Standard 6175 6176 An example of a verifier with this behaviour is the one implemented in Sun's 6177 Solaris port of the JVM, version 1.3.0_01. 6178 \end_float 6179 ignore 6180 \begin_inset Quotes eld 6181 \end_inset 6182 6183 extra bytes at the end 6184 \begin_inset Quotes erd 6185 \end_inset 6186 6187 instead of rejecting class files bearing them. 6188 \layout Standard 6189 6190 The other two statements specify verification of the class file structure 6191 (and the structure of the attributes therein). 6192 But this is also the domain of pass two! Only by inspecting the way the 6193 JVM 6194 \emph on 6195 loads 6196 \emph default 6197 , 6198 \emph on 6199 resolves 6200 \emph default 6201 and 6202 \emph on 6203 prepares 6204 \emph default 6205 classes one will understand the precise boundary between verification passes 6206 one and two 6207 \begin_inset LatexCommand \cite{Fong-WWW} 6208 6209 \end_inset 6210 6211 . 6212 \layout Standard 6213 6214 'Being careful when loading a class file' is a good definition for pass 6215 one: the structure of the file to load is untrusted. 6216 Every implicit statement such as 6217 \begin_inset Quotes eld 6218 \end_inset 6219 6220 this attribute has a length of 1234 bytes in total 6221 \begin_inset Quotes erd 6222 \end_inset 6223 6224 is validated. 6225 \layout Standard 6226 6227 6228 \emph on 6229 Resolution 6230 \emph default 6231 is the transformation of a symbolic reference to an actual reference -- 6232 i.e., as long as there is only a symbolic reference to an entity, this entity 6233 cannot be verified at all because it has not been loaded yet. 6234 Passes two and three are performed during the 6235 \emph on 6236 resolution 6237 \emph default 6238 of a class file; while loading of the class file --pass one-- must have 6239 been performed before. 6240 6241 \emph on 6242 Resolution 6243 \emph default 6244 as such is meaningless to JustIce; the term is only used to draw the borders 6245 between the verification passes. 6246 \layout Section 6247 6248 6249 \begin_inset LatexCommand \label{SpecPassTwo} 6250 6251 \end_inset 6252 6253 Pass Two 6254 \layout Standard 6255 6256 The checks performed in pass two enforce that the following constraints 6257 are satisfied. 6258 \layout Itemize 6259 6260 Ensuring that final classes are not subclassed and that final methods are 6261 not overridden. 6262 \layout Itemize 6263 6264 Checking that every class (except 6265 \family typewriter 6266 java.lang.Object 6267 \family default 6268 ) has a direct superclass. 6269 \layout Itemize 6270 6271 Ensuring that the constant pool satisfies the documented static constraints: 6272 for example, that each 6273 \family typewriter 6274 CONSTANT_Class_info 6275 \family default 6276 structure in the constant pool contains in its 6277 \family typewriter 6278 name_index 6279 \family default 6280 item a valid constant pool index for a 6281 \family typewriter 6282 CONSTANT_Utf8_info 6283 \family default 6284 structure. 6285 \layout Itemize 6286 6287 Checking that all field references and method references in the constant 6288 pool have valid names, valid classes, and a valid type descriptor. 6289 \layout Standard 6290 6291 As Frank Yellin puts it 6292 \begin_inset LatexCommand \cite{Yellin-WWW} 6293 6294 \end_inset 6295 6296 : pass two 6297 \begin_inset Quotes eld 6298 \end_inset 6299 6300 performs all verification that can be performed without looking at the bytecodes 6301 \begin_inset Quotes erd 6302 \end_inset 6303 6304 . 6305 Also, 6306 \begin_inset Quotes eld 6307 \end_inset 6308 6309 this pass does not actually check to make sure that the given field or method 6310 really exists in the given class; nor does it check that the type signatures 6311 given refer to real classes. 6312 \begin_inset Quotes erd 6313 \end_inset 6314 6315 Note that again 6316 \emph on 6317 resolution 6318 \emph default 6319 plays an important role to create the boundary between two passes; here 6320 it is the boundary between pass two and pass three. 6321 Because linking-time verification enhances the performance of the JVM, 6322 checks that basically belong to pass two are delayed to pass three. 6323 This leads to the obvious contradiction in the sentences cited above. 6324 \layout Standard 6325 6326 This performance enhancement has an ugly side effect. 6327 Consider a reference to a method m contained in a class file C that does 6328 not exist. 6329 As long as this reference is not 6330 \emph on 6331 used 6332 \emph default 6333 , i.e., 6334 \emph on 6335 resolved 6336 \emph default 6337 , the absence of C cannot be detected. 6338 Such a reference should in the author's opinion regarded as 6339 \begin_inset Quotes eld 6340 \end_inset 6341 6342 superficially unrecognizable information 6343 \begin_inset Quotes erd 6344 \end_inset 6345 6346 (see section 6347 \begin_inset LatexCommand \ref{PassOneSpec} 6348 6349 \end_inset 6350 6351 ) and therefore be detected. 6352 \layout Standard 6353 6354 This pass has to verify the integrity of the clas file's data structures 6355 as explained in section 6356 \begin_inset LatexCommand \ref{Classfile Structure} 6357 6358 \end_inset 6359 6360 . 6361 As an example, consider the Line\SpecialChar \- 6362 Number\SpecialChar \- 6363 Table atribute. 6364 Sun did not specify there has to be exactly one 6365 \family typewriter 6366 Line\SpecialChar \- 6367 Number\SpecialChar \- 6368 Table 6369 \family default 6370 attribute (or none at all) per method, so possibly there is more than one 6371 attribute of that kind. 6372 This lax specification is not necessary due to the fact that you can put 6373 all information in a single 6374 \family typewriter 6375 Line\SpecialChar \- 6376 Number\SpecialChar \- 6377 Table_attri\SpecialChar \- 6378 bute 6379 \begin_float footnote 6380 \layout Standard 6381 6382 Any number of 6383 \family typewriter 6384 line_number_table 6385 \family default 6386 array entries fits nicely in a single 6387 \family typewriter 6388 LineNumberTable_attribute 6389 \family default 6390 attribute. 6391 \end_float 6392 , but Sun did specify it this way ( 6393 \begin_inset LatexCommand \cite{vmspec2} 6394 6395 \end_inset 6396 6397 , page 129). 6398 \layout Standard 6399 6400 Verifiers are requested to reject class files with inconsistent information 6401 in their attributes. 6402 However, here it may be that only by looking at all 6403 \family typewriter 6404 Line\SpecialChar \- 6405 Number\SpecialChar \- 6406 Table_attribute 6407 \family default 6408 s of a method, an inconsistency can be detected. 6409 JustIce does so and rejects class files with inconsistent 6410 \family typewriter 6411 Line\SpecialChar \- 6412 Number\SpecialChar \- 6413 Table 6414 \family default 6415 information. 6416 \layout Standard 6417 6418 Furthermore, it issues warnings if such an attribute is detected at all 6419 to discourage its use (see section 6420 \begin_inset LatexCommand \ref{Pass2Impl} 6421 6422 \end_inset 6423 6424 ). 6425 This is done because of possible different interpretations of the specification. 6426 \layout Standard 6427 6428 It should be noted that the use of attributes raises a few more problems 6429 to class file verification. 6430 A simple case is the presence of an unknown attribute that may safely be 6431 ignored. 6432 It is explicitly stated that such a class file must not be rejected. 6433 On the other hand, how should a verifier react if --for example-- a 6434 \family typewriter 6435 field_info 6436 \family default 6437 (see section 6438 \begin_inset LatexCommand \ref{Fields} 6439 6440 \end_inset 6441 6442 ) structure encloses a 6443 \family typewriter 6444 Code_attribute 6445 \family default 6446 ? JustIce will issue a warning but not reject the class file. 6447 \layout Section 6448 6449 6450 \begin_inset LatexCommand \label{Pass3Spec} 6451 6452 \end_inset 6453 6454 Pass Three 6455 \layout Standard 6456 6457 Performing pass three basically means 6458 \emph on 6459 verifying the bytecode 6460 \emph default 6461 . 6462 There are so-called 6463 \begin_inset Quotes eld 6464 \end_inset 6465 6466 static constraints 6467 \begin_inset Quotes erd 6468 \end_inset 6469 6470 on both the instructions in the code array and their operands. 6471 There are also so-called 6472 \begin_inset Quotes eld 6473 \end_inset 6474 6475 structural constraints 6476 \begin_inset Quotes erd 6477 \end_inset 6478 6479 . 6480 The structural constraints specify constraints on relationships between 6481 JVM instructions, so some people (including the author) regard 6482 \begin_inset Quotes eld 6483 \end_inset 6484 6485 structural constraints 6486 \begin_inset Quotes erd 6487 \end_inset 6488 6489 as a misnomer; they should be called 6490 \begin_inset Quotes eld 6491 \end_inset 6492 6493 dynamic constraints 6494 \begin_inset Quotes erd 6495 \end_inset 6496 6497 . 6498 \layout Standard 6499 6500 Static constraints are easily enforced using very simple checks. 6501 Here is an example for such a check: let there be a 6502 \family typewriter 6503 Code 6504 \family default 6505 (see section 6506 \begin_inset LatexCommand \ref{CodeAttribute} 6507 6508 \end_inset 6509 6510 ) attribute with a 6511 \family typewriter 6512 max_locals 6513 \family default 6514 value of 2. 6515 Only local variables number 0 and 1 may be accessed by the bytecode in 6516 this 6517 \family typewriter 6518 Code 6519 \family default 6520 attribute. 6521 For all instructions accessing local variables, make sure they do not access 6522 any other local variable. 6523 \layout Standard 6524 6525 Structural constraints are enforced using an algorithm sketched by Sun; 6526 it implements a symbolic execution of a method's code, by means of data 6527 flow analysis including type inference ( 6528 \begin_inset LatexCommand \cite{vmspec2} 6529 6530 \end_inset 6531 6532 , pages 143-151). 6533 This algorithm is called the 6534 \emph on 6535 data flow analyzer. 6536 6537 \emph default 6538 It is intuitively easy to understand, but it is hard to prove its correctness. 6539 The reason for that is the very weak specification of its subtleties; especiall 6540 y 6541 \emph on 6542 subroutines 6543 \emph default 6544 , 6545 \emph on 6546 wide date types 6547 \emph default 6548 and 6549 \emph on 6550 object initialization 6551 \emph default 6552 (see below). 6553 The general approach, however, is sound 6554 \begin_inset LatexCommand \cite{BCV-Soundness} 6555 6556 \end_inset 6557 6558 . 6559 Here is an example for a structural constraint enforced by this algorithm: 6560 during program execution, at any given point in the program the operand 6561 stack is always of the same height, no matter which code path was taken 6562 to reach that point. 6563 6564 \layout Standard 6565 6566 Pass three is the core of the verifier. 6567 Note that we will split this pass up into two passes, namely a pass verifying 6568 the static constraints and a pass verifying the structural constraints 6569 of a method's code. 6570 We will call these passes 6571 \begin_inset Quotes eld 6572 \end_inset 6573 6574 pass 3a 6575 \begin_inset Quotes erd 6576 \end_inset 6577 6578 and 6579 \begin_inset Quotes eld 6580 \end_inset 6581 6582 pass 3b 6583 \begin_inset Quotes erd 6584 \end_inset 6585 6586 . 6587 In a way, they resemble pass one and pass two: the former pass carefully 6588 parses an entity, while the latter pass performs additional verification. 6589 6590 \layout Standard 6591 6592 By defining pass four, the specification 6593 \begin_inset LatexCommand \cite{vmspec2} 6594 6595 \end_inset 6596 6597 implicitly excludes 6598 \begin_inset Quotes eld 6599 \end_inset 6600 6601 certain tests that could in principle be performed in Pass 3 6602 \begin_inset Quotes erd 6603 \end_inset 6604 6605 , because they are 6606 \begin_inset Quotes eld 6607 \end_inset 6608 6609 delayed until the first time the code for the method is actually invoked 6610 \begin_inset Quotes erd 6611 \end_inset 6612 6613 . 6614 On the other hand, verifiers are allowed to perform pass four partially 6615 or completely as a part of pass three. 6616 JustIce performs the pass four checks in pass 3a. 6617 \layout Subsection 6618 6619 Static Constraints: Pass 3a 6620 \layout Standard 6621 6622 Sun gives examples of what the verifier does before starting the data flow 6623 analyzer ( 6624 \begin_inset LatexCommand \cite{vmspec2} 6625 6626 \end_inset 6627 6628 , pages 143-144): 6629 \layout Itemize 6630 \pextra_type 1 \pextra_width 10mm 6631 6632 6633 \series bold 6634 Branches must be within the bounds of the code array for the method. 6635 \layout Itemize 6636 \pextra_type 1 \pextra_width 10mm 6637 6638 6639 \series bold 6640 The targets of all control-flow instructions are each the start of an instructio 6641 n. 6642 In the case of a 6643 \latex latex 6644 6645 \backslash 6646 texttt{wide} 6647 \latex default 6648 instruction the 6649 \latex latex 6650 6651 \backslash 6652 texttt{wide} 6653 \latex default 6654 opcode is considered the start of the instruction, and the opcode giving 6655 the operation modified by that 6656 \latex latex 6657 6658 \backslash 6659 texttt{wide} 6660 \latex default 6661 instruction is not considered to start an instruction. 6662 Branches into the middle of an instruction are disallowed. 6663 \layout Itemize 6664 \pextra_type 1 \pextra_width 10mm 6665 6666 6667 \series bold 6668 No instruction can access or modify a local variable at an index greater 6669 than or equal to the number of local variables that its method indicates 6670 it allocates. 6671 \layout Itemize 6672 \pextra_type 1 \pextra_width 10mm 6673 6674 6675 \series bold 6676 All references to the constant pool must be an entry of the appropriate 6677 type. 6678 For example: the instruction 6679 \latex latex 6680 6681 \backslash 6682 texttt{ldc} 6683 \latex default 6684 can be used only for data of type int or float or for instances of class 6685 String; the instruction 6686 \latex latex 6687 6688 \backslash 6689 texttt{getfield} 6690 \latex default 6691 must reference a field. 6692 \layout Itemize 6693 \pextra_type 1 \pextra_width 10mm 6694 6695 6696 \series bold 6697 The code does not end in the middle of an instruction. 6698 \layout Itemize 6699 \pextra_type 1 \pextra_width 10mm 6700 6701 6702 \series bold 6703 Execution cannot fall off the end of the code. 6704 \layout Itemize 6705 \pextra_type 1 \pextra_width 10mm 6706 6707 6708 \series bold 6709 For each exception handler, the starting and ending point of the code protected 6710 by the handler must be at the beginning of an instruction or, in the case 6711 of the ending point, immediately past the end of the code. 6712 The starting point must be before the ending point. 6713 The exception handler code must start at a valid instruction, and it may 6714 not start at an opcode being modified by the 6715 \latex latex 6716 6717 \backslash 6718 texttt{wide} 6719 \latex default 6720 instruction. 6721 \layout Standard 6722 6723 Most of these constraints are either static constraints on instructions 6724 or on their operands. 6725 A full list of constraints can be found in the Java Virtual Machine Specificati 6726 on, Second Edition ( 6727 \begin_inset LatexCommand \cite{vmspec2} 6728 6729 \end_inset 6730 6731 , pages 133-137). 6732 \layout Standard 6733 6734 The check for execution falling off the end of the code is an exception: 6735 this is a structural constraint and should therefore be performed in pass 6736 3b. 6737 Sun's verifiers, however, reject code that has an unreachable 6738 \latex latex 6739 6740 \backslash 6741 texttt{nop} 6742 \latex default 6743 at the end of the code array. 6744 Obviously, they reject the code before performing data flow analysis. 6745 For the sake of compatibility, JustIce performs this check in pass 3a. 6746 \layout Standard 6747 6748 Note that the JVM's instructions differ in length. 6749 Some instructions occupy only one byte (such as 6750 \family typewriter 6751 nop 6752 \family default 6753 ), others occupy three bytes (such as 6754 \family typewriter 6755 goto 6756 \family default 6757 ). 6758 Branch instructions could therefore target operands of instructions. 6759 For example, line 1 of algorithm 6760 \begin_inset LatexCommand \ref{facjavabytecode} 6761 6762 \end_inset 6763 6764 reads 6765 \begin_inset Quotes eld 6766 \end_inset 6767 6768 6769 \family typewriter 6770 1: ifne #8 6771 \family default 6772 6773 \begin_inset Quotes erd 6774 \end_inset 6775 6776 . 6777 If it would read 6778 \begin_inset Quotes eld 6779 \end_inset 6780 6781 6782 \family typewriter 6783 1: ifne #7 6784 \family default 6785 6786 \begin_inset Quotes erd 6787 \end_inset 6788 6789 , this code was malformed. 6790 A special case is the instruction 6791 \family typewriter 6792 wide 6793 \family default 6794 . 6795 This instruction takes another instruction 6796 \emph on 6797 as its operand 6798 \emph default 6799 , so one could be misguided into thinking this embedded instruction was 6800 a valid target for branches. 6801 It is not. 6802 \layout Standard 6803 6804 The checks Sun delays until pass four are performed in pass 3a by JustIce. 6805 These are checks to ensure allowed and possible access to a referenced 6806 type, listed below. 6807 6808 \layout Itemize 6809 6810 Is the type (class or interface) currently under examination allowed to 6811 reference the type 6812 \begin_float footnote 6813 \layout Standard 6814 6815 Interfaces may contain code, this is normally used for static initialization 6816 of 6817 \family typewriter 6818 final 6819 \family default 6820 variables. 6821 \end_float 6822 ? 6823 \layout Itemize 6824 6825 Does the referenced method or field exist in the given class? 6826 \layout Itemize 6827 6828 Does the referenced method or field have the indicated descriptor (signature)? 6829 \layout Itemize 6830 6831 Does the method currently under examination have access to the referenced 6832 method or field? 6833 \layout Subsection 6834 6835 Structural Constraints: Pass 3b 6836 \layout Standard 6837 6838 The structural constraints of JVM instructions are enforced by a data flow 6839 analyzer. 6840 This algorithm ensures the following constraints ( 6841 \begin_inset LatexCommand \cite{vmspec2} 6842 6843 \end_inset 6844 6845 , page 142). 6846 \layout Itemize 6847 \pextra_type 1 \pextra_width 10mm 6848 6849 6850 \series bold 6851 The operand stack is always the same size and contains the same types of 6852 values. 6853 \layout Itemize 6854 \pextra_type 1 \pextra_width 10mm 6855 6856 6857 \series bold 6858 No local variable is accessed unless it is known to contain a value of an 6859 appropriate type. 6860 \layout Itemize 6861 \pextra_type 1 \pextra_width 10mm 6862 6863 6864 \series bold 6865 Methods are invoked with the appropriate arguments. 6866 \layout Itemize 6867 \pextra_type 1 \pextra_width 10mm 6868 6869 6870 \series bold 6871 Fields are assigned only using values of appropriate types. 6872 \layout Itemize 6873 \pextra_type 1 \pextra_width 10mm 6874 6875 6876 \series bold 6877 All opcodes have appropriate type arguments on the operand stack and in 6878 the local variable array. 6879 \layout Standard 6880 6881 A full list of structural constraints can be found in The Java Virtual Machine 6882 Specification, Second Edition ( 6883 \begin_inset LatexCommand \cite{vmspec2} 6884 6885 \end_inset 6886 6887 , pages 137-139). 6888 \layout Subsubsection 6889 6890 6891 \begin_inset LatexCommand \label{SunCoreAlgo} 6892 6893 \end_inset 6894 6895 Sun's Verification Algorithm 6896 \layout Standard 6897 6898 Sun specifies the data flow analyzer by giving an informal algorithm ( 6899 \begin_inset LatexCommand \cite{vmspec2} 6900 6901 \end_inset 6902 6903 , pages 144-146). 6904 This algorithm it cited here completely because it is the very core of 6905 the verifier. 6906 According to this algorithm, every bytecode instruction has a 6907 \begin_inset Quotes eld 6908 \end_inset 6909 6910 changed 6911 \begin_inset Quotes erd 6912 \end_inset 6913 6914 bit. 6915 Initially, only the 6916 \begin_inset Quotes eld 6917 \end_inset 6918 6919 changed 6920 \begin_inset Quotes erd 6921 \end_inset 6922 6923 bit of the first instruction is set. 6924 \layout Enumerate 6925 \pextra_type 1 \pextra_width 10mm 6926 6927 6928 \series bold 6929 Select a virtual machine instruction whose "changed" bit is set. 6930 If no instruction remains whose "changed" bit is set, the method has successful 6931 ly been verified. 6932 Otherwise, turn off the "changed" bit of the selected instruction. 6933 \layout Enumerate 6934 \pextra_type 1 \pextra_width 10mm 6935 6936 6937 \series bold 6938 Model the effect of the instruction on the operand stack and local variable 6939 array by doing the following: 6940 \newline 6941 6942 \latex latex 6943 6944 \backslash 6945 textbullet\SpecialChar ~ 6946 6947 \latex default 6948 If the instruction uses values from the operand stack, ensure that there 6949 are a sufficient number of values on the stack and that the top values 6950 on the stack are of an appropriate type. 6951 Otherwise, verification fails. 6952 \newline 6953 6954 \latex latex 6955 6956 \backslash 6957 textbullet\SpecialChar ~ 6958 6959 \latex default 6960 If the instruction uses a local variable, ensure that the specified local 6961 variable contains a value of the appropriate type. 6962 Otherwise, verification fails. 6963 \newline 6964 6965 \latex latex 6966 6967 \backslash 6968 textbullet\SpecialChar ~ 6969 6970 \latex default 6971 If the instruction pushes values onto the operand stack, ensure that there 6972 is sufficient room on the operand stack for the new values. 6973 Add the indicated types to the top of the modeled operand stack. 6974 \newline 6975 6976 \latex latex 6977 6978 \backslash 6979 textbullet\SpecialChar ~ 6980 6981 \latex default 6982 If the instruction modifies a local variable, record that the local variable 6983 now contains the new type. 6984 \layout Enumerate 6985 \pextra_type 1 \pextra_width 10mm 6986 6987 6988 \series bold 6989 Determine the instructions that can follow the current instruction. 6990 Successor instructions can be one of the following: 6991 \newline 6992 6993 \latex latex 6994 6995 \backslash 6996 textbullet\SpecialChar ~ 6997 6998 \latex default 6999 The next instruction, if the current instruction is not an unconditional 7000 control transfer instruction (for instance goto, return, or athrow). 7001 Verification fails if it is possible to "fall off" the last instruction 7002 of the method. 7003 \newline 7004 7005 \latex latex 7006 7007 \backslash 7008 textbullet\SpecialChar ~ 7009 7010 \latex default 7011 The target(s) of a conditional or unconditional branch or switch. 7012 \newline 7013 7014 \latex latex 7015 7016 \backslash 7017 textbullet\SpecialChar ~ 7018 7019 \latex default 7020 Any exception handlers for this instruction. 7021 7022 \layout Enumerate 7023 \pextra_type 1 \pextra_width 10mm 7024 7025 7026 \series bold 7027 Merge the state of the operand stack and local variable array at the end 7028 of the execution of the current instruction into each of the successor 7029 instructions. 7030 In the special case of control transfer to an exception handler, the operand 7031 stack is set to contain a single object of the exception type indicated 7032 by the exception handler information. 7033 \newline 7034 7035 \latex latex 7036 7037 \backslash 7038 textbullet\SpecialChar ~ 7039 7040 \latex default 7041 If this is the first time the successor instruction has been visited, record 7042 that the operand stack and local variable values calculated in steps 2 7043 and 3 are the state of the operand stack and local variable array prior 7044 to executing the successor instruction. 7045 Set the "changed" bit for the successor instruction. 7046 \newline 7047 7048 \latex latex 7049 7050 \backslash 7051 textbullet\SpecialChar ~ 7052 7053 \latex default 7054 If the successor instruction has been seen before, merge the operand stack 7055 and local variable values calculated in steps 2 and 3 into the values already 7056 there. 7057 Set the "changed" bit if there is any modification to the values. 7058 \layout Enumerate 7059 \pextra_type 1 \pextra_width 10mm 7060 7061 7062 \series bold 7063 Continue at step 1. 7064 7065 \layout Standard 7066 \pextra_type 1 \pextra_width 10mm 7067 7068 7069 \series bold 7070 To merge two operand stacks, the number of values on each stack must be 7071 identical. 7072 The types of values on the stacks must also be identical, except that different 7073 ly typed reference values may appear at corresponding places on the two 7074 stacks. 7075 In this case, the merged operand stack contains a reference to an instance 7076 of the first common superclass of the two types. 7077 Such a reference type always exists because the type Object is a superclass 7078 of all class and interface types. 7079 If the operand stacks cannot be merged, verification of the method fails. 7080 \layout Standard 7081 \pextra_type 1 \pextra_width 10mm 7082 7083 7084 \series bold 7085 To merge two local variable array states, corresponding pairs of local variables 7086 are compared. 7087 If the two types are not identical, then unless both contain reference 7088 values, the verifier records that the local variable contains an unusable 7089 value. 7090 If both of the pair of local variables contain reference values, the merged 7091 state contains a reference to an instance of the first common superclass 7092 of the two types. 7093 \layout Standard 7094 7095 Certain instructions and data types complicate the data flow analyzer, most 7096 notably the instruction 7097 \latex latex 7098 7099 \backslash 7100 texttt{ret} 7101 \latex default 7102 (see section 7103 \begin_inset LatexCommand \ref{RetDesc} 7104 7105 \end_inset 7106 7107 ). 7108 The algorithm above even uses a special definition of 7109 \emph on 7110 merging 7111 \emph default 7112 for the 7113 \latex latex 7114 7115 \backslash 7116 texttt{ret} 7117 \latex default 7118 instruction (see 7119 \begin_inset LatexCommand \cite{vmspec2} 7120 7121 \end_inset 7122 7123 , page 151). 7124 The 7125 \latex latex 7126 7127 \backslash 7128 texttt{ret} 7129 \latex default 7130 instruction is parameterized with a value of type 7131 \family typewriter 7132 returnaddress 7133 \family default 7134 which is read from a local variable and used as a branching target. 7135 The 7136 \latex latex 7137 7138 \backslash 7139 texttt{ret} 7140 \latex default 7141 instruction is there to implement a (control flow) return from a 7142 \emph on 7143 subroutine 7144 \emph default 7145 . 7146 \layout Subsubsection 7147 7148 Reachability of Instructions 7149 \layout Standard 7150 7151 For the data flow analysis algorithm, you need to know all the possible 7152 control flow successors of every instruction, i.e., you need to build a 7153 \emph on 7154 control flow graph 7155 \emph default 7156 (see below). 7157 Without the instructions 7158 \latex latex 7159 7160 \backslash 7161 texttt{jsr} 7162 \begin_float footnote 7163 \layout Standard 7164 7165 Remember, a 7166 \latex latex 7167 7168 \backslash 7169 texttt{jsr} 7170 \latex default 7171 or 7172 \latex latex 7173 7174 \backslash 7175 texttt{jsr 7176 \backslash 7177 _w} 7178 \latex default 7179 instruction is an unconditional branch instruction that jumps into a 7180 \emph on 7181 subroutine 7182 \emph default 7183 . 7184 Usually a 7185 \latex latex 7186 7187 \backslash 7188 texttt{ret} 7189 \latex default 7190 instruction leaves the 7191 \emph on 7192 subroutine 7193 \emph default 7194 . 7195 \end_float 7196 , 7197 \latex latex 7198 7199 \backslash 7200 texttt{jsr 7201 \backslash 7202 _w} 7203 \latex default 7204 and 7205 \latex latex 7206 7207 \backslash 7208 texttt{ret} 7209 \latex default 7210 this calculation would be easy. 7211 But to calculate successors of a 7212 \latex latex 7213 7214 \backslash 7215 texttt{ret} 7216 \latex default 7217 instruction, you need a complete control flow graph: you need to find out 7218 which 7219 \latex latex 7220 7221 \backslash 7222 texttt{jsr} 7223 \latex default 7224 or 7225 \latex latex 7226 7227 \backslash 7228 texttt{jsr 7229 \backslash 7230 _w} 7231 \latex default 7232 and 7233 \latex latex 7234 7235 \backslash 7236 texttt{ret} 7237 \latex default 7238 pairs belong together. 7239 Therefore, a cycle of self-dependency is created that has to be broken 7240 somewhere. 7241 This is explained in detail below. 7242 \layout Standard 7243 7244 This was also an issue that led to the definition of the term 7245 \emph on 7246 subroutine 7247 \emph default 7248 that JustIce uses. 7249 This definition allows the prediction of a 7250 \latex latex 7251 7252 \backslash 7253 texttt{ret} 7254 \latex default 7255 instruction's target without performing control flow analysis. 7256 \layout Subsubsection 7257 7258 7259 \begin_inset LatexCommand \label{SpecSubroutines} 7260 7261 \end_inset 7262 7263 Subroutines 7264 \layout Standard 7265 7266 Subroutines make the verification algorithm extremely difficult. 7267 They are harshly underspecified. 7268 Although 7269 \begin_inset Quotes eld 7270 \end_inset 7271 7272 the Java virtual machine has no guarantee that any file it is asked to load 7273 was generated by that compiler 7274 \begin_inset Quotes erd 7275 \end_inset 7276 7277 , the subroutine specification explains how 7278 \emph on 7279 javac 7280 \emph default 7281 transforms 7282 \begin_inset Quotes eld 7283 \end_inset 7284 7285 7286 \latex latex 7287 7288 \backslash 7289 texttt{try} 7290 \latex default 7291 / 7292 \latex latex 7293 7294 \backslash 7295 texttt{catch} 7296 \latex default 7297 / 7298 \latex latex 7299 7300 \backslash 7301 texttt{finally} 7302 \latex default 7303 7304 \begin_inset Quotes erd 7305 \end_inset 7306 7307 clauses into subroutines 7308 \begin_inset LatexCommand \cite{vmspec2} 7309 7310 \end_inset 7311 7312 . 7313 Intuitively, one gets the idea that a subroutine starts with some jump 7314 target of a 7315 \latex latex 7316 7317 \backslash 7318 texttt{jsr} 7319 \latex default 7320 or 7321 \latex latex 7322 7323 \backslash 7324 texttt{jsr 7325 \backslash 7326 _w} 7327 \latex default 7328 instruction and ends with a 7329 \latex latex 7330 7331 \backslash 7332 texttt{ret} 7333 \latex default 7334 instruction. 7335 But the specification fails to correctly specify what subroutines exactly 7336 are at machine instruction level. 7337 Consider algorithm 7338 \begin_inset LatexCommand \ref{jsrpopalgo} 7339 7340 \end_inset 7341 7342 . 7343 \layout Standard 7344 7345 \begin_float alg 7346 \layout Standard 7347 7348 7349 \family typewriter 7350 00 jsr\SpecialChar ~ 7351 03\SpecialChar ~ 7352 \SpecialChar ~ 7353 \SpecialChar ~ 7354 ; Jump to 7355 \begin_inset Quotes eld 7356 \end_inset 7357 7358 subroutine 7359 \begin_inset Quotes erd 7360 \end_inset 7361 7362 at offset 03; push return 7363 \layout Standard 7364 7365 7366 \family typewriter 7367 \SpecialChar ~ 7368 \SpecialChar ~ 7369 \SpecialChar ~ 7370 \SpecialChar ~ 7371 \SpecialChar ~ 7372 \SpecialChar ~ 7373 \SpecialChar ~ 7374 \SpecialChar ~ 7375 \SpecialChar ~ 7376 \SpecialChar ~ 7377 \SpecialChar ~ 7378 \SpecialChar ~ 7379 ; address 03 onto stack. 7380 \layout Standard 7381 7382 7383 \family typewriter 7384 03 pop\SpecialChar ~ 7385 \SpecialChar ~ 7386 \SpecialChar ~ 7387 \SpecialChar ~ 7388 \SpecialChar ~ 7389 \SpecialChar ~ 7390 ; Pop the return address off the stack. 7391 \layout Standard 7392 7393 7394 \family typewriter 7395 04 nop\SpecialChar ~ 7396 \SpecialChar ~ 7397 \SpecialChar ~ 7398 \SpecialChar ~ 7399 \SpecialChar ~ 7400 \SpecialChar ~ 7401 ; No operation. 7402 \layout Caption 7403 7404 7405 \begin_inset LatexCommand \label{jsrpopalgo} 7406 7407 \end_inset 7408 7409 Is This a Subroutine? 7410 \end_float 7411 \layout Standard 7412 7413 What is this? Is the 7414 \emph on 7415 NOP 7416 \emph default 7417 instruction part of a subroutine or not? Algorithm 7418 \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7419 7420 \end_inset 7421 7422 shows another example. 7423 \layout Standard 7424 7425 \begin_float alg 7426 \layout Caption 7427 7428 7429 \begin_inset LatexCommand \label{OneOrTwoSubroutinesAlgo} 7430 7431 \end_inset 7432 7433 One or Two Subroutines? 7434 \layout Standard 7435 7436 7437 \family typewriter 7438 00 iload_0\SpecialChar ~ 7439 \SpecialChar ~ 7440 ; Load a numerical 0 onto the stack. 7441 \layout Standard 7442 7443 7444 \family typewriter 7445 01 jsr\SpecialChar ~ 7446 05\SpecialChar ~ 7447 \SpecialChar ~ 7448 \SpecialChar ~ 7449 ; Jump to "subroutine" at offset 05; push return 7450 \layout Standard 7451 7452 7453 \family typewriter 7454 \SpecialChar ~ 7455 \SpecialChar ~ 7456 \SpecialChar ~ 7457 \SpecialChar ~ 7458 \SpecialChar ~ 7459 \SpecialChar ~ 7460 \SpecialChar ~ 7461 \SpecialChar ~ 7462 \SpecialChar ~ 7463 \SpecialChar ~ 7464 \SpecialChar ~ 7465 \SpecialChar ~ 7466 ; address 04 onto stack. 7467 \layout Standard 7468 7469 7470 \family typewriter 7471 04 return\SpecialChar ~ 7472 \SpecialChar ~ 7473 \SpecialChar ~ 7474 ; Leave the method. 7475 \layout Standard 7476 7477 7478 \family typewriter 7479 05 dup\SpecialChar ~ 7480 \SpecialChar ~ 7481 \SpecialChar ~ 7482 \SpecialChar ~ 7483 \SpecialChar ~ 7484 \SpecialChar ~ 7485 ; Duplicate the stack's top. 7486 \layout Standard 7487 7488 7489 \family typewriter 7490 06 astore\SpecialChar ~ 7491 0\SpecialChar ~ 7492 ; Store the return address from the stack into 7493 \layout Standard 7494 7495 7496 \family typewriter 7497 \SpecialChar ~ 7498 \SpecialChar ~ 7499 \SpecialChar ~ 7500 \SpecialChar ~ 7501 \SpecialChar ~ 7502 \SpecialChar ~ 7503 \SpecialChar ~ 7504 \SpecialChar ~ 7505 \SpecialChar ~ 7506 \SpecialChar ~ 7507 \SpecialChar ~ 7508 \SpecialChar ~ 7509 ; local variable 0. 7510 \layout Standard 7511 7512 7513 \family typewriter 7514 07 astore\SpecialChar ~ 7515 1\SpecialChar ~ 7516 ; Store the return address from the stack into 7517 \layout Standard 7518 7519 7520 \family typewriter 7521 \SpecialChar ~ 7522 \SpecialChar ~ 7523 \SpecialChar ~ 7524 \SpecialChar ~ 7525 \SpecialChar ~ 7526 \SpecialChar ~ 7527 \SpecialChar ~ 7528 \SpecialChar ~ 7529 \SpecialChar ~ 7530 \SpecialChar ~ 7531 \SpecialChar ~ 7532 \SpecialChar ~ 7533 ; local variable 1. 7534 \layout Standard 7535 7536 7537 \family typewriter 7538 08 ifeq\SpecialChar ~ 7539 12\SpecialChar ~ 7540 \SpecialChar ~ 7541 ; If there is a 0 on top of the stack, jump to 7542 \layout Standard 7543 7544 7545 \family typewriter 7546 \SpecialChar ~ 7547 \SpecialChar ~ 7548 \SpecialChar ~ 7549 \SpecialChar ~ 7550 \SpecialChar ~ 7551 \SpecialChar ~ 7552 \SpecialChar ~ 7553 \SpecialChar ~ 7554 \SpecialChar ~ 7555 \SpecialChar ~ 7556 \SpecialChar ~ 7557 \SpecialChar ~ 7558 ; offset 12. 7559 \layout Standard 7560 7561 7562 \family typewriter 7563 11 ret\SpecialChar ~ 7564 0\SpecialChar ~ 7565 \SpecialChar ~ 7566 \SpecialChar ~ 7567 \SpecialChar ~ 7568 ; Return to offset 4 (because this is in local 7569 \layout Standard 7570 7571 7572 \family typewriter 7573 \SpecialChar ~ 7574 \SpecialChar ~ 7575 \SpecialChar ~ 7576 \SpecialChar ~ 7577 \SpecialChar ~ 7578 \SpecialChar ~ 7579 \SpecialChar ~ 7580 \SpecialChar ~ 7581 \SpecialChar ~ 7582 \SpecialChar ~ 7583 \SpecialChar ~ 7584 \SpecialChar ~ 7585 ; variable 0 here). 7586 \layout Standard 7587 7588 7589 \family typewriter 7590 12 nop\SpecialChar ~ 7591 \SpecialChar ~ 7592 \SpecialChar ~ 7593 \SpecialChar ~ 7594 \SpecialChar ~ 7595 \SpecialChar ~ 7596 ; No operation. 7597 \layout Standard 7598 7599 7600 \family typewriter 7601 13 ret\SpecialChar ~ 7602 1\SpecialChar ~ 7603 \SpecialChar ~ 7604 \SpecialChar ~ 7605 \SpecialChar ~ 7606 ; Return to offset 4 (because this is in local 7607 \layout Standard 7608 7609 7610 \family typewriter 7611 \SpecialChar ~ 7612 \SpecialChar ~ 7613 \SpecialChar ~ 7614 \SpecialChar ~ 7615 \SpecialChar ~ 7616 \SpecialChar ~ 7617 \SpecialChar ~ 7618 \SpecialChar ~ 7619 \SpecialChar ~ 7620 \SpecialChar ~ 7621 \SpecialChar ~ 7622 \SpecialChar ~ 7623 ; variable 1 here). 7624 \end_float 7625 \layout Standard 7626 7627 Do we deal with one subroutine (which is the case if you define subroutines 7628 to start with a 7629 \latex latex 7630 7631 \backslash 7632 texttt{jsr} 7633 \latex default 7634 or 7635 \latex latex 7636 7637 \backslash 7638 texttt{jsr 7639 \backslash 7640 _w} 7641 \latex default 7642 's target) or are these two subroutines (which is the case if you count 7643 the 7644 \latex latex 7645 7646 \backslash 7647 texttt{ret} 7648 \latex default 7649 instructions and believe that there must be exactly one 7650 \latex latex 7651 7652 \backslash 7653 texttt{ret} 7654 \latex default 7655 per subroutine)? 7656 \layout Standard 7657 7658 Recursive calls to subroutines are forbidden by the specification; however, 7659 Sun's verifier implementations are not consequently deciding which recursive 7660 calls to reject 7661 \begin_float footnote 7662 \layout Standard 7663 7664 This was experimentally found by the author and also published in 7665 \begin_inset LatexCommand \cite{JBook} 7666 7667 \end_inset 7668 7669 . 7670 \end_float 7671 . 7672 This is a failure due to a missing definition of the term 7673 \emph on 7674 subroutine 7675 \emph default 7676 . 7677 \layout Standard 7678 7679 While the first example passes Sun's verifier, the second example is rejected. 7680 The exact definition of the term 7681 \emph on 7682 subroutine 7683 \emph default 7684 cannot be deducted from ther behaviour of Sun's verifier. 7685 \layout Standard 7686 7687 A new, clean specification had to be defined. 7688 Such a specification can of course not be compatible with the behaviour 7689 of Sun's verifier in all corner cases. 7690 \layout Subsubsection 7691 7692 7693 \begin_inset LatexCommand \label{Subroutines_Def} 7694 7695 \end_inset 7696 7697 A Precise Definition of the Term 7698 \emph on 7699 Subroutine 7700 \layout Standard 7701 7702 Because Sun --inappropriately-- describes how 7703 \emph on 7704 javac 7705 \emph default 7706 creates subroutines, the definition presented here is based on the observation 7707 of 7708 \emph on 7709 javac 7710 \emph default 7711 's behaviour. 7712 This makes the definition compatible with a lot of existing code, but without 7713 violating the validity of far-reaching conclusions earned by exploiting 7714 a clean definition 7715 \begin_float footnote 7716 \layout Standard 7717 7718 Unfortunately, in some rare cases, 7719 \emph on 7720 javac 7721 \emph default 7722 produces code that is incompatible with the constraints related to our 7723 definition of 7724 \emph on 7725 subroutine 7726 \emph default 7727 . 7728 However, 7729 \emph on 7730 javac 7731 \emph default 7732 also produces code which is incompatible with Sun's verifier (see section 7733 7734 \begin_inset LatexCommand \ref{StaerkJreject} 7735 7736 \end_inset 7737 7738 ). 7739 \end_float 7740 . 7741 7742 \layout Itemize 7743 7744 Every instruction of a method is part of exactly one subroutine (or the 7745 top-level). 7746 \layout Itemize 7747 7748 The first instruction of a subroutine is an 7749 \latex latex 7750 7751 \backslash 7752 texttt{astore N} 7753 \latex default 7754 instruction that stores the return address in local variable number 7755 \emph on 7756 N 7757 \emph default 7758 . 7759 \layout Itemize 7760 7761 There must be exactly one 7762 \latex latex 7763 7764 \backslash 7765 texttt{ret} 7766 \latex default 7767 instruction per subroutine. 7768 This instruction must work on the local variable 7769 \emph on 7770 N 7771 \emph default 7772 ; i.e., it is a 7773 \latex latex 7774 7775 \backslash 7776 texttt{ret N} 7777 \latex default 7778 instruction. 7779 \layout Itemize 7780 7781 Subroutines are not protected by exception handlers. 7782 \layout Itemize 7783 7784 No instruction that is part of a subroutine is the target of an exception 7785 handler. 7786 \layout Itemize 7787 7788 Subroutines of a subroutine do not access local variable 7789 \emph on 7790 N 7791 \emph default 7792 . 7793 A subsubroutine of a subroutine is also considered a subroutine here, in 7794 a recursive sense. 7795 \layout Standard 7796 7797 As we can see, a subroutine can be characterized by its set of instructions, 7798 the most important instruction being the target of some 7799 \latex latex 7800 7801 \backslash 7802 texttt{jsr} 7803 \latex default 7804 or 7805 \latex latex 7806 7807 \backslash 7808 texttt{jsr 7809 \backslash 7810 _w} 7811 \latex default 7812 instruction that is not part of the subroutine itself. 7813 Another important property is the local variable 7814 \emph on 7815 N 7816 \emph default 7817 the 7818 \latex latex 7819 7820 \backslash 7821 texttt{ret} 7822 \latex default 7823 instruction is working on. 7824 \layout Standard 7825 7826 This way, we can make sure subroutines are properly nested, so that JustIce 7827 would reject both the example bytecodes in algorithms 7828 \begin_inset LatexCommand \ref{jsrpopalgo} 7829 7830 \end_inset 7831 7832 and 7833 \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7834 7835 \end_inset 7836 7837 . 7838 \layout Standard 7839 7840 The 7841 \latex latex 7842 7843 \backslash 7844 texttt{astore} 7845 \latex default 7846 instruction mentioned above is so important because there is no JVM instruction 7847 that can read values of a 7848 \latex latex 7849 7850 \backslash 7851 texttt{returnaddress} 7852 \latex default 7853 type from local variables. 7854 After entering a subroutine, the 7855 \latex latex 7856 7857 \backslash 7858 texttt{astore} 7859 \latex default 7860 instruction pops the return address off the operand stack and writes it 7861 into local variable number 7862 \emph on 7863 N 7864 \emph default 7865 . 7866 Therefore we can be sure it will not be duplicated or deleted as in algorithms 7867 7868 \begin_inset LatexCommand \ref{jsrpopalgo} 7869 7870 \end_inset 7871 7872 and 7873 \begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} 7874 7875 \end_inset 7876 7877 . 7878 \layout Standard 7879 7880 The constraints concerning exception handlers are defined to make sure that 7881 we can observe the control flow statically. 7882 If an exception is thrown from within a subroutine, the method simply 7883 \begin_inset Quotes eld 7884 \end_inset 7885 7886 7887 \emph on 7888 completes abruptly 7889 \emph default 7890 7891 \begin_inset Quotes erd 7892 \end_inset 7893 7894 ( 7895 \begin_inset LatexCommand \cite{vmspec2} 7896 7897 \end_inset 7898 7899 , page 74). 7900 If we would allow subroutine instructions to be protected by exception 7901 handlers, it would not be clear if the handling instructions are part of 7902 the subroutine or not. 7903 \layout Standard 7904 7905 We can also derive subsubroutines of subroutines recursively by exploiting 7906 the properly-nested property explained above. 7907 \layout Subsubsection 7908 7909 The Control Flow Graph 7910 \layout Standard 7911 7912 A control flow graph is a directed graph with edges that represent possible 7913 branches of control flow. 7914 Similarly, the nodes describe groups of physically adjacent instructions 7915 that have to be executed one after another -- without any possible control 7916 flow branch to another instruction but the physical successor 7917 \begin_float footnote 7918 \layout Standard 7919 7920 More information about control flow graphs can be found in 7921 \begin_inset LatexCommand \cite{DragonBook} 7922 7923 \end_inset 7924 7925 . 7926 \end_float 7927 . 7928 Figure 7929 \begin_inset LatexCommand \ref{convcfg} 7930 7931 \end_inset 7932 7933 shows such a control flow graph for algorithm 7934 \begin_inset LatexCommand \ref{facjavabytecode} 7935 7936 \end_inset 7937 7938 , the implementation of the faculty function discussed earlier. 7939 \layout Standard 7940 7941 \begin_float fig 7942 \layout Standard 7943 \align center 7944 7945 \begin_inset Figure size 595 368 7946 file conventcfg.eps 7947 width 3 100 7948 flags 9 7949 7950 \end_inset 7951 7952 7953 \layout Caption 7954 7955 7956 \begin_inset LatexCommand \label{convcfg} 7957 7958 \end_inset 7959 7960 A Conventional Control Flow Graph 7961 \end_float 7962 \layout Standard 7963 7964 The JVM defines a sort of control flow orthogonal to the common execution 7965 of instructions, namely, the exception mechanism. 7966 Because every instruction could possibly throw an exception (say, a 7967 \family typewriter 7968 java.lang.VirtualMachineError 7969 \family default 7970 ) during its execution, the control flow graph calculated by JustIce always 7971 uses only one instruction per node. 7972 This also reflects the original verification algorithm given by Sun Microsystem 7973 s. 7974 Figure 7975 \begin_inset LatexCommand \ref{justicecfg} 7976 7977 \end_inset 7978 7979 shows an example for such a control flow graph. 7980 \layout Standard 7981 7982 \begin_float fig 7983 \layout Standard 7984 \align center 7985 7986 \begin_inset Figure size 595 473 7987 file justicecfg.eps 7988 width 3 100 7989 flags 9 7990 7991 \end_inset 7992 7993 7994 \layout Caption 7995 7996 7997 \begin_inset LatexCommand \label{justicecfg} 7998 7999 \end_inset 8000 8001 A Control Flow Graph as Used by JustIce 8002 \end_float 8003 \layout Standard 8004 8005 Instruction nodes are augmented with a data structure that represents the 8006 simulated operand stack and the simulated local variables array. 8007 When running the core verification algorithm, these nodes are put into 8008 a queue which is equivalent to tagging them with a 8009 \emph on 8010 changed 8011 \emph default 8012 bit as Sun describes 8013 \begin_float footnote 8014 \layout Standard 8015 8016 As explained later, JustIce uses a queue that allows duplicates: this is 8017 a slight semantical change. 8018 \end_float 8019 . 8020 \layout Subsubsection 8021 8022 Subroutines Revisited: Interplay With the Data Flow Analyzer 8023 \layout Standard 8024 8025 There is another problem concerning subroutines. 8026 Normally, when merging the type information of two simulated local variables, 8027 the common type is recorded as 8028 \emph on 8029 unusable 8030 \emph default 8031 if the types differ. 8032 This 8033 \emph on 8034 unusable 8035 \emph default 8036 value is then propagated to subsequent instructions to prevent read access. 8037 \layout Standard 8038 8039 This is not the case with the successors of the 8040 \latex latex 8041 8042 \backslash 8043 texttt{ret} 8044 \latex default 8045 instruction. 8046 These successors are physical successors of some 8047 \latex latex 8048 8049 \backslash 8050 texttt{jsr} 8051 \latex default 8052 or 8053 \latex latex 8054 8055 \backslash 8056 texttt{jsr 8057 \backslash 8058 _w} 8059 \latex default 8060 instructions. 8061 \layout Standard 8062 8063 Subroutines are said to be 8064 \emph on 8065 polymorphic 8066 \emph default 8067 with respect to their local variables arrays. 8068 As an example, consider algorithm 8069 \begin_inset LatexCommand \ref{lvpolymorphalgo} 8070 8071 \end_inset 8072 8073 . 8074 This algorithm shows legal JVM code. 8075 In line 11, local variable 0 may contain a value of the 8076 \family typewriter 8077 integer 8078 \family default 8079 or the 8080 \family typewriter 8081 float 8082 \family default 8083 type; depending on the 8084 \latex latex 8085 8086 \backslash 8087 texttt{jsr} 8088 \latex default 8089 instruction that entered the subroutine. 8090 Normally, this would cause the verifier to mark local variable 0 as 8091 \emph on 8092 unusable 8093 \emph default 8094 and propagate this information. 8095 The successors of the 8096 \latex latex 8097 8098 \backslash 8099 texttt{ret} 8100 \latex default 8101 instruction are the instructions in lines 5 and 10. 8102 However, a correct verifier does 8103 \emph on 8104 not 8105 \emph default 8106 mark local variable 0 as 8107 \emph on 8108 unusable 8109 \emph default 8110 for them, because the local variable 0 was not accessed or modified in 8111 the subroutine. 8112 \layout Standard 8113 8114 \begin_float alg 8115 \layout Caption 8116 8117 8118 \begin_inset LatexCommand \label{lvpolymorphalgo} 8119 8120 \end_inset 8121 8122 Local Variables are Polymorphic in Subroutines 8123 \layout Standard 8124 8125 8126 \family typewriter 8127 0 : iconst_0\SpecialChar ~ 8128 \SpecialChar ~ 8129 \SpecialChar ~ 8130 ; load integer constant 0 onto stack 8131 \layout Standard 8132 8133 8134 \family typewriter 8135 1 : istore 0\SpecialChar ~ 8136 \SpecialChar ~ 8137 \SpecialChar ~ 8138 ; move it into local variable 0 8139 \layout Standard 8140 8141 8142 \family typewriter 8143 2 : jsr 11\SpecialChar ~ 8144 \SpecialChar ~ 8145 \SpecialChar ~ 8146 \SpecialChar ~ 8147 \SpecialChar ~ 8148 ; enter subroutine 8149 \layout Standard 8150 8151 8152 \family typewriter 8153 5 : fconst 0.0\SpecialChar ~ 8154 ; load float constant 0.0 onto stack 8155 \layout Standard 8156 8157 8158 \family typewriter 8159 6 : fstore 0\SpecialChar ~ 8160 \SpecialChar ~ 8161 \SpecialChar ~ 8162 ; move it into local variable 0 8163 \layout Standard 8164 8165 8166 \family typewriter 8167 7 : jsr 11\SpecialChar ~ 8168 \SpecialChar ~ 8169 \SpecialChar ~ 8170 \SpecialChar ~ 8171 \SpecialChar ~ 8172 ; enter subroutine again 8173 \layout Standard 8174 8175 8176 \family typewriter 8177 10: return\SpecialChar ~ 8178 \SpecialChar ~ 8179 \SpecialChar ~ 8180 \SpecialChar ~ 8181 \SpecialChar ~ 8182 ; complete method 8183 \layout Standard 8184 8185 8186 \family typewriter 8187 11: astore 1\SpecialChar ~ 8188 \SpecialChar ~ 8189 \SpecialChar ~ 8190 ; Subroutine entry: move return address 8191 \layout Standard 8192 8193 8194 \family typewriter 8195 \SpecialChar ~ 8196 \SpecialChar ~ 8197 \SpecialChar ~ 8198 \SpecialChar ~ 8199 \SpecialChar ~ 8200 \SpecialChar ~ 8201 \SpecialChar ~ 8202 \SpecialChar ~ 8203 \SpecialChar ~ 8204 \SpecialChar ~ 8205 \SpecialChar ~ 8206 \SpecialChar ~ 8207 \SpecialChar ~ 8208 \SpecialChar ~ 8209 \SpecialChar ~ 8210 ; into local variable 1 8211 \layout Standard 8212 8213 8214 \family typewriter 8215 12: nop\SpecialChar ~ 8216 \SpecialChar ~ 8217 \SpecialChar ~ 8218 \SpecialChar ~ 8219 \SpecialChar ~ 8220 \SpecialChar ~ 8221 \SpecialChar ~ 8222 \SpecialChar ~ 8223 ; do nothing 8224 \layout Standard 8225 8226 8227 \family typewriter 8228 13: ret 1\SpecialChar ~ 8229 \SpecialChar ~ 8230 \SpecialChar ~ 8231 \SpecialChar ~ 8232 \SpecialChar ~ 8233 \SpecialChar ~ 8234 ; return from subroutine 8235 \end_float 8236 \layout Standard 8237 8238 Basically, only the local variables accessed in the called subroutine (and 8239 the subroutines called from there, recursively) are merged with the correspondi 8240 ng successor of a 8241 \latex latex 8242 8243 \backslash 8244 texttt{ret} 8245 \latex default 8246 instruction. 8247 This means that in this special case, three sources are used to construct 8248 the merged array of local variables type information (instead of only two): 8249 the 8250 \latex latex 8251 8252 \backslash 8253 texttt{jsr} 8254 \latex default 8255 / 8256 \latex latex 8257 8258 \backslash 8259 texttt{jsr 8260 \backslash 8261 _w} 8262 \latex default 8263 instruction, the 8264 \latex latex 8265 8266 \backslash 8267 texttt{ret} 8268 \latex default 8269 instruction and the "old" type information of the 8270 \latex latex 8271 8272 \backslash 8273 texttt{ret} 8274 \latex default 8275 instruction's target (which is the physical successor of the 8276 \latex latex 8277 8278 \backslash 8279 texttt{jsr} 8280 \latex default 8281 / 8282 \latex latex 8283 8284 \backslash 8285 texttt{jsr 8286 \backslash 8287 _w} 8288 \latex default 8289 instruction). 8290 \layout Standard 8291 8292 One possibility to deal with this situation is 8293 \emph on 8294 inlining 8295 \emph default 8296 . 8297 For instance, the verifier of the ElectricalFire JVM 8298 \begin_inset LatexCommand \cite{EF} 8299 8300 \end_inset 8301 8302 uses this approach: instruction nodes of subroutines are duplicated for 8303 every calling 8304 \latex latex 8305 8306 \backslash 8307 texttt{jsr} 8308 \latex default 8309 or 8310 \latex latex 8311 8312 \backslash 8313 texttt{jsr 8314 \backslash 8315 _w} 8316 \latex default 8317 instruction. 8318 This approach is equivalent to the one sketched by Sun (see 8319 \begin_inset LatexCommand \cite{vmspec2} 8320 8321 \end_inset 8322 8323 , page 151). 8324 8325 \layout Standard 8326 8327 JustIce uses a variant of this approach: instruction nodes are augmented 8328 with sets of local variables arrays. 8329 The local variables array used for merging a 8330 \latex latex 8331 8332 \backslash 8333 texttt{ret} 8334 \latex default 8335 's type information with the physical successor of some 8336 \latex latex 8337 8338 \backslash 8339 texttt{jsr} 8340 \latex default 8341 / 8342 \latex latex 8343 8344 \backslash 8345 texttt{jsr 8346 \backslash 8347 _w} 8348 \latex default 8349 instruction is keyed by that 8350 \latex latex 8351 8352 \backslash 8353 texttt{jsr} 8354 \latex default 8355 / 8356 \latex latex 8357 8358 \backslash 8359 texttt{jsr 8360 \backslash 8361 _w} 8362 \latex default 8363 instruction itself. 8364 This still implies a special merging mechanism for the 8365 \latex latex 8366 8367 \backslash 8368 texttt{ret} 8369 \latex default 8370 instruction: only the physical successor of one 8371 \latex latex 8372 8373 \backslash 8374 texttt{jsr} 8375 \latex default 8376 / 8377 \latex latex 8378 8379 \backslash 8380 texttt{jsr 8381 \backslash 8382 _w} 8383 \latex default 8384 instruction can be merged with the 8385 \latex latex 8386 8387 \backslash 8388 texttt{ret} 8389 \latex default 8390 at a time, because other 8391 \latex latex 8392 8393 \backslash 8394 texttt{jsr} 8395 \latex default 8396 / 8397 \latex latex 8398 8399 \backslash 8400 texttt{jsr 8401 \backslash 8402 _w} 8403 \latex default 8404 instructions have possibly not been symbolically executed yet and thus 8405 bear no type information at the time of merging. 8406 In this scenario, an instruction in a subroutine plays multiple roles; 8407 one for each occurence of a 8408 \latex latex 8409 8410 \backslash 8411 texttt{jsr} 8412 \latex default 8413 / 8414 \latex latex 8415 8416 \backslash 8417 texttt{jsr 8418 \backslash 8419 _w} 8420 \latex default 8421 that is calling the subroutine. 8422 The queue holding the instructions to symbolically execute is therefore 8423 required to allow duplicates. 8424 \layout Subsubsection 8425 8426 Wide Data Types 8427 \layout Standard 8428 8429 The types 8430 \family typewriter 8431 long 8432 \family default 8433 and 8434 \family typewriter 8435 double 8436 \family default 8437 use two consecutive local variables if written to or read from a local variables 8438 array. 8439 Similarly, they use two operand stack slots. 8440 This makes type verification a bit more difficult because of subtle special 8441 cases. 8442 For example, when a method uses three local variables at maximum (local 8443 variables 0, 1 and 2), the code is not allowed to store a 8444 \family typewriter 8445 double 8446 \family default 8447 value in local variable 2 (because local variable 3 would have to be occupied, 8448 too). 8449 \layout Subsubsection 8450 8451 Instance Initialization and Newly Created Objects 8452 \layout Standard 8453 8454 It would be difficult to verify that a newly created instance is initialized 8455 exactly once, given all possible paths of execution flow in a method. 8456 Fortunately (from a verifier implementor's view), Sun puts constraints 8457 on object initialization that match the behaviour of the verifier --- instead 8458 of putting sane constraints on object initialization and actually verifying 8459 them. 8460 \layout Standard 8461 8462 8463 \begin_inset Quotes eld 8464 \end_inset 8465 8466 A valid instruction sequence must not have an uninitialized object on the 8467 operand stack or in a local variable during a backwards branch [\SpecialChar \ldots{} 8468 ]. 8469 Otherwise, a devious piece of code might fool the verifier into thinking 8470 it had initialized a class instance when it had, in fact, initialized a 8471 class instance created in a previous pass through a loop 8472 \begin_inset Quotes erd 8473 \end_inset 8474 8475 ( 8476 \begin_inset LatexCommand \cite{vmspec2} 8477 8478 \end_inset 8479 8480 , page 148). 8481 \layout Section 8482 8483 8484 \begin_inset LatexCommand \label{Pass4Spec} 8485 8486 \end_inset 8487 8488 Pass Four 8489 \layout Standard 8490 8491 Pass four performs 8492 \begin_inset Quotes eld 8493 \end_inset 8494 8495 certain tests that could in principle be performed in Pass 3 8496 \begin_inset Quotes erd 8497 \end_inset 8498 8499 ( 8500 \begin_inset LatexCommand \cite{vmspec2} 8501 8502 \end_inset 8503 8504 , page 142). 8505 These tests are usually delayed by JVM implementations until run-time, 8506 because they possibly trigger the loading of referenced class file definitions. 8507 This is a performance enhancement. 8508 However, 8509 \begin_inset Quotes eld 8510 \end_inset 8511 8512 A Java virtual machine implementation is allowed to perform any or all of 8513 the Pass 4 steps as part of Pass 3 8514 \begin_inset Quotes erd 8515 \end_inset 8516 8517 ( 8518 \begin_inset LatexCommand \cite{vmspec2} 8519 8520 \end_inset 8521 8522 , page 143). 8523 The tests 8524 \layout Itemize 8525 8526 ensure that the referenced method or field exists in the given class 8527 \layout Itemize 8528 8529 check that the referenced method or field has the indicated descriptor (signatur 8530 e) 8531 \layout Itemize 8532 8533 check that the currently executing method has access to the referenced method 8534 or field. 8535 \layout Standard 8536 8537 JustIce has no run-time system and so the tests of pass four are performed 8538 in pass 3a. 8539 \layout Standard 8540 8541 There are tests that have to be performed at run-time: for example, if an 8542 object referenced by an object reference on top of the operand stack implements 8543 a certain interface or not 8544 \begin_inset LatexCommand \cite{Fong2-WWW} 8545 8546 \end_inset 8547 8548 . 8549 These are not considered part of the pass four verification. 8550 \layout Chapter 8551 8552 Implementation of the Verification Passes 8553 \layout Standard 8554 8555 Occasionally, the behaviour of other verifier implementations was explained 8556 in section 8557 \begin_inset LatexCommand \ref{SpecPasses} 8558 8559 \end_inset 8560 8561 8562 \emph on 8563 . 8564 8565 \emph default 8566 This is not a mistake; the Java Virtual Machine Specification, Second Edition 8567 8568 \begin_inset LatexCommand \cite{vmspec2} 8569 8570 \end_inset 8571 8572 is unfortunately not detailed enough to make a clean-room implementation 8573 of the JVM verifier possible. 8574 Having a close look at the behaviour of existing verifier implementations 8575 is sometimes necessary to interpret the specification correctly. 8576 For that reason, the behaviour of these implementations is part of the 8577 specification of JustIce whereever appropriate. 8578 Still, there are some minor differences in behaviour between JustIce and 8579 the traditional JVM built-in verifiers. 8580 These differences were observed by using the traditional verifiers, not 8581 by inspecting their source code. 8582 \layout Standard 8583 8584 JustIce is implemented in the Java programming language 8585 \begin_inset LatexCommand \cite{langspec2} 8586 8587 \end_inset 8588 8589 using the Byte Code Engineering Library 8590 \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 8591 8592 \end_inset 8593 8594 . 8595 \layout Section 8596 8597 Pass One 8598 \layout Standard 8599 8600 The Byte Code Engineering Library (BCEL) presents an object oriented view 8601 of the class file structure. 8602 Therefore, an integral part of that library is parsing class files. 8603 JustIce uses the BCEL, so there was nothing left to do to load a class 8604 file in. 8605 Only minor changes were made to the BCEL to make it more verbose when exception 8606 al situations occur; i.e., when a garbled class file is loaded in. 8607 The BCEL uses Java's exception mechanism to signal these situations; JustIce 8608 transforms this behaviour into the behaviour expected by users of the Verificat 8609 ion API (see section 8610 \begin_inset LatexCommand \ref{Verification API} 8611 8612 \end_inset 8613 8614 ). 8615 \layout Subsubsection 8616 8617 Comparison to Sun's Implementation 8618 \layout Standard 8619 8620 There does not seem to be any difference in behaviour between JustIce and 8621 the traditional verifiers. 8622 Still, this conviction is a result of black box tests so it might not be 8623 true in corner cases. 8624 \layout Standard 8625 8626 Unknown attributes are ignored (though JustIce records a warning message, 8627 where the traditional verifiers don't). 8628 \layout Standard 8629 8630 Trailing bytes at the end of the class file are ignored in both versions, 8631 contradicting the specification. 8632 This was necessary because some Java run-time environments are broken concernin 8633 g the handling of .JAR archive files. 8634 The mechanism of loading class files from these archives files using the 8635 Java Platform's API is used by BCEL and probably by Sun's JVM, too. 8636 It is possible that this is the reason why Sun's verifier itself does not 8637 enforce this constraint. 8638 However, it does not really pose a threat to the integrity of any JVM known 8639 to the author. 8640 There is no entry in the 8641 \family typewriter 8642 ClassFile 8643 \family default 8644 structure (see section 8645 \begin_inset LatexCommand \ref{Classfile Structure} 8646 8647 \end_inset 8648 8649 ) stating how long the class file is in its entirety, so a JVM implementor 8650 cannot possibly base a wrong decision on that. 8651 8652 \layout Section 8653 8654 8655 \begin_inset LatexCommand \label{Pass2Impl} 8656 8657 \end_inset 8658 8659 Pass Two 8660 \layout Standard 8661 8662 JustIce does perform 8663 \begin_inset Quotes eld 8664 \end_inset 8665 8666 all verification that can be performed without looking at the bytecodes 8667 \begin_inset Quotes erd 8668 \end_inset 8669 8670 in pass two. 8671 For some reasons (like determining a valid ancestor hierarchy of a class), 8672 pass two of JustIce has to load referenced classes. 8673 Of course, this is done in a careful way: by pass-one-verifying them. 8674 If loading of a referenced class should fail (i.e., verification pass one 8675 fails on this class), the referencing class is rejected by JustIce's pass 8676 two. 8677 Pass two of JustIce does not pass-two-verify any referenced classes. 8678 \layout Standard 8679 8680 Also, JustIce's pass two emits a wealth of (warning) messages. 8681 Their target is to guide a bytecode engineer to create class files that 8682 are indistinguishable from those created by Sun's 8683 \emph on 8684 javac 8685 \emph default 8686 compiler with no debugging output. 8687 For example, the use of 8688 \family typewriter 8689 LineNumberTable 8690 \family default 8691 attributes (see section 8692 \begin_inset LatexCommand \ref{LineNumberTableAttribute} 8693 8694 \end_inset 8695 8696 ) is discouraged, because these atributes are only useful for debugging 8697 purposes. 8698 Still, they can be the reason for a class file to be rejected -- to be 8699 on the safe side, finished applications for the JVM should not be shipped 8700 with this debug information. 8701 \layout Standard 8702 8703 Most of the checks of pass two were implemented using the Visitor programming 8704 pattern 8705 \begin_inset LatexCommand \cite{DesignPatterns} 8706 8707 \end_inset 8708 8709 provided by the BCEL's 8710 \emph on 8711 de.fub.byte\SpecialChar \- 8712 code.class\SpecialChar \- 8713 file 8714 \emph default 8715 API. 8716 This made it possible to have all the verification split into several methods 8717 without having to define artificial boundaries. 8718 For instance, a 8719 \family typewriter 8720 ConstantValue 8721 \family default 8722 attribute is verified in a method called 8723 \emph on 8724 visitConstantValue(ConstantValue) 8725 \emph default 8726 . 8727 This is a use of the object oriented view of class files the BCEL offers. 8728 \layout Subsubsection 8729 8730 Comparison to Sun's Implementation 8731 \layout Standard 8732 8733 JustIce does not distinguish between run-time or link-time because it was 8734 not intended to implement a JVM. 8735 Therefore, the notion of 8736 \emph on 8737 resolving 8738 \emph default 8739 (see section 8740 \begin_inset LatexCommand \ref{SpecPassTwo} 8741 8742 \end_inset 8743 8744 ) is useless for JustIce. 8745 The author believes that the specification of pass two given by Sun closely 8746 reflects their implementation (or the other way around) 8747 \begin_float footnote 8748 \layout Standard 8749 8750 The Java Virtual Machine Specification, Second Edition, began as an internal 8751 project documentation ( 8752 \begin_inset LatexCommand \cite{vmspec2} 8753 8754 \end_inset 8755 8756 , page xiv). 8757 Unfortunately, this can still be felt sometimes. 8758 \end_float 8759 . 8760 \layout Standard 8761 8762 Sometimes, there are ambiguities in the specification. 8763 For instance, it is said that 8764 \begin_inset Quotes eld 8765 \end_inset 8766 8767 If the constant pool of a class or interface refers to any class or interface 8768 that is not a member of a package, its 8769 \family typewriter 8770 ClassFile 8771 \family default 8772 structure must have exactly one 8773 \family typewriter 8774 InnerClasses 8775 \family default 8776 attribute in its 8777 \family typewriter 8778 attributes 8779 \family default 8780 table 8781 \begin_inset Quotes erd 8782 \end_inset 8783 8784 . 8785 A class or interface that is 8786 \begin_inset Quotes eld 8787 \end_inset 8788 8789 not member of a package 8790 \begin_inset Quotes erd 8791 \end_inset 8792 8793 is better known as a 8794 \emph on 8795 nested class 8796 \emph default 8797 or 8798 \emph on 8799 inner class 8800 \emph default 8801 8802 \begin_inset LatexCommand \cite{InnerSpec} 8803 8804 \end_inset 8805 8806 , but this is something specific to the Java language. 8807 The 8808 \emph on 8809 javac 8810 \emph default 8811 compiler creates multiple, often funny-named 8812 \begin_float footnote 8813 \layout Standard 8814 8815 For anonymous classes defined in a class 8816 \emph on 8817 X 8818 \emph default 8819 the names are 8820 \emph on 8821 X$1 8822 \emph default 8823 , 8824 \emph on 8825 X$2 8826 \emph default 8827 and so on. 8828 For a named inner class 8829 \emph on 8830 I 8831 \emph default 8832 defined in class 8833 \emph on 8834 C 8835 \emph default 8836 the name is 8837 \emph on 8838 C$I 8839 \emph default 8840 . 8841 There is, however, no guarantee for that: this is only observed behaviour 8842 of javac. 8843 Please see section 8844 \begin_inset LatexCommand \ref{InnerBug} 8845 8846 \end_inset 8847 8848 for an example how this behaviour can lead to unexpected problems. 8849 \end_float 8850 class files that are otherwise indistinguishable from normal class files. 8851 \layout Standard 8852 8853 Therefore, it is generally not possible to decide if such an attribute is 8854 missing; therefore Sun's implementation does not check this constraint. 8855 JustIce, in contrast, uses its warning mechanism if the name of a referenced 8856 class or interface could be a name of an inner class created by the 8857 \emph on 8858 javac 8859 \emph default 8860 compiler and the 8861 \family typewriter 8862 InnerClass 8863 \family default 8864 attribute is missing. 8865 \layout Standard 8866 8867 The sets of accepted or rejected class files concerning pass two are equal 8868 using both Sun's implementation and JustIce, as exhaustive tests show. 8869 This can, however, not be proven because one would need to analyze Sun's 8870 source code for that (which is not intended: as already mentioned, JustIce 8871 is a clean-room implementation). 8872 \layout Section 8873 8874 Pass Three 8875 \layout Subsection 8876 8877 Pass 3a 8878 \layout Standard 8879 8880 One feature of the BCEL's 8881 \emph on 8882 de.fub.bytecode.generic 8883 \emph default 8884 package is parsing code attributes of methods and transforming them into 8885 so-called 8886 \family typewriter 8887 Instruction\SpecialChar \- 8888 List 8889 \family default 8890 objects. 8891 Consequently, this feature is used to implement pass 3a; a few additional 8892 checks have been implemented where BCEL is too 8893 \begin_inset Quotes eld 8894 \end_inset 8895 8896 trustful 8897 \begin_inset Quotes erd 8898 \end_inset 8899 8900 when parsing, i.e., where BCEL relies on the correctness of the class file. 8901 \layout Standard 8902 8903 Pass 3a consists of the checking of static constraints on instructions and 8904 static constraints on operands of these instructions. 8905 The successful creation an an 8906 \family typewriter 8907 Instruction\SpecialChar \- 8908 List 8909 \family default 8910 object already implies that the static constraints on instructions are 8911 satisfied. 8912 Similar to pass one, JustIce transforms the behaviour of BCEL's exception 8913 mechanism into the behaviour expected by users of the Verification API 8914 (see section 8915 \begin_inset LatexCommand \ref{Verification API} 8916 8917 \end_inset 8918 8919 ). 8920 \layout Standard 8921 8922 The 8923 \emph on 8924 de.fub.byte\SpecialChar \- 8925 code.ge\SpecialChar \- 8926 ne\SpecialChar \- 8927 ric 8928 \emph default 8929 API provided by BCEL offers a Visitor design pattern similar to the one 8930 of the 8931 \emph on 8932 de.fub.byte\SpecialChar \- 8933 code.class\SpecialChar \- 8934 file 8935 \emph default 8936 API. 8937 The tests for the static constraints on operands of instructions are implemente 8938 d by using it. 8939 For example, the constraints put on the operands of any 8940 \latex latex 8941 8942 \backslash 8943 texttt{iload} 8944 \latex default 8945 instruction are verified using a 8946 \emph on 8947 visitILOAD(ILOAD) 8948 \emph default 8949 method defined in a Visitor class. 8950 This Visitor class implements all the checks for integrity of all instruction's 8951 operands. 8952 Algorithm 8953 \begin_inset LatexCommand \ref{visitILOADstaticoperands} 8954 8955 \end_inset 8956 8957 shows the impementation of the 8958 \emph on 8959 visitILOAD(ILOAD) 8960 \emph default 8961 method. 8962 \begin_float alg 8963 \layout Caption 8964 8965 8966 \begin_inset LatexCommand \label{visitILOADstaticoperands} 8967 8968 \end_inset 8969 8970 visitILOAD, Visitor ensuring static constraints on operands of instructions 8971 \layout Standard 8972 8973 8974 \family typewriter 8975 \SpecialChar \- 8976 \SpecialChar ~ 8977 /** Checks if the constraints of operands of the said instruction(s) are 8978 satisfied. 8979 */ 8980 \newline 8981 \SpecialChar \- 8982 public void visitILOAD(ILOAD o){ 8983 \newline 8984 \SpecialChar \- 8985 \SpecialChar ~ 8986 \SpecialChar ~ 8987 int idx = o.getIndex(); 8988 \newline 8989 \SpecialChar \- 8990 \SpecialChar ~ 8991 \SpecialChar ~ 8992 if (idx < 0){ 8993 \newline 8994 \SpecialChar \- 8995 \SpecialChar ~ 8996 \SpecialChar ~ 8997 \SpecialChar ~ 8998 \SpecialChar ~ 8999 constraintViolated(o, "Index '"+idx+"' must be non-negative."); 9000 \newline 9001 \SpecialChar \- 9002 \SpecialChar ~ 9003 \SpecialChar ~ 9004 } 9005 \newline 9006 \SpecialChar \- 9007 \SpecialChar ~ 9008 \SpecialChar ~ 9009 else{ 9010 \newline 9011 \SpecialChar \- 9012 \SpecialChar ~ 9013 \SpecialChar ~ 9014 \SpecialChar ~ 9015 \SpecialChar ~ 9016 int maxminus1 = max_locals()-1; 9017 \newline 9018 \SpecialChar \- 9019 \SpecialChar ~ 9020 \SpecialChar ~ 9021 \SpecialChar ~ 9022 \SpecialChar ~ 9023 if (idx > maxminus1){ 9024 \newline 9025 \SpecialChar \- 9026 \SpecialChar ~ 9027 \SpecialChar ~ 9028 \SpecialChar ~ 9029 \SpecialChar ~ 9030 \SpecialChar ~ 9031 \SpecialChar ~ 9032 constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 9033 '"+maxminus1+"'."); 9034 \newline 9035 \SpecialChar \- 9036 \SpecialChar ~ 9037 \SpecialChar ~ 9038 \SpecialChar ~ 9039 \SpecialChar ~ 9040 } 9041 \newline 9042 \SpecialChar \- 9043 \SpecialChar ~ 9044 \SpecialChar ~ 9045 } 9046 \newline 9047 } 9048 \end_float 9049 \layout Standard 9050 9051 JustIce does not provide any run-time, so the tests of pass four (see section 9052 9053 \begin_inset LatexCommand \ref{Pass4Spec} 9054 9055 \end_inset 9056 9057 ) are not delayed until run-time, but performed here. 9058 \layout Subsubsection 9059 9060 Comparison to Sun's Implementation 9061 \layout Standard 9062 9063 Sun does not distinguish pass 3a and pass 3b. 9064 However, Sun's verifiers also have to ensure that the static constraints 9065 on instructions are satisfied before starting data flow analysis. 9066 \layout Standard 9067 9068 This is obvious because a data structure has to be built before the data 9069 flow analyzer can be run; and this data structure has to be built carefully 9070 \begin_float footnote 9071 \layout Standard 9072 9073 This actually means verifying the structural integrity of the bytecodes. 9074 \end_float 9075 because passes one and two did not look at the bytecodes before. 9076 \layout Standard 9077 9078 JustIce does implement pass four checks in pass 3a which Sun's verifiers 9079 do not. 9080 Because JustIce provides no run-time, the outcome of a verification failure 9081 is reported instantly. 9082 Traditional JVMs are required to silently delay the actions triggered by 9083 that knowledge until run-time. 9084 \layout Subsection 9085 9086 Pass 3b 9087 \layout Standard 9088 9089 JustIce aims at implementing Sun's data flow analyzing algorithm as closely 9090 as possible. 9091 First, a control flow graph is built --- which implies analyzing a method's 9092 subroutine calling structure first. 9093 \layout Standard 9094 9095 After that an implementation of the core algorithm sketched by Sun Microsystems 9096 is started. 9097 Verification failure is internally signalled by the Java exception handling 9098 mechanism which is then transformed to match the Verification API (see 9099 section 9100 \begin_inset LatexCommand \ref{Verification API} 9101 9102 \end_inset 9103 9104 ). 9105 \layout Subsubsection 9106 9107 9108 \begin_inset LatexCommand \label{SubroutineImpl} 9109 9110 \end_inset 9111 9112 Subroutines 9113 \layout Standard 9114 9115 Subroutines are modeled as instances of the 9116 \family typewriter 9117 Subroutine 9118 \family default 9119 interface 9120 \emph on 9121 . 9122 9123 \emph default 9124 They provide the following methods (note that an 9125 \family typewriter 9126 InstructionHandle 9127 \family default 9128 is the BCEL's programming handle to instruction objects and that 9129 \emph on 9130 X[] 9131 \emph default 9132 is the common Java notation for 9133 \emph on 9134 array of 9135 \emph default 9136 9137 \emph on 9138 X 9139 \emph default 9140 ): 9141 \layout Itemize 9142 9143 9144 \emph on 9145 boolean contains(InstructionHandle) 9146 \emph default 9147 9148 \newline 9149 Returns true if and only if the given 9150 \family typewriter 9151 InstructionHandle 9152 \family default 9153 refers to an instruction that is part of this subroutine, 9154 \layout Itemize 9155 9156 9157 \emph on 9158 InstructionHandle[] getInstructions() 9159 \emph default 9160 9161 \newline 9162 Returns all instructions that together form this subroutine, 9163 \layout Itemize 9164 9165 9166 \emph on 9167 int[] getAccessedLocalsIndices() 9168 \emph default 9169 9170 \newline 9171 Returns an array containing the indices of the local variable slots accessed 9172 by this subroutine (read-accessed, write-accessed or both); local variables 9173 referenced by subroutines of this subroutine are not included, 9174 \layout Itemize 9175 9176 9177 \emph on 9178 int[] getRecursivelyAccessedLocalsIndices() 9179 \emph default 9180 9181 \emph on 9182 9183 \newline 9184 9185 \emph default 9186 Returns an array containing the indices of the local variable slots accessed 9187 by this subroutine (read-accessed, write-accessed or both); local variables 9188 referenced by subroutines of this subroutine are included, 9189 \layout Itemize 9190 9191 9192 \emph on 9193 Subroutine[] subSubs() 9194 \emph default 9195 9196 \emph on 9197 9198 \newline 9199 9200 \emph default 9201 Returns the subroutines that are directly called from this subroutine, 9202 \layout Itemize 9203 9204 9205 \emph on 9206 InstructionHandle[] getEnteringJsrInstructions() 9207 \emph default 9208 9209 \newline 9210 Returns all the JsrInstructions that have the first instruction of this 9211 subroutine as their target, 9212 \layout Itemize 9213 9214 9215 \emph on 9216 InstructionHandle getLeavingRET() 9217 \emph default 9218 9219 \newline 9220 Returns the one and only RET that leaves the subroutine. 9221 \layout Standard 9222 9223 Together with information from a simple analysis of the possible control 9224 flow transfer of all the other instructions but 9225 \latex latex 9226 9227 \backslash 9228 texttt{ret} 9229 \latex default 9230 (see section 9231 \begin_inset LatexCommand \ref{Pass3Spec} 9232 9233 \end_inset 9234 9235 ), a control flow graph is built. 9236 \layout Subsubsection 9237 9238 The Control Flow Graph 9239 \layout Standard 9240 9241 The control flow graph is a single instance with respect to a given method 9242 to verify. 9243 It is defined by providing access to a set of contexts of instructions. 9244 These are modeled as instances of the 9245 \emph on 9246 9247 \family typewriter 9248 \emph default 9249 In\SpecialChar \- 9250 struc\SpecialChar \- 9251 tion\SpecialChar \- 9252 Con\SpecialChar \- 9253 text 9254 \family default 9255 interface. 9256 \layout Standard 9257 9258 These instances enclose 9259 \family typewriter 9260 InstructionHandle 9261 \family default 9262 objects (which represent an instruction in the bytecode), but they augment 9263 these objects with type information (a set of 9264 \family typewriter 9265 Frame 9266 \family default 9267 s, see below) as needed by the data flow analysis algorithm. 9268 Also, a method called 9269 \emph on 9270 getSuccessors() 9271 \emph default 9272 is provided that calculates the possible control flow successors of a given 9273 9274 \family typewriter 9275 In\SpecialChar \- 9276 struc\SpecialChar \- 9277 tion\SpecialChar \- 9278 Con\SpecialChar \- 9279 text 9280 \family default 9281 instance. 9282 \layout Standard 9283 9284 The most notable method defined in the 9285 \family typewriter 9286 In\SpecialChar \- 9287 struc\SpecialChar \- 9288 tion\SpecialChar \- 9289 Con\SpecialChar \- 9290 text 9291 \family default 9292 \emph on 9293 9294 \emph default 9295 interface is, however, the 9296 \emph on 9297 execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) 9298 \emph default 9299 method. 9300 This method is used to symbolically execute a given instruction. 9301 \layout Standard 9302 9303 The 9304 \family typewriter 9305 ArrayList 9306 \family default 9307 \emph on 9308 9309 \emph default 9310 argument is there to record the subroutine calling chain. 9311 The properly-nested property of JustIce subroutines is exploited here: 9312 one can simply count 9313 \latex latex 9314 9315 \backslash 9316 texttt{jsr} 9317 \latex default 9318 / 9319 \latex latex 9320 9321 \backslash 9322 texttt{jsr 9323 \backslash 9324 _w} 9325 \latex default 9326 and 9327 \latex latex 9328 9329 \backslash 9330 texttt{ret} 9331 \latex default 9332 instructions, similar to counting opened and closed braces in mathematical 9333 expressions. 9334 \layout Standard 9335 9336 A 9337 \family typewriter 9338 Frame 9339 \family default 9340 is JustIce's model of an 9341 \emph on 9342 execution frame 9343 \emph default 9344 : a local variables array model together with an operand stack model. 9345 Every 9346 \emph on 9347 InstructionContext 9348 \emph default 9349 instance is augmented with such a frame (to be precise, a set of such frames 9350 as discussed in the specification of subroutines, see section 9351 \begin_inset LatexCommand \ref{Pass3Spec} 9352 9353 \end_inset 9354 9355 ). 9356 \layout Standard 9357 9358 When frames are merged, the 9359 \emph on 9360 execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) 9361 \emph default 9362 method of some successor 9363 \family typewriter 9364 InstructionContext 9365 \family default 9366 is called. 9367 The 9368 \family typewriter 9369 Frame 9370 \family default 9371 argument represents is the current type information of the predecessing 9372 9373 \family typewriter 9374 InstructionContext. 9375 \layout Subsubsection 9376 9377 Visitors 9378 \layout Standard 9379 9380 As in pass 3a, the Visitor pattern of the BCEL 9381 \emph on 9382 de.fub.byte\SpecialChar \- 9383 code.ge\SpecialChar \- 9384 ne\SpecialChar \- 9385 ric 9386 \emph default 9387 API is also used in pass 3b. 9388 While it was used to verify the static constraints of pass three in pass 9389 3a, it is now used to verify the structural constraints. 9390 \layout Standard 9391 9392 Before an instruction 9393 \family typewriter 9394 X 9395 \family default 9396 is symbolically executed, the corresponding 9397 \emph on 9398 visitX(X) 9399 \emph default 9400 method is invoked on an 9401 \family typewriter 9402 InstConstraintVisitor 9403 \family default 9404 instance. 9405 This instance is there to verify all the preconditions are met to safely 9406 execute the instruction 9407 \family typewriter 9408 X 9409 \family default 9410 . 9411 The 9412 \family typewriter 9413 InstConstraintVisitor 9414 \family default 9415 class therefore holds information about the preconditions of all 212 valid 9416 Java bytecode instructions. 9417 A simplified version of this Visitor's 9418 \emph on 9419 visitILOAD(ILOAD) 9420 \emph default 9421 method is listed in algorithm 9422 \begin_inset LatexCommand \ref{visitILOADInstConstraints} 9423 9424 \end_inset 9425 9426 . 9427 \layout Standard 9428 9429 Similarly, the 9430 \emph on 9431 9432 \family typewriter 9433 \emph default 9434 ExecutionVisitor 9435 \family default 9436 class contains information about the behaviour of every bytecode instruction. 9437 An instance of this class is used to model the effect of the bytecode instructi 9438 ons on a 9439 \emph on 9440 Frame 9441 \emph default 9442 instance. 9443 Algorithm 9444 \begin_inset LatexCommand \ref{visitILOADExecution} 9445 9446 \end_inset 9447 9448 shows the 9449 \emph on 9450 visitILOAD(ILOAD) 9451 \emph default 9452 method of this Visitor. 9453 \layout Standard 9454 9455 \begin_float alg 9456 \layout Caption 9457 9458 9459 \begin_inset LatexCommand \label{visitILOADInstConstraints} 9460 9461 \end_inset 9462 9463 visitILOAD, Visitor ensuring the structural (dynamic) constraints of instruction 9464 s 9465 \layout Standard 9466 9467 9468 \family typewriter 9469 public void visitILOAD(ILOAD o){ 9470 \newline 9471 \SpecialChar \- 9472 \SpecialChar ~ 9473 \SpecialChar ~ 9474 \SpecialChar ~ 9475 \SpecialChar ~ 9476 \SpecialChar ~ 9477 int produce = o.produceStack(cpg); 9478 \newline 9479 \SpecialChar \- 9480 \SpecialChar ~ 9481 \SpecialChar ~ 9482 \SpecialChar ~ 9483 \SpecialChar ~ 9484 \SpecialChar ~ 9485 if ( produce + stack().slotsUsed() > stack().maxStack() ){ 9486 \newline 9487 \SpecialChar \- 9488 \SpecialChar ~ 9489 \SpecialChar ~ 9490 \SpecialChar ~ 9491 \SpecialChar ~ 9492 \SpecialChar ~ 9493 \SpecialChar ~ 9494 \SpecialChar ~ 9495 constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().ma 9496 xStack()-stack().slotsUsed())+" free stack slot(s) left. 9497 \backslash 9498 nStack: 9499 \backslash 9500 n"+stack()); 9501 \newline 9502 \SpecialChar \- 9503 \SpecialChar ~ 9504 \SpecialChar ~ 9505 \SpecialChar ~ 9506 \SpecialChar ~ 9507 \SpecialChar ~ 9508 } 9509 \newline 9510 [\SpecialChar \ldots{} 9511 ] 9512 \newline 9513 \SpecialChar \- 9514 \SpecialChar ~ 9515 \SpecialChar ~ 9516 } 9517 \end_float 9518 \begin_float alg 9519 \layout Caption 9520 9521 9522 \begin_inset LatexCommand \label{visitILOADExecution} 9523 9524 \end_inset 9525 9526 visitILOAD, Visitor symbolically executing instructions 9527 \layout Standard 9528 9529 9530 \family typewriter 9531 /** Symbolically executes the corresponding Java Virtual Machine instruction. 9532 */ 9533 \newline 9534 \SpecialChar \- 9535 public void visitILOAD(ILOAD o){ 9536 \newline 9537 \SpecialChar \- 9538 \SpecialChar ~ 9539 \SpecialChar ~ 9540 stack().push(Type.INT); 9541 \newline 9542 \SpecialChar \- 9543 } 9544 \end_float 9545 \begin_float alg 9546 \layout Caption 9547 9548 Simplified Core Verification Algorithm of Pass 3b 9549 \layout Standard 9550 9551 9552 \series bold 9553 \size small 9554 public VerificationResult do_verify(Method m) 9555 \series default 9556 { 9557 \layout Standard 9558 9559 9560 \size small 9561 \SpecialChar \- 9562 \SpecialChar ~ 9563 \SpecialChar ~ 9564 ControlFlowGraph cfg; 9565 \layout Standard 9566 9567 9568 \size small 9569 \SpecialChar \- 9570 \SpecialChar ~ 9571 \SpecialChar ~ 9572 if (m.hasCode()) 9573 \layout Standard 9574 9575 9576 \size small 9577 \SpecialChar \- 9578 \SpecialChar ~ 9579 \SpecialChar ~ 9580 \SpecialChar ~ 9581 \SpecialChar ~ 9582 cfg = new ControlFlowGraph(m) 9583 \layout Standard 9584 9585 9586 \size small 9587 \SpecialChar \- 9588 \SpecialChar ~ 9589 \SpecialChar ~ 9590 else 9591 \layout Standard 9592 9593 9594 \size small 9595 \SpecialChar \- 9596 \SpecialChar ~ 9597 \SpecialChar ~ 9598 \SpecialChar ~ 9599 \SpecialChar ~ 9600 return Good_VerificationResult; 9601 \layout Standard 9602 9603 9604 \size small 9605 \SpecialChar \- 9606 \SpecialChar ~ 9607 \SpecialChar ~ 9608 Frame f = new Frame(); 9609 \shape slanted 9610 // local variables and operand stack 9611 \layout Standard 9612 9613 9614 \size small 9615 \SpecialChar \- 9616 \SpecialChar ~ 9617 \SpecialChar ~ 9618 f.localVariables().initialize(m.signature()); 9619 \shape slanted 9620 // put formal param types into loc. 9621 vars 9622 \layout Standard 9623 9624 9625 \size small 9626 \SpecialChar \- 9627 \SpecialChar ~ 9628 \SpecialChar ~ 9629 InstConstraintVisitor icv = new InstConstraintVisitor(); 9630 \layout Standard 9631 9632 9633 \size small 9634 \SpecialChar \- 9635 \SpecialChar ~ 9636 \SpecialChar ~ 9637 ExecutionVisitor ev = new ExecutionVisitor(); 9638 \layout Standard 9639 9640 9641 \size small 9642 \SpecialChar \- 9643 \SpecialChar ~ 9644 \SpecialChar ~ 9645 try{ 9646 \layout Standard 9647 9648 9649 \size small 9650 \SpecialChar \- 9651 \SpecialChar ~ 9652 \SpecialChar ~ 9653 \SpecialChar ~ 9654 \SpecialChar ~ 9655 circulationPump(cfg, f, icv, ev); 9656 \layout Standard 9657 9658 9659 \size small 9660 \SpecialChar \- 9661 \SpecialChar ~ 9662 \SpecialChar ~ 9663 } 9664 \layout Standard 9665 9666 9667 \size small 9668 \SpecialChar \- 9669 \SpecialChar ~ 9670 \SpecialChar ~ 9671 catch(VerificationFailure){ 9672 \layout Standard 9673 9674 9675 \size small 9676 \SpecialChar \- 9677 \SpecialChar ~ 9678 \SpecialChar ~ 9679 \SpecialChar ~ 9680 \SpecialChar ~ 9681 return Bad_VerificationResult; 9682 \layout Standard 9683 9684 9685 \size small 9686 \SpecialChar \- 9687 \SpecialChar ~ 9688 \SpecialChar ~ 9689 } 9690 \layout Standard 9691 9692 9693 \size small 9694 \SpecialChar \- 9695 \SpecialChar ~ 9696 \SpecialChar ~ 9697 return Good_VerificationResult; 9698 \layout Standard 9699 9700 9701 \size small 9702 } 9703 \newline 9704 9705 \layout Standard 9706 9707 9708 \series bold 9709 \size small 9710 public void circulationPump(ControlflowGraph cfg, Frame startFrame, InstConstrai 9711 ntVisitor icv, ExecutionVisitor ev) throws VerificationFailure 9712 \series default 9713 { 9714 \layout Standard 9715 9716 9717 \size small 9718 Instruction start = cfg.getFirstInstruction(); 9719 \layout Standard 9720 9721 9722 \shape slanted 9723 \size small 9724 /* 9725 \layout Standard 9726 9727 9728 \shape slanted 9729 \size small 9730 Now merge the first frame (type info) into the first instruction. 9731 \layout Standard 9732 9733 9734 \shape slanted 9735 \size small 9736 Empty list -> no instructions have been executed before. 9737 \layout Standard 9738 9739 9740 \shape slanted 9741 \size small 9742 */ 9743 \layout Standard 9744 9745 9746 \size small 9747 start.execute(startFrame, EmptyInstructionList, icv, ev); 9748 \layout Standard 9749 9750 9751 \shape slanted 9752 \size small 9753 /* 9754 \layout Standard 9755 9756 9757 \shape slanted 9758 \size small 9759 Q is a Queue of pairs (Instruction, InstructionList). 9760 \layout Standard 9761 9762 9763 \shape slanted 9764 \size small 9765 */ 9766 \layout Standard 9767 9768 9769 \size small 9770 Queue Q = EmptyQueue; 9771 \layout Standard 9772 9773 9774 \shape slanted 9775 \size small 9776 /* 9777 \layout Standard 9778 9779 9780 \shape slanted 9781 \size small 9782 Put the first instruction into the queue. 9783 This is similar to initializing a breadth first search. 9784 \layout Standard 9785 9786 9787 \shape slanted 9788 \size small 9789 */ 9790 \layout Standard 9791 9792 9793 \size small 9794 Q.add (start, EmptyInstructionList); 9795 \layout Standard 9796 9797 9798 \shape slanted 9799 \size small 9800 /* 9801 \layout Standard 9802 9803 9804 \shape slanted 9805 \size small 9806 The main loop 9807 \layout Standard 9808 9809 9810 \shape slanted 9811 \size small 9812 */ 9813 \layout Standard 9814 9815 9816 \size small 9817 while (Q.isNotEmpty()){ 9818 \layout Standard 9819 9820 9821 \size small 9822 \SpecialChar \- 9823 \SpecialChar ~ 9824 \SpecialChar ~ 9825 Instruction u = fst(Q.head()); 9826 \layout Standard 9827 9828 9829 \size small 9830 \SpecialChar \- 9831 \SpecialChar ~ 9832 \SpecialChar ~ 9833 InstructionList ec = snd(Q.head()); 9834 \layout Standard 9835 9836 9837 \size small 9838 \SpecialChar \- 9839 \SpecialChar ~ 9840 \SpecialChar ~ 9841 Q.removeHead(); 9842 \layout Standard 9843 9844 9845 \size small 9846 \SpecialChar \- 9847 \SpecialChar ~ 9848 \SpecialChar ~ 9849 InstructionList oldchain = ec; 9850 \layout Standard 9851 9852 9853 \size small 9854 \SpecialChar \- 9855 \SpecialChar ~ 9856 \SpecialChar ~ 9857 InstructionList newchain = ec++[u]; 9858 \layout Standard 9859 9860 9861 \size small 9862 \SpecialChar \- 9863 \SpecialChar ~ 9864 \SpecialChar ~ 9865 for (all successors v of u){ 9866 \layout Standard 9867 9868 9869 \size small 9870 \SpecialChar \- 9871 \SpecialChar ~ 9872 \SpecialChar ~ 9873 \SpecialChar ~ 9874 \SpecialChar ~ 9875 9876 \shape slanted 9877 /* 9878 \layout Standard 9879 9880 9881 \shape slanted 9882 \size small 9883 \SpecialChar \- 9884 \SpecialChar ~ 9885 \SpecialChar ~ 9886 \SpecialChar ~ 9887 \SpecialChar ~ 9888 execute returns true if type info has changed. 9889 It may throw VerificationFailures. 9890 \layout Standard 9891 9892 9893 \shape slanted 9894 \size small 9895 \SpecialChar \- 9896 \SpecialChar ~ 9897 \SpecialChar ~ 9898 \SpecialChar ~ 9899 \SpecialChar ~ 9900 */ 9901 \layout Standard 9902 9903 9904 \size small 9905 \SpecialChar \- 9906 \SpecialChar ~ 9907 \SpecialChar ~ 9908 \SpecialChar ~ 9909 \SpecialChar ~ 9910 if (v.execute(u.getOutFrame(oldchain), newchain,icv,ev)) 9911 \layout Standard 9912 9913 9914 \size small 9915 \SpecialChar \- 9916 \SpecialChar ~ 9917 \SpecialChar ~ 9918 \SpecialChar ~ 9919 \SpecialChar ~ 9920 \SpecialChar ~ 9921 \SpecialChar ~ 9922 Q.add((v, newchain)); 9923 \layout Standard 9924 9925 9926 \size small 9927 \SpecialChar \- 9928 \SpecialChar ~ 9929 \SpecialChar ~ 9930 } 9931 \layout Standard 9932 9933 9934 \size small 9935 } 9936 \end_float 9937 \layout Subsubsection 9938 9939 9940 \begin_inset LatexCommand \label{ComparisonSubroutines} 9941 9942 \end_inset 9943 9944 Comparison to Sun's Implementation 9945 \layout Standard 9946 9947 JustIce was originally aimed to be as compatible to Sun's implementation 9948 as possible. 9949 However, the unclear specification prevents clean room implementations 9950 (i.e., implementations whose programmers did not look into Sun's code) from 9951 perfect compatibility. 9952 \layout Standard 9953 9954 Fortunately, it JustIce closely matches Sun's implementation in its behaviour. 9955 As a test case, the author verified the transitive hull of the referenced 9956 class files starting with the 9957 \emph on 9958 de.fub.bytecode.verifier.Verifier 9959 \emph default 9960 class. 9961 This set includes most of the classes of the Java 2 API supplied by Sun 9962 Microsystems, i.e., a few hundreds of apparently correct classes. 9963 A very small number of class files was rejected by JustIce because of its 9964 different specification of subroutine constraints. 9965 No other rejects were encountered. 9966 \layout Standard 9967 9968 Most class files that are found to be rejected by Sun's verifier implementations 9969 are rejected by JustIce, too. 9970 \layout Standard 9971 9972 However, there are class file rejected by Sun's verifier implementations 9973 but not by JustIce. 9974 This should not occur, but JustIce does not mimic the programming errors 9975 of Sun's verifiers so far. 9976 Please see section 9977 \begin_inset LatexCommand \ref{javacRejected} 9978 9979 \end_inset 9980 9981 for a discussion on a selected incompatibility issue. 9982 \layout Standard 9983 9984 An automated testing suite could solidify the trust in JustIce's implementation 9985 which is not implemented yet. 9986 Please see section 9987 \begin_inset LatexCommand \ref{VerifierValidationSuite} 9988 9989 \end_inset 9990 9991 for a discussion on that topic. 9992 \layout Section 9993 9994 Pass Four 9995 \layout Standard 9996 9997 The tests Sun's verifiers perform during run-time but which in principle 9998 could be performed in pass three 9999 \emph on 10000 are 10001 \emph default 10002 performed in pass 3a by JustIce. 10003 \layout Subsubsection 10004 10005 Comparison to Sun's Implementation 10006 \layout Standard 10007 10008 It sems natural that Sun's verifier implements the specification by Sun. 10009 Obviously, JustIce has no run-time so JustIce has no pass four. 10010 The checks Sun performs in pass four 10011 \begin_float footnote 10012 \layout Standard 10013 10014 Some JVMs expose implementation mistakes concerning pass four verification. 10015 See section 10016 \begin_inset LatexCommand \ref{PassFourBug} 10017 10018 \end_inset 10019 10020 . 10021 \end_float 10022 are performed in pass 3a by JustIce. 10023 \layout Chapter 10024 10025 10026 \begin_inset LatexCommand \label{Verification API} 10027 10028 \end_inset 10029 10030 The Verification API 10031 \layout Section 10032 10033 Introduction 10034 \layout Standard 10035 10036 The Application Programming Interface (API) of JustIce uses object oriented 10037 design patterns 10038 \begin_inset LatexCommand \cite{DesignPatterns} 10039 10040 \end_inset 10041 10042 . 10043 Readers not familiar with design patterns are encouraged to read at least 10044 about the 10045 \emph on 10046 Visitor 10047 \emph default 10048 , 10049 \emph on 10050 Singleton 10051 \emph default 10052 , 10053 \emph on 10054 Observer 10055 \emph default 10056 and 10057 \emph on 10058 Factory 10059 \emph default 10060 patterns. 10061 \layout Standard 10062 10063 JustIce currently consists of four packages: 10064 \emph on 10065 de.fub.byte\SpecialChar \- 10066 code.veri\SpecialChar \- 10067 fier 10068 \emph default 10069 , 10070 \emph on 10071 de.fub. 10072 byte\SpecialChar \- 10073 code.veri\SpecialChar \- 10074 fier.exc 10075 \emph default 10076 , 10077 \emph on 10078 de.fub.byte\SpecialChar \- 10079 code.veri\SpecialChar \- 10080 fier.statics 10081 \emph default 10082 and 10083 \emph on 10084 de.fub.byte\SpecialChar \- 10085 code.veri\SpecialChar \- 10086 fier. 10087 struc\SpecialChar \- 10088 tu\SpecialChar \- 10089 rals 10090 \emph default 10091 . 10092 (We shall from now on omit the preceding 10093 \emph on 10094 de.fub.byte\SpecialChar \- 10095 code 10096 \emph default 10097 .) The most important of them is the 10098 \emph on 10099 verifier 10100 \emph default 10101 package. 10102 The class 10103 \family typewriter 10104 VerifierFactory 10105 \family default 10106 can be found here; this is the place where all verification starts. 10107 The 10108 \family typewriter 10109 Veri\SpecialChar \- 10110 fier\SpecialChar \- 10111 Fac\SpecialChar \- 10112 tory 10113 \family default 10114 creates 10115 \family typewriter 10116 Verifier 10117 \family default 10118 instances; only the 10119 \family typewriter 10120 VerifierFactory 10121 \family default 10122 can create these instances. 10123 A 10124 \family typewriter 10125 Verifier 10126 \family default 10127 instance, in turn, has a one-to-one relationship with a class file to verify, 10128 10129 \begin_inset Quotes eld 10130 \end_inset 10131 10132 its class 10133 \begin_inset Quotes erd 10134 \end_inset 10135 10136 . 10137 You can instruct a 10138 \family typewriter 10139 Verifier 10140 \family default 10141 instance to run a verification pass on its class yielding a 10142 \family typewriter 10143 VerificationResult 10144 \family default 10145 . 10146 \layout Standard 10147 10148 All class files are fetched from the BCEL's class file repository, i.e., the 10149 class 10150 \family typewriter 10151 Re\SpecialChar \- 10152 po\SpecialChar \- 10153 si\SpecialChar \- 10154 to\SpecialChar \- 10155 ry 10156 \family default 10157 . 10158 The class files stored there are either put there by the user or they are 10159 read from the file system. 10160 For a bytecode engineer who uses the BCEL this is convenient, because one 10161 does not have to save the dynamically created class file first in order 10162 to load it into JustIce. 10163 \layout Standard 10164 10165 Pass 1 and pass 2 are related to the 10166 \family typewriter 10167 ClassFile 10168 \family default 10169 structure as such; passes 3a and 3b verify the bytecode of a method. 10170 If a class file was created using the BCEL, the BCEL user already knows 10171 how the 10172 \family typewriter 10173 JavaClass 10174 \family default 10175 object looks like 10176 \begin_float footnote 10177 \layout Standard 10178 10179 A 10180 \family typewriter 10181 JavaClass 10182 \family default 10183 object represents a class file in the BCEL. 10184 \end_float 10185 . 10186 The number of methods is known and the order of the methods in the class 10187 file is known. 10188 \layout Standard 10189 10190 However, if this is not the case, one usually does not know the number of 10191 methods in a class file or the order of these methods. 10192 To carefully extract this information from an untrusted class file, one 10193 should first let a pass-2-verification run on this file. 10194 Afterwards, the information can be read from the 10195 \family typewriter 10196 JavaClass 10197 \family default 10198 object the BCEL offers. 10199 \layout Standard 10200 10201 Finally, one is able to supply the 10202 \begin_inset Quotes eld 10203 \end_inset 10204 10205 method index 10206 \begin_inset Quotes erd 10207 \end_inset 10208 10209 needed by verification passes 3a and 3b. 10210 \layout Standard 10211 10212 Basically, after pass 2 has been run successfully on a class file, one can 10213 safely use the methods in the BCEL's 10214 \emph on 10215 classfile 10216 \emph default 10217 package 10218 \emph on 10219 10220 \emph default 10221 on that class file. 10222 After pass 3a has been run successfully on a method, one can safely work 10223 on that method using the BCEL's 10224 \emph on 10225 generic 10226 \emph default 10227 package. 10228 After pass 3b has been run successfully on all methods in a class file, 10229 this class file will not be rejected by other verifiers. 10230 \layout Standard 10231 10232 Often, the run of a verification pass implies recursively verifying other 10233 class files as well (because they are somehow referenced). 10234 Therefore, 10235 \emph on 10236 Verifier 10237 \emph default 10238 instances for these referenced classes are created transparently. 10239 To be notified when such an event occurs, one can implement the 10240 \emph on 10241 VerifierFactoryObserver 10242 \emph default 10243 interface and let the 10244 \emph on 10245 VerifierFactory 10246 \emph default 10247 register your implementation. 10248 \layout Standard 10249 10250 \begin_float fig 10251 \layout Standard 10252 \align center 10253 10254 \begin_inset Figure size 595 863 10255 file VerificationAPI.eps 10256 width 3 100 10257 angle 90 10258 flags 1 10259 10260 \end_inset 10261 10262 10263 \layout Caption 10264 10265 UML class diagram of the Verification API 10266 \end_float 10267 \layout Standard 10268 10269 A Verifier creates instances of PassVerifiers. 10270 A PassVerifier instance in charge of performing some later verification 10271 pass transparently creates PassVerifier instances for the preceding passes. 10272 Therefore, users of the Verification API do not have to care about the 10273 order of verification passes; i.e., earlier passes are run always before 10274 later passes. 10275 All verification results are cached; this way an unsual order of calls 10276 to the 10277 \emph on 10278 doPassX() 10279 \emph default 10280 methods of the 10281 \emph on 10282 Verifier 10283 \emph default 10284 class does not even waste computing time. 10285 \begin_float fig 10286 \layout Standard 10287 \align center 10288 10289 \begin_inset Figure size 595 631 10290 file V_API_SD.eps 10291 width 3 100 10292 height 3 75 10293 flags 9 10294 10295 \end_inset 10296 10297 10298 \layout Caption 10299 10300 Informal UML sequence diagram showing the dependency of verification pass 10301 two on verification pass one. 10302 \end_float 10303 \layout Section 10304 10305 Some Example Code 10306 \layout Standard 10307 10308 The code below shows an example of how to use the API provided by JustIce. 10309 It will verify the transitive hull of all referenced class files. 10310 Normally, while verifying a class, referenced classes are recursively verified 10311 performing 10312 \emph on 10313 earlier 10314 \emph default 10315 passes. 10316 Verifiers that are using pass 1 on their class will not load in any other 10317 classes (see section 10318 \begin_inset LatexCommand \ref{SpecPasses} 10319 10320 \end_inset 10321 10322 ). 10323 Therefore, normally the transitive hull is 10324 \emph on 10325 not 10326 \emph default 10327 verified completely (it usually does not make sense to verify it, though 10328 -- it's done here only to give an example of what can be done). 10329 \family typewriter 10330 \size small 10331 10332 \newline 10333 10334 \newline 10335 01\SpecialChar ~ 10336 package de.fub.bytecode.verifier; 10337 \newline 10338 02\SpecialChar ~ 10339 import de.fub.bytecode.verifier.*; 10340 \newline 10341 03\SpecialChar ~ 10342 import de.fub.bytecode.classfile.*; 10343 \newline 10344 04\SpecialChar ~ 10345 import de.fub.bytecode.*; 10346 \newline 10347 05\SpecialChar ~ 10348 /** 10349 \newline 10350 06\SpecialChar ~ 10351 \SpecialChar ~ 10352 * This class has a main method implementing a demonstration program 10353 \newline 10354 07\SpecialChar ~ 10355 \SpecialChar ~ 10356 * of how to use the VerifierFactoryObserver. 10357 It transitively verifies 10358 \newline 10359 08\SpecialChar ~ 10360 \SpecialChar ~ 10361 * all class files encountered; this may take up a lot of time and, 10362 \newline 10363 09\SpecialChar ~ 10364 \SpecialChar ~ 10365 * more notably, memory. 10366 10367 \newline 10368 10\SpecialChar ~ 10369 \SpecialChar ~ 10370 * 10371 \newline 10372 11\SpecialChar ~ 10373 \SpecialChar ~ 10374 * @author Enver Haase 10375 \newline 10376 12\SpecialChar ~ 10377 \SpecialChar ~ 10378 */ 10379 \newline 10380 13\SpecialChar ~ 10381 public class TransitiveHull implements VerifierFactoryObserver{ 10382 \newline 10383 14\SpecialChar ~ 10384 \SpecialChar ~ 10385 \SpecialChar ~ 10386 /** Used for indentation. 10387 */ 10388 \newline 10389 15\SpecialChar ~ 10390 \SpecialChar ~ 10391 \SpecialChar ~ 10392 private int indent = 0; 10393 \newline 10394 16\SpecialChar ~ 10395 \SpecialChar ~ 10396 \SpecialChar ~ 10397 /** Not publicly instantiable. 10398 */ 10399 \newline 10400 17\SpecialChar ~ 10401 \SpecialChar ~ 10402 \SpecialChar ~ 10403 private TransitiveHull(){ } 10404 \newline 10405 18 10406 \newline 10407 19\SpecialChar ~ 10408 \SpecialChar ~ 10409 \SpecialChar ~ 10410 /* Implementing VerifierFactoryObserver. 10411 */ 10412 \newline 10413 20\SpecialChar ~ 10414 \SpecialChar ~ 10415 \SpecialChar ~ 10416 public void update(String classname){ 10417 \newline 10418 21\SpecialChar ~ 10419 \SpecialChar ~ 10420 \SpecialChar ~ 10421 \SpecialChar ~ 10422 \SpecialChar ~ 10423 for (int i=0; i<indent; i++) { 10424 \newline 10425 22\SpecialChar ~ 10426 \SpecialChar ~ 10427 \SpecialChar ~ 10428 \SpecialChar ~ 10429 \SpecialChar ~ 10430 \SpecialChar ~ 10431 \SpecialChar ~ 10432 System.out.print(" "); 10433 \newline 10434 23\SpecialChar ~ 10435 \SpecialChar ~ 10436 \SpecialChar ~ 10437 \SpecialChar ~ 10438 \SpecialChar ~ 10439 } 10440 \newline 10441 24\SpecialChar ~ 10442 \SpecialChar ~ 10443 \SpecialChar ~ 10444 \SpecialChar ~ 10445 \SpecialChar ~ 10446 System.out.println(classname); 10447 \newline 10448 25\SpecialChar ~ 10449 \SpecialChar ~ 10450 \SpecialChar ~ 10451 \SpecialChar ~ 10452 \SpecialChar ~ 10453 indent += 1; 10454 \newline 10455 26\SpecialChar ~ 10456 \SpecialChar ~ 10457 \SpecialChar ~ 10458 \SpecialChar ~ 10459 \SpecialChar ~ 10460 Verifier v = VerifierFactory.getVerifier(classname); 10461 \newline 10462 27\SpecialChar ~ 10463 \SpecialChar ~ 10464 \SpecialChar ~ 10465 \SpecialChar ~ 10466 \SpecialChar ~ 10467 VerificationResult vr; 10468 \newline 10469 28\SpecialChar ~ 10470 \SpecialChar ~ 10471 \SpecialChar ~ 10472 \SpecialChar ~ 10473 \SpecialChar ~ 10474 vr = v.doPass1(); 10475 \newline 10476 29\SpecialChar ~ 10477 \SpecialChar ~ 10478 \SpecialChar ~ 10479 \SpecialChar ~ 10480 \SpecialChar ~ 10481 if (vr != VerificationResult.VR_OK) 10482 \newline 10483 30\SpecialChar ~ 10484 \SpecialChar ~ 10485 \SpecialChar ~ 10486 \SpecialChar ~ 10487 \SpecialChar ~ 10488 \SpecialChar ~ 10489 \SpecialChar ~ 10490 System.out.println("Pass 1: 10491 \backslash 10492 n"+vr); 10493 \newline 10494 31\SpecialChar ~ 10495 \SpecialChar ~ 10496 \SpecialChar ~ 10497 \SpecialChar ~ 10498 \SpecialChar ~ 10499 vr = v.doPass2(); 10500 \newline 10501 32\SpecialChar ~ 10502 \SpecialChar ~ 10503 \SpecialChar ~ 10504 \SpecialChar ~ 10505 \SpecialChar ~ 10506 if (vr != VerificationResult.VR_OK) 10507 \newline 10508 33\SpecialChar ~ 10509 \SpecialChar ~ 10510 \SpecialChar ~ 10511 \SpecialChar ~ 10512 \SpecialChar ~ 10513 \SpecialChar ~ 10514 \SpecialChar ~ 10515 System.out.println("Pass 2: 10516 \backslash 10517 n"+vr); 10518 \newline 10519 34\SpecialChar ~ 10520 \SpecialChar ~ 10521 \SpecialChar ~ 10522 \SpecialChar ~ 10523 \SpecialChar ~ 10524 if (vr == VerificationResult.VR_OK){ 10525 \newline 10526 35\SpecialChar ~ 10527 \SpecialChar ~ 10528 \SpecialChar ~ 10529 \SpecialChar ~ 10530 \SpecialChar ~ 10531 \SpecialChar ~ 10532 \SpecialChar ~ 10533 JavaClass jc = Repository.lookupClass(v.getClassName()); 10534 \newline 10535 36\SpecialChar ~ 10536 \SpecialChar ~ 10537 \SpecialChar ~ 10538 \SpecialChar ~ 10539 \SpecialChar ~ 10540 \SpecialChar ~ 10541 \SpecialChar ~ 10542 for (int i=0; i<jc.getMethods().length; i++){ 10543 \newline 10544 37\SpecialChar ~ 10545 \SpecialChar ~ 10546 \SpecialChar ~ 10547 \SpecialChar ~ 10548 \SpecialChar ~ 10549 \SpecialChar ~ 10550 \SpecialChar ~ 10551 \SpecialChar ~ 10552 \SpecialChar ~ 10553 vr = v.doPass3a(i); 10554 \newline 10555 38\SpecialChar ~ 10556 \SpecialChar ~ 10557 \SpecialChar ~ 10558 \SpecialChar ~ 10559 \SpecialChar ~ 10560 \SpecialChar ~ 10561 \SpecialChar ~ 10562 \SpecialChar ~ 10563 \SpecialChar ~ 10564 if (vr != VerificationResult.VR_OK) 10565 \newline 10566 39\SpecialChar ~ 10567 \SpecialChar ~ 10568 \SpecialChar ~ 10569 \SpecialChar ~ 10570 \SpecialChar ~ 10571 \SpecialChar ~ 10572 \SpecialChar ~ 10573 \SpecialChar ~ 10574 \SpecialChar ~ 10575 \SpecialChar ~ 10576 \SpecialChar ~ 10577 System.out.println(v.getClassName()+", Pass 3a, method "+ 10578 \newline 10579 \SpecialChar \- 10580 \SpecialChar ~ 10581 \SpecialChar ~ 10582 \SpecialChar ~ 10583 \SpecialChar ~ 10584 \SpecialChar ~ 10585 \SpecialChar ~ 10586 \SpecialChar ~ 10587 \SpecialChar ~ 10588 \SpecialChar ~ 10589 \SpecialChar ~ 10590 \SpecialChar ~ 10591 \SpecialChar ~ 10592 \SpecialChar ~ 10593 i+" ['"+jc.getMethods()[i]+"']: 10594 \backslash 10595 n"+vr); 10596 \newline 10597 40\SpecialChar ~ 10598 \SpecialChar ~ 10599 \SpecialChar ~ 10600 \SpecialChar ~ 10601 \SpecialChar ~ 10602 \SpecialChar ~ 10603 \SpecialChar ~ 10604 \SpecialChar ~ 10605 \SpecialChar ~ 10606 vr = v.doPass3b(i); 10607 \newline 10608 41\SpecialChar ~ 10609 \SpecialChar ~ 10610 \SpecialChar ~ 10611 \SpecialChar ~ 10612 \SpecialChar ~ 10613 \SpecialChar ~ 10614 \SpecialChar ~ 10615 \SpecialChar ~ 10616 \SpecialChar ~ 10617 if (vr != VerificationResult.VR_OK) 10618 \newline 10619 42\SpecialChar ~ 10620 \SpecialChar ~ 10621 \SpecialChar ~ 10622 \SpecialChar ~ 10623 \SpecialChar ~ 10624 \SpecialChar ~ 10625 \SpecialChar ~ 10626 \SpecialChar ~ 10627 \SpecialChar ~ 10628 \SpecialChar ~ 10629 \SpecialChar ~ 10630 System.out.println(v.getClassName()+", Pass 3b, method "+ 10631 \newline 10632 \SpecialChar \- 10633 \SpecialChar ~ 10634 \SpecialChar ~ 10635 \SpecialChar ~ 10636 \SpecialChar ~ 10637 \SpecialChar ~ 10638 \SpecialChar ~ 10639 \SpecialChar ~ 10640 \SpecialChar ~ 10641 \SpecialChar ~ 10642 \SpecialChar ~ 10643 \SpecialChar ~ 10644 \SpecialChar ~ 10645 \SpecialChar ~ 10646 i+" ['"+jc.getMethods()[i]+"']: 10647 \backslash 10648 n"+vr); 10649 \newline 10650 43\SpecialChar ~ 10651 \SpecialChar ~ 10652 \SpecialChar ~ 10653 \SpecialChar ~ 10654 \SpecialChar ~ 10655 \SpecialChar ~ 10656 \SpecialChar ~ 10657 } 10658 \newline 10659 44\SpecialChar ~ 10660 \SpecialChar ~ 10661 \SpecialChar ~ 10662 \SpecialChar ~ 10663 \SpecialChar ~ 10664 } 10665 \newline 10666 45\SpecialChar ~ 10667 \SpecialChar ~ 10668 \SpecialChar ~ 10669 \SpecialChar ~ 10670 \SpecialChar ~ 10671 indent -= 1; 10672 \newline 10673 46\SpecialChar ~ 10674 \SpecialChar ~ 10675 \SpecialChar ~ 10676 } 10677 \newline 10678 47 10679 \newline 10680 48\SpecialChar ~ 10681 \SpecialChar ~ 10682 /** 10683 \newline 10684 49\SpecialChar ~ 10685 \SpecialChar ~ 10686 \SpecialChar ~ 10687 * This method implements a demonstration program 10688 \newline 10689 50\SpecialChar ~ 10690 \SpecialChar ~ 10691 \SpecialChar ~ 10692 * of how to use the VerifierFactoryObserver. 10693 It transitively 10694 \newline 10695 51\SpecialChar ~ 10696 \SpecialChar ~ 10697 \SpecialChar ~ 10698 * verifies all class files encountered; this may take up a 10699 \newline 10700 52\SpecialChar ~ 10701 \SpecialChar ~ 10702 \SpecialChar ~ 10703 * lot of time and, more notably, memory. 10704 10705 \newline 10706 53\SpecialChar ~ 10707 \SpecialChar ~ 10708 \SpecialChar ~ 10709 */ 10710 \newline 10711 54\SpecialChar ~ 10712 \SpecialChar ~ 10713 \SpecialChar ~ 10714 public static void main(String[] args){ 10715 \newline 10716 55\SpecialChar ~ 10717 \SpecialChar ~ 10718 \SpecialChar ~ 10719 \SpecialChar ~ 10720 \SpecialChar ~ 10721 if (args.length != 1){ 10722 \newline 10723 56\SpecialChar ~ 10724 \SpecialChar ~ 10725 \SpecialChar ~ 10726 \SpecialChar ~ 10727 \SpecialChar ~ 10728 \SpecialChar ~ 10729 \SpecialChar ~ 10730 System.out.println("Need exactly one argument: The root class 10731 \newline 10732 \SpecialChar \- 10733 \SpecialChar ~ 10734 \SpecialChar ~ 10735 \SpecialChar ~ 10736 \SpecialChar ~ 10737 \SpecialChar ~ 10738 \SpecialChar ~ 10739 \SpecialChar ~ 10740 \SpecialChar ~ 10741 \SpecialChar ~ 10742 to verify."); 10743 \newline 10744 57\SpecialChar ~ 10745 \SpecialChar ~ 10746 \SpecialChar ~ 10747 \SpecialChar ~ 10748 \SpecialChar ~ 10749 \SpecialChar ~ 10750 \SpecialChar ~ 10751 System.exit(1); 10752 \newline 10753 58\SpecialChar ~ 10754 \SpecialChar ~ 10755 \SpecialChar ~ 10756 \SpecialChar ~ 10757 \SpecialChar ~ 10758 } 10759 \newline 10760 59\SpecialChar ~ 10761 \SpecialChar ~ 10762 \SpecialChar ~ 10763 \SpecialChar ~ 10764 \SpecialChar ~ 10765 int dotclasspos = args[0].lastIndexOf(".class"); 10766 \newline 10767 60\SpecialChar ~ 10768 \SpecialChar ~ 10769 \SpecialChar ~ 10770 \SpecialChar ~ 10771 \SpecialChar ~ 10772 if (dotclasspos != -1) 10773 \newline 10774 61\SpecialChar ~ 10775 \SpecialChar ~ 10776 \SpecialChar ~ 10777 \SpecialChar ~ 10778 \SpecialChar ~ 10779 \SpecialChar ~ 10780 \SpecialChar ~ 10781 args[0] = args[0].substring(0,dotclasspos); args[0] = 10782 \newline 10783 \SpecialChar \- 10784 \SpecialChar ~ 10785 \SpecialChar ~ 10786 \SpecialChar ~ 10787 \SpecialChar ~ 10788 \SpecialChar ~ 10789 \SpecialChar ~ 10790 \SpecialChar ~ 10791 \SpecialChar ~ 10792 \SpecialChar ~ 10793 args[0].replace('/', '.'); 10794 \newline 10795 62\SpecialChar ~ 10796 \SpecialChar ~ 10797 \SpecialChar ~ 10798 \SpecialChar ~ 10799 \SpecialChar ~ 10800 TransitiveHull th = new TransitiveHull(); 10801 \newline 10802 63\SpecialChar ~ 10803 \SpecialChar ~ 10804 \SpecialChar ~ 10805 \SpecialChar ~ 10806 \SpecialChar ~ 10807 VerifierFactory.attach(th); 10808 \newline 10809 64\SpecialChar ~ 10810 \SpecialChar ~ 10811 \SpecialChar ~ 10812 \SpecialChar ~ 10813 \SpecialChar ~ 10814 VerifierFactory.getVerifier(args[0]); // the observer is called 10815 \newline 10816 \SpecialChar \- 10817 \SpecialChar ~ 10818 \SpecialChar ~ 10819 \SpecialChar ~ 10820 \SpecialChar ~ 10821 \SpecialChar ~ 10822 \SpecialChar ~ 10823 \SpecialChar ~ 10824 back and does the actual trick. 10825 \newline 10826 65\SpecialChar ~ 10827 \SpecialChar ~ 10828 \SpecialChar ~ 10829 \SpecialChar ~ 10830 \SpecialChar ~ 10831 VerifierFactory.detach(th); 10832 \newline 10833 66\SpecialChar ~ 10834 \SpecialChar ~ 10835 \SpecialChar ~ 10836 } 10837 \newline 10838 67\SpecialChar ~ 10839 } 10840 \newline 10841 10842 \layout Standard 10843 10844 10845 \size small 10846 First, an instance of the 10847 \emph on 10848 TransitiveHull 10849 \emph default 10850 class is created in line 62. 10851 Note that this class implements the 10852 \emph on 10853 VerifierFactoryObserver 10854 \emph default 10855 interface. 10856 \layout Standard 10857 10858 10859 \size small 10860 A reference to the newly created instance is then passed to the 10861 \emph on 10862 VerifierFactory 10863 \emph default 10864 in line 63 by invoking its 10865 \emph on 10866 attach(VerifierFactoryObserver) 10867 \emph default 10868 method. 10869 After registering the new observer, the 10870 \emph on 10871 VerifierFactory 10872 \emph default 10873 will call the instance's 10874 \emph on 10875 update(String) 10876 \emph default 10877 method (defined in lines 20-46) whenever a new 10878 \emph on 10879 Verifier 10880 \emph default 10881 instance is created. 10882 \layout Standard 10883 10884 10885 \size small 10886 To trigger the verification, a first 10887 \emph on 10888 Verifier 10889 \emph default 10890 instance is fetched from the 10891 \emph on 10892 VerifierFactory 10893 \emph default 10894 . 10895 Because it is the very first 10896 \emph on 10897 Verifier 10898 \emph default 10899 instance that is fetched, we know that it has to be newly created. 10900 This is done in line 64. 10901 This instance is not used in the 10902 \emph on 10903 main(String[]) 10904 \emph default 10905 method; but its creation leads to a invocation of the 10906 \emph on 10907 update(String) 10908 \emph default 10909 method which is defined in lines 20-46. 10910 \layout Standard 10911 10912 There, the name of the class to verify is printed (lines 21-25, line 45) 10913 and the four verification passes provided by JustIce are run. 10914 Note that one has to be careful not to try to verify a method that does 10915 not exist. 10916 JustIce would in this case throw an 10917 \emph on 10918 InvalidMethodException 10919 \emph default 10920 . 10921 Therefore, after successfully verifying that the structure of the class 10922 file to verify is well-formed (verification up to and including pass two, 10923 lines 26-31), the number of methods is fetched from the corresponding JavaClass 10924 object. 10925 (It is necessary to perform verification pass two on a class file to safely 10926 find out how many methods are defined in this class file.) 10927 \layout Standard 10928 10929 After determining the number of methods, these methods are verified performing 10930 passes 3a and 3b on them (lines 32-44). 10931 \layout Standard 10932 10933 By applying all verification passes on some class file 10934 \emph on 10935 C 10936 \emph default 10937 , all class files referenced by 10938 \emph on 10939 C 10940 \emph default 10941 are found. 10942 Therefore, new 10943 \emph on 10944 Verifier 10945 \emph default 10946 instances are created which are responsible for them. 10947 Because of that, the 10948 \emph on 10949 update(String) 10950 \emph default 10951 method described above is called for every referenced class. 10952 This is a recursive loop; the program terminates when there is no referenced 10953 class left to be verified. 10954 \layout Standard 10955 10956 The example above is simple yet powerful. 10957 Admittedly, it is of limited use to verify classes provided by the JVM 10958 vendor; therefore one would not normally verify all the transitive hull 10959 of referenced class files. 10960 However, a common use is verifying all classes of a project. 10961 Inserting a new line between line 20 and 21 like 10962 \layout Standard 10963 10964 10965 \family typewriter 10966 if (!(classname.startsWith( 10967 \begin_inset Quotes eld 10968 \end_inset 10969 10970 de.fub.bytecode.verifier 10971 \begin_inset Quotes erd 10972 \end_inset 10973 10974 )) return; 10975 \newline 10976 10977 \family default 10978 would easily accomplish this goal if JustIce itself is the project to verify 10979 and all the project's class files are referenced by another class file 10980 in the project. 10981 \layout Section 10982 10983 10984 \begin_inset LatexCommand \label{GUI_APP} 10985 10986 \end_inset 10987 10988 An Application Prototype 10989 \layout Standard 10990 10991 The API of JustIce is used to offer bytecode engineers an opportunity to 10992 create their own application programs. 10993 However, this dimension of configurability is often not needed. 10994 \layout Standard 10995 10996 JustIce comes with an application prototype which provides an easy-to-use 10997 user interface. 10998 Figures 10999 \begin_inset LatexCommand \ref{GUI1fig} 11000 11001 \end_inset 11002 11003 and 11004 \begin_inset LatexCommand \ref{GUI2fig} 11005 11006 \end_inset 11007 11008 show screen shots of this prototype built on the JustIce verifier. 11009 The boxes to the right contain verification information. 11010 From the top to the bottom the boxes represent the verification passes 11011 one, two, 3a and 3b and the warning messages, respectively. 11012 \layout Standard 11013 11014 \begin_float fig 11015 \layout Standard 11016 \align center 11017 11018 \begin_inset Figure size 595 757 11019 file GUI1.eps 11020 width 3 100 11021 height 3 90 11022 angle 90 11023 flags 9 11024 11025 \end_inset 11026 11027 11028 \layout Caption 11029 11030 11031 \begin_inset LatexCommand \label{GUI1fig} 11032 11033 \end_inset 11034 11035 Verification of the Mini.MiniParser class file. 11036 Verification is passed, but JustIce suggests to remove unnecessary (debug 11037 information) attributes. 11038 \end_float 11039 \begin_float fig 11040 \layout Standard 11041 \align center 11042 11043 \begin_inset Figure size 595 757 11044 file GUI2.eps 11045 width 3 100 11046 height 3 90 11047 angle 90 11048 flags 9 11049 11050 \end_inset 11051 11052 11053 \layout Caption 11054 11055 11056 \begin_inset LatexCommand \label{GUI2fig} 11057 11058 \end_inset 11059 11060 Verification of the java.io.ObjectInputStream class file. 11061 Verification is not passed because of an unsatisfied constraint related 11062 to subroutines. 11063 \end_float 11064 \layout Chapter 11065 11066 Conclusion 11067 \layout Section 11068 11069 What Was Achieved 11070 \layout Standard 11071 11072 About a third of the development time of JustIce was spent examining the 11073 various issues in connection with subroutines, i.e., issues concerning the 11074 bytecode instructions 11075 \latex latex 11076 11077 \backslash 11078 texttt{jsr} 11079 \latex default 11080 , 11081 \latex latex 11082 11083 \backslash 11084 texttt{jsr 11085 \backslash 11086 _w} 11087 \latex default 11088 and 11089 \latex latex 11090 11091 \backslash 11092 texttt{ret} 11093 \latex default 11094 . 11095 This led to a new definition of the term 11096 \emph on 11097 subroutine 11098 \emph default 11099 (section 11100 \begin_inset LatexCommand \ref{SpecSubroutines} 11101 11102 \end_inset 11103 11104 ) 11105 \begin_float footnote 11106 \layout Standard 11107 11108 A request for clarification of the subroutine issue, sent to the electronic 11109 mail address 11110 \family typewriter 11111 jvm (a] java.sun.com 11112 \family default 11113 was not answered. 11114 \end_float 11115 , a new implementation of this verification area (section 11116 \begin_inset LatexCommand \ref{SubroutineImpl} 11117 11118 \end_inset 11119 11120 ) and a discussion on the arising incompatibilities (sections 11121 \begin_inset LatexCommand \ref{ComparisonSubroutines} 11122 11123 \end_inset 11124 11125 and 11126 \begin_inset LatexCommand \ref{StaerkJreject} 11127 11128 \end_inset 11129 11130 ). 11131 \layout Standard 11132 11133 Only a few different verifier implementations exist at all, and most of 11134 them are incomplete. 11135 JustIce is a complete class file verifier implementation including a bytecode 11136 verifier. 11137 \layout Standard 11138 11139 The development of JustIce also led to improvements of the Byte Code Engineering 11140 Library 11141 \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 11142 11143 \end_inset 11144 11145 . 11146 For instance, the 11147 \family typewriter 11148 returnaddress 11149 \family default 11150 data type was introduced there. 11151 It was modeled as a parameterized type. 11152 Also, a programming error was repaired that led to inconsistent treatment 11153 of exception handlers in the BCEL. 11154 \layout Standard 11155 11156 The control flow graph used by JustIce can also be used in other projects; 11157 the Verification API provides access to this data structure 11158 \begin_float footnote 11159 \layout Standard 11160 11161 A 11162 \family typewriter 11163 Control\SpecialChar \- 11164 Flow\SpecialChar \- 11165 Graph 11166 \family default 11167 instance can be created by invoking the 11168 \emph on 11169 Control\SpecialChar \- 11170 Flow\SpecialChar \- 11171 Graph(Method\SpecialChar \- 11172 Gen) 11173 \emph default 11174 constructor. 11175 A 11176 \family typewriter 11177 Method\SpecialChar \- 11178 Gen 11179 \family default 11180 is the BCEL's representation of a method. 11181 \end_float 11182 . 11183 Only because of the clarification of the subroutine issues could such a 11184 data structure be defined statically. 11185 \layout Standard 11186 11187 As an Open Source project, JustIce provides algorithms which may be re-used 11188 in own projects. 11189 For example, every compiler targeting the JVM has to calculate the maximum 11190 amount of stack memory used by a method. 11191 This is also done by JustIce. 11192 \layout Standard 11193 11194 Finally, the need for a discussion on the meaning of 11195 \emph on 11196 Java security 11197 \emph default 11198 was identified (see section 11199 \begin_inset LatexCommand \ref{LinePrincipleInfoHidingAndSecurity} 11200 11201 \end_inset 11202 11203 ). 11204 \layout Section 11205 11206 What Could Not Be Achieved 11207 \layout Subsection 11208 11209 A Constraint Database 11210 \layout Standard 11211 11212 Efforts have been made to make JustIce verifier highly configurable. 11213 Unfortunately, this could not be accomplished by the author. 11214 For instance, it was planned to build a constraint database which would 11215 make it possible to turn on or off single checks during verification. 11216 \layout Standard 11217 11218 While this might be possible in some cases, in general the constraints of 11219 the class file verifier are highly intertwined. 11220 For instance, without a well-formed constant pool one could not run the 11221 data flow analyzer in a sane way. 11222 As another example, if a user preferred not to care about stack underflow 11223 the verification algorithm would require complicated user interaction; 11224 i.e., the user would have to decide what type to put onto the simulated operand 11225 stack just before it is read. 11226 \layout Standard 11227 11228 One could model the interdependencies of the various constraints and allow 11229 only groups of checks to be turned on or off together. 11230 However, the author doubts this could be done in a way that is not prone 11231 to errors and that can be validated easily. 11232 \layout Standard 11233 11234 This is also the reason why only one error is reported if verification fails. 11235 Trying to continue verification and find more constraint violations leads 11236 only to consequential verification errors. 11237 \layout Standard 11238 11239 JustIce implements caching of verification results. 11240 If a bytecode engineer works on a class file and needs to run JustIce several 11241 times against it, JustIce will cache the verification results of the recursivel 11242 y referenced class files. 11243 Because of this, JustIce will be fast every subsequent time it is used 11244 to verify the class. 11245 This minimizes the impact of the above shortcomings. 11246 \layout Subsection 11247 11248 A Perfect Verifier 11249 \layout Standard 11250 11251 JustIce does not implement a perfect verifier. 11252 Some class files with code that is safe to execute are rejected. 11253 Unfortunately, there has to be some degree of uncertainty concerning which 11254 class files to reject. 11255 \layout Standard 11256 11257 The JVM performs 11258 \emph on 11259 initialization 11260 \emph default 11261 of class files after loading and verifying them without error. 11262 This includes running the code in the special class initialization method 11263 called 11264 \emph on 11265 <clinit> 11266 \emph default 11267 if it exists (see 11268 \begin_inset LatexCommand \cite{vmspec2} 11269 11270 \end_inset 11271 11272 , page 53). 11273 For the correct operation of the JVM it is important that this method does 11274 not contain an infinite loop. 11275 Verifying if this constraint is true is similar to the Halting Problem 11276 and therefore not generally computable 11277 \begin_inset LatexCommand \cite{Unknowable} 11278 11279 \end_inset 11280 11281 . 11282 A verifier has to omit the check and pass potentially unsafe class files. 11283 \layout Standard 11284 11285 For another example, consider algorithm 11286 \begin_inset LatexCommand \ref{StackOverflowAlgo} 11287 11288 \end_inset 11289 11290 below. 11291 \layout Standard 11292 11293 \begin_float alg 11294 \layout Caption 11295 11296 11297 \begin_inset LatexCommand \label{StackOverflowAlgo} 11298 11299 \end_inset 11300 11301 Rejected class 11302 \layout Standard 11303 11304 11305 \family typewriter 11306 public static int always_true() 11307 \layout Standard 11308 11309 11310 \family typewriter 11311 Code(max_stack = 1, max_locals = 1, code_length = 2) 11312 \layout Standard 11313 11314 11315 \family typewriter 11316 0: iconst_1\SpecialChar ~ 11317 \SpecialChar ~ 11318 ; push constant 1 onto stack 11319 \layout Standard 11320 11321 11322 \family typewriter 11323 1: ireturn\SpecialChar ~ 11324 \SpecialChar ~ 11325 \SpecialChar ~ 11326 ; return constant 1 ( 11327 \begin_inset Quotes eld 11328 \end_inset 11329 11330 true 11331 \begin_inset Quotes erd 11332 \end_inset 11333 11334 ) 11335 \newline 11336 11337 \layout Standard 11338 11339 11340 \family typewriter 11341 public static void good_method() 11342 \layout Standard 11343 11344 11345 \family typewriter 11346 0: invokestatic NewClass0.always_true ()I (18) 11347 \layout Standard 11348 11349 11350 \family typewriter 11351 \SpecialChar \- 11352 \SpecialChar ~ 11353 \SpecialChar ~ 11354 \SpecialChar ~ 11355 \SpecialChar ~ 11356 \SpecialChar ~ 11357 \SpecialChar ~ 11358 \SpecialChar ~ 11359 \SpecialChar ~ 11360 \SpecialChar ~ 11361 \SpecialChar ~ 11362 \SpecialChar ~ 11363 \SpecialChar ~ 11364 \SpecialChar ~ 11365 \SpecialChar ~ 11366 \SpecialChar ~ 11367 \SpecialChar ~ 11368 \SpecialChar ~ 11369 \SpecialChar ~ 11370 \SpecialChar ~ 11371 \SpecialChar ~ 11372 \SpecialChar ~ 11373 ; Push 11374 \begin_inset Quotes eld 11375 \end_inset 11376 11377 true 11378 \begin_inset Quotes erd 11379 \end_inset 11380 11381 on stack 11382 \layout Standard 11383 11384 11385 \family typewriter 11386 3: ifne #10\SpecialChar ~ 11387 \SpecialChar ~ 11388 \SpecialChar ~ 11389 \SpecialChar ~ 11390 \SpecialChar ~ 11391 \SpecialChar ~ 11392 \SpecialChar ~ 11393 \SpecialChar ~ 11394 \SpecialChar ~ 11395 \SpecialChar ~ 11396 ; If 11397 \begin_inset Quotes eld 11398 \end_inset 11399 11400 true 11401 \begin_inset Quotes erd 11402 \end_inset 11403 11404 is on stack jump to 10 11405 \layout Standard 11406 11407 11408 \family typewriter 11409 6: pop \SpecialChar ~ 11410 \SpecialChar ~ 11411 \SpecialChar ~ 11412 \SpecialChar ~ 11413 \SpecialChar ~ 11414 \SpecialChar ~ 11415 \SpecialChar ~ 11416 \SpecialChar ~ 11417 \SpecialChar ~ 11418 \SpecialChar ~ 11419 \SpecialChar ~ 11420 \SpecialChar ~ 11421 \SpecialChar ~ 11422 \SpecialChar ~ 11423 ; Pop a value off the stack 11424 \layout Standard 11425 11426 11427 \family typewriter 11428 7: goto #6 \SpecialChar ~ 11429 \SpecialChar ~ 11430 \SpecialChar ~ 11431 \SpecialChar ~ 11432 \SpecialChar ~ 11433 \SpecialChar ~ 11434 \SpecialChar ~ 11435 \SpecialChar ~ 11436 \SpecialChar ~ 11437 \SpecialChar ~ 11438 ; jump to 6 11439 \layout Standard 11440 11441 11442 \family typewriter 11443 10:return\SpecialChar ~ 11444 \SpecialChar ~ 11445 \SpecialChar ~ 11446 \SpecialChar ~ 11447 \SpecialChar ~ 11448 \SpecialChar ~ 11449 \SpecialChar ~ 11450 \SpecialChar ~ 11451 \SpecialChar ~ 11452 \SpecialChar ~ 11453 \SpecialChar ~ 11454 \SpecialChar ~ 11455 ; complete method 11456 \end_float 11457 This code is harmless, because lines 6 and 7 can never be executed (it would 11458 underflow the operand stack in an infinite loop). 11459 A class file with this code is rejected by JustIce and other verifiers, 11460 because the endless loop seems to be a malicious threat to the integrity 11461 of the JVM. 11462 \layout Standard 11463 11464 We conclude that there cannot be a perfect verifier. 11465 All that could be done is reduce the degree of uncertainty. 11466 For practical purposes, i.e., to be compatible with Sun's implementation, 11467 one should not even do that. 11468 \layout Standard 11469 11470 There is also a simple proof showing a perfect verifier does not exist in 11471 11472 \begin_inset LatexCommand \cite{JNS} 11473 11474 \end_inset 11475 11476 , chapter 6. 11477 It uses a diagonalization argument. 11478 \layout Section 11479 11480 Future Work 11481 \layout Standard 11482 11483 Class file verification is an integral component of Java security; and applicati 11484 on programs running on the Java Virtual Machine are often used in security 11485 critical areas. 11486 Several security holes and flaws have been found both in implementations 11487 and the specification of the Java class file verifier since it was introduced. 11488 \layout Standard 11489 11490 Recently, the area has experienced a leap as a theoretically founded, sound 11491 and complete Java environment was defined in 11492 \begin_inset LatexCommand \cite{JBook} 11493 11494 \end_inset 11495 11496 . 11497 Possibly Sun's engineers will use this work to improve Java and the Java 11498 verifier. 11499 JustIce will have to change to always keep close to the industry standard. 11500 11501 \layout Standard 11502 11503 But JustIce itself can also be improved concerning practicability, and new 11504 software can be developed on top of the Verification API. 11505 \layout Subsection 11506 11507 Improvements to JustIce 11508 \layout Subsubsection 11509 11510 Introduction of Unique Identifers for Verification Results and Warning Messages 11511 \layout Standard 11512 11513 Currently, warning messages and verification results are conceptually text-based. 11514 Only 11515 \emph on 11516 VerificationResult 11517 \emph default 11518 objects include a numeric value which programs can use to decide if some 11519 class verification failed or not. 11520 A program like the prototype introduced in section 11521 \begin_inset LatexCommand \ref{GUI_APP} 11522 11523 \end_inset 11524 11525 can currently not hide specific messages from the user without parsing 11526 text. 11527 This limitation should be removed in the future by using unique message 11528 numbers. 11529 This would also make translation of the messages into other languages easier. 11530 \layout Subsubsection 11531 11532 11533 \begin_inset LatexCommand \label{NewVerificationStrategy} 11534 11535 \end_inset 11536 11537 A New Verification Strategy 11538 \layout Standard 11539 11540 The core verification algorithm cited in section 11541 \begin_inset LatexCommand \ref{SunCoreAlgo} 11542 11543 \end_inset 11544 11545 works by generalizing the knowledge about an object type along the inheritance 11546 hierarchy. 11547 \layout Standard 11548 11549 For instance, let there be an object of type 11550 \family typewriter 11551 java.util.Ab\SpecialChar \- 11552 stract\SpecialChar \- 11553 List 11554 \family default 11555 on the simulated stack of some modeled instruction. 11556 Let there be a loop so that the algorithm has to visit that same instruction 11557 again, this time with an object of type 11558 \family typewriter 11559 java.util.Ab\SpecialChar \- 11560 stract\SpecialChar \- 11561 Set 11562 \family default 11563 in that same stack slot. 11564 The verifier will compute the meet of the two types and record that there 11565 is some object of type 11566 \family typewriter 11567 java.util.Ab\SpecialChar \- 11568 stract\SpecialChar \- 11569 Collection 11570 \family default 11571 in that stack slot. 11572 \layout Standard 11573 11574 Remember that the instruction will be marked with a 11575 \emph on 11576 changed 11577 \emph default 11578 bit until no such re-typing change occurs any more (JustIce will actually 11579 put it into a queue). 11580 \layout Standard 11581 11582 This approach does not work very well when it comes to interface types instead 11583 of class files. 11584 For example, the meet of a 11585 \family typewriter 11586 java.lang.In\SpecialChar \- 11587 teger 11588 \family default 11589 and a 11590 \family typewriter 11591 java.lang.Doub\SpecialChar \- 11592 le 11593 \family default 11594 is a 11595 \family typewriter 11596 java.lang.Num\SpecialChar \- 11597 ber 11598 \family default 11599 because 11600 \family typewriter 11601 java.lang.Num\SpecialChar \- 11602 ber 11603 \family default 11604 \emph on 11605 11606 \emph default 11607 is the first common super class. 11608 Both classes also implement the 11609 \family typewriter 11610 java.lang.Com\SpecialChar \- 11611 parable 11612 \family default 11613 interface, but 11614 \family typewriter 11615 java.lang.Num\SpecialChar \- 11616 ber 11617 \family default 11618 does not. 11619 This information is lost when replacing the type information. 11620 However, current verifiers do not reject the class files but make additional 11621 run-time checks necessary. 11622 \layout Standard 11623 11624 Fong noticed that this could be the reason for the 11625 \latex latex 11626 11627 \backslash 11628 texttt{invoke\SpecialChar \- 11629 interface} 11630 \latex default 11631 opcode to be underspecified 11632 \begin_inset LatexCommand \cite{Fong2-WWW} 11633 11634 \end_inset 11635 11636 (also see section 11637 \begin_inset LatexCommand \ref{InvokeInterfaceDescFONG} 11638 11639 \end_inset 11640 11641 ). 11642 \layout Standard 11643 11644 Strk et al. 11645 suggest the use of 11646 \emph on 11647 sets 11648 \emph default 11649 of reference types instead ( 11650 \begin_inset LatexCommand \cite{JBook} 11651 11652 \end_inset 11653 11654 , pages 229-231). 11655 This could also be implemented in JustIce. 11656 \layout Subsubsection 11657 11658 Keeping up with Specification Clarifications 11659 \layout Standard 11660 11661 As a clean-room implementation, JustIce depends on the clearness of the 11662 specification. 11663 Ambiguities could lead to programming errors. 11664 \layout Standard 11665 11666 Here we give one example: methods can be inherited in Java (for example, 11667 the method 11668 \emph on 11669 clone() 11670 \emph default 11671 is declared in the 11672 \family typewriter 11673 java.lang.Ob\SpecialChar \- 11674 ject 11675 \family default 11676 class and therefore inherited by every other class). 11677 \layout Standard 11678 11679 Let a class 11680 \family typewriter 11681 A 11682 \family default 11683 be a subclass of 11684 \family typewriter 11685 java.lang.Ob\SpecialChar \- 11686 ject 11687 \family default 11688 and let class 11689 \family typewriter 11690 B 11691 \family default 11692 be a subclass of 11693 \family typewriter 11694 A 11695 \family default 11696 . 11697 Also, let class 11698 \family typewriter 11699 B 11700 \family default 11701 override the definition of 11702 \emph on 11703 clone() 11704 \emph default 11705 with an own implementation. 11706 \layout Standard 11707 11708 If 11709 \emph on 11710 javac 11711 \emph default 11712 compiles a Java program that invokes this method, it is either referenced 11713 as 11714 \emph on 11715 java.lang.Ob\SpecialChar \- 11716 ject::clone() 11717 \emph default 11718 or as 11719 \emph on 11720 B::clone() 11721 \emph default 11722 . 11723 However, because 11724 \family typewriter 11725 A 11726 \family default 11727 inherits this method, the reference 11728 \emph on 11729 A::clone() 11730 \emph default 11731 is legal, too. 11732 \layout Standard 11733 11734 In The Java Virtual Machine Specification, Second Edition ( 11735 \begin_inset LatexCommand \cite{vmspec2} 11736 11737 \end_inset 11738 11739 , page 291) it is said that the reference must be a 11740 \begin_inset Quotes eld 11741 \end_inset 11742 11743 symbolic reference to the class in which the method is to be found 11744 \begin_inset Quotes erd 11745 \end_inset 11746 11747 . 11748 Statically, the method 11749 \emph on 11750 clone() 11751 \emph default 11752 can of course not be found in class 11753 \family typewriter 11754 A 11755 \family default 11756 . 11757 One could therefore think the reference 11758 \emph on 11759 A::clone() 11760 \emph default 11761 was not legal. 11762 \layout Standard 11763 11764 In the meanwhile, Sun's engineer Gilad Bracha clarified this issue: 11765 \begin_inset Quotes eld 11766 \end_inset 11767 11768 Of course. 11769 This is discussed in JVMS 5.4.3.4, which describes interface method resolution. 11770 I don't see the text on page 280 as contradicting that. 11771 The symbolic reference does give an interface in which the required method 11772 can be found, albeit as an inherited member. 11773 We could try and reword it in a more precise way, to eliminate any misunderstan 11774 dings. 11775 \begin_inset Quotes erd 11776 \end_inset 11777 11778 11779 \layout Standard 11780 11781 Keeping up with clarifications like this is an inevitable and on-going part 11782 of the development of JustIce. 11783 \layout Subsubsection 11784 11785 Keeping up with Java Extensions 11786 \layout Standard 11787 11788 Recently, Sun Microsystems introduced a new attribute: the 11789 \family typewriter 11790 StackMap 11791 \family default 11792 attribute which is an attribute local to the 11793 \family typewriter 11794 Code 11795 \family default 11796 attribute (see section 11797 \emph on 11798 11799 \begin_inset LatexCommand \ref{CodeAttribute} 11800 11801 \end_inset 11802 11803 11804 \emph default 11805 ). 11806 It was specified in 11807 \begin_inset LatexCommand \cite{J2ME-CLDCS} 11808 11809 \end_inset 11810 11811 . 11812 \layout Standard 11813 11814 It is there to provide 11815 \begin_inset Quotes eld 11816 \end_inset 11817 11818 limited devices 11819 \begin_inset Quotes erd 11820 \end_inset 11821 11822 that perform a one-pass verification with type information that would normally 11823 have to be inferred by the verifier. 11824 \layout Standard 11825 11826 It is not used by the verification algorithm of JustIce now: it's currently 11827 an 11828 \emph on 11829 unknown attribute 11830 \emph default 11831 to JustIce. 11832 \layout Subsubsection 11833 11834 Detecting Local Variable Accesses out of Scope 11835 \layout Standard 11836 11837 The 11838 \family typewriter 11839 LocalVariableTable 11840 \family default 11841 attribute is a debug information attribute. 11842 Basically, it gives debuggers information about the original (source code) 11843 name and type of a given local variable. 11844 \layout Standard 11845 11846 JustIce builds data structures to warn if it detects contradicting and overlappi 11847 ng areas; e.g., if some local variable is anounced to carry an 11848 \family typewriter 11849 int 11850 \family default 11851 value and a 11852 \family typewriter 11853 float 11854 \family default 11855 value at the same time. 11856 \layout Standard 11857 11858 It could also be interesting to warn if a local variable is accessed for 11859 which no debug information exists. 11860 This is currently not implemented. 11861 \layout Subsubsection 11862 11863 Extending the Verification API 11864 \layout Standard 11865 11866 JustIce can easily be extended to run certain analyses related to symbolic 11867 bytecode execution. 11868 \layout Standard 11869 11870 This includes the computation of the maximum number of used operand stack 11871 slots in a method or the computation of unused local variables in a method. 11872 \layout Standard 11873 11874 These analyses are normally costly to implement 11875 \begin_float footnote 11876 \layout Standard 11877 11878 Often, heuristics are used such as the method MethodGen.getMaxStack() in 11879 the BCEL 11880 \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 11881 11882 \end_inset 11883 11884 . 11885 \end_float 11886 , but they are a waste product of the verifier's core algorithm. 11887 \layout Subsubsection 11888 11889 11890 \begin_inset LatexCommand \label{VerifierValidationSuite} 11891 11892 \end_inset 11893 11894 A Verifier Validation Suite 11895 \layout Standard 11896 11897 The Kimera project 11898 \begin_inset LatexCommand \cite{Kimera-WWW} 11899 11900 \end_inset 11901 11902 was the first known project to implement a stand-alone Java verifier. 11903 The people behind the project had to test the behaviour of their verifier 11904 against the behaviour of the previous implementations. 11905 Tests have been run in order to validate the Kimera verifier. 11906 These tests range from simply introducing random one-byte errors into class 11907 files and automatically running Kimera against other verifiers to elaborate 11908 research work 11909 \begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} 11910 11911 \end_inset 11912 11913 . 11914 \layout Standard 11915 11916 Currently, JustIce comes only with a very limited possibility of running 11917 test cases against the native verifier of the host machine's JVM. 11918 The pioneering work of the Kimera project could be used to implement a 11919 validation suite for JustIce. 11920 \layout Subsection 11921 11922 11923 \begin_inset LatexCommand \label{Firewall} 11924 11925 \end_inset 11926 11927 A Verifier Protecting an Intranet 11928 \layout Standard 11929 11930 Often, Java Virtual Machines are built into software used to browse the 11931 World Wide Web such as the KDE project's 11932 \emph on 11933 Konqueror 11934 \begin_inset LatexCommand \cite{KDE} 11935 11936 \end_inset 11937 11938 11939 \emph default 11940 or Mozilla.org's 11941 \emph on 11942 Mozilla 11943 \emph default 11944 11945 \begin_inset LatexCommand \cite{Mozilla} 11946 11947 \end_inset 11948 11949 products. 11950 Such Internet technology is also often used in corporate networks. 11951 Corporate networks based on internet technology are called 11952 \emph on 11953 intranets 11954 \emph default 11955 ; these networks are normally protected from the Internet by a so-called 11956 11957 \emph on 11958 firewall 11959 \emph default 11960 computer. 11961 11962 \layout Standard 11963 11964 This computer's task is to provide access to the internet only to privileged 11965 employees and --even more important-- it blocks access from unauthorized 11966 persons outside the intranet. 11967 The firewall machine is a single, bi-directional point of access. 11968 \layout Standard 11969 11970 However, normally web-browsing is considered harmless, so that the employees 11971 can unrestrictedly gather information, possibly visiting Java-enabled web 11972 sites. 11973 The JVMs built into the browser software run software downloaded from the 11974 World Wide Web; while the the built-in verifiers make sure that no dangerous 11975 code can be executed. 11976 \layout Standard 11977 11978 Let us assume someone discovered a security hole in the verifier implementation 11979 or implementations that are used on the corporate network's workstations; 11980 let us also assume a patch exists that would fix the problem. 11981 11982 \layout Standard 11983 11984 A system administrator would have to spent a lot of time to repair every 11985 single verifier. 11986 A cheaper solution would be a verifier built into the firewall machine; 11987 such a verifier can easily be implemented using JustIce and its Verification 11988 API. 11989 \layout Subsection 11990 11991 A Java Virtual Machine Implementation Using JustIce 11992 \layout Standard 11993 11994 The Java verifier is originally a part of the Java Virtual Machine. 11995 JustIce could also be part of a Java Virtual Machine. 11996 JustIce's class files (the program code JustIce consists of) could simply 11997 be integrated into the core Java class files. 11998 The execution engine would then run JustIce without actually verifying 11999 JustIce's class files themselves. 12000 12001 \layout Standard 12002 12003 For scientific purposes one could also implement a JVM in the Java programming 12004 language. 12005 Such an implementation could, for example, serve as a debugger. 12006 \layout Subsection 12007 12008 12009 \begin_inset LatexCommand \label{LinePrincipleInfoHidingAndSecurity} 12010 12011 \end_inset 12012 12013 Drawing a Clear Line Between the Principle of Information Hiding and Security 12014 \layout Standard 12015 12016 The principle of information hiding has been (and still is!) a practice 12017 of experienced programmers for many years. 12018 It is there to reduce programming errors. 12019 \layout Standard 12020 12021 In the Modula-2 programming language 12022 \begin_inset LatexCommand \cite{M2} 12023 12024 \end_inset 12025 12026 this is achieved by explicitely dividing the program code in definition 12027 modules and implementation modules. 12028 In older programming languages, such as in the C programming language 12029 \begin_inset LatexCommand \cite{C} 12030 12031 \end_inset 12032 12033 , this principle is implicitely used, too. 12034 Basically this is achieved by defining interfaces that only describe what 12035 the code of a program module does. 12036 These interface 12037 \begin_inset Quotes eld 12038 \end_inset 12039 12040 headers 12041 \begin_inset Quotes erd 12042 \end_inset 12043 12044 are included into user code instead of simply including the code itself. 12045 12046 \layout Standard 12047 12048 In object-oriented programming languages such as in Delphi 12049 \begin_inset LatexCommand \cite{D3} 12050 12051 \end_inset 12052 12053 , C++ 12054 \begin_inset LatexCommand \cite{CPP-D,CPP-E} 12055 12056 \end_inset 12057 12058 or Java 12059 \begin_inset LatexCommand \cite{langspec2} 12060 12061 \end_inset 12062 12063 , this principle is refined to what is called object encapsulation. 12064 When a class is defined, certain key words such as 12065 \family typewriter 12066 private 12067 \family default 12068 , 12069 \family typewriter 12070 protected 12071 \family default 12072 , 12073 \family typewriter 12074 friend 12075 \family default 12076 , 12077 \family typewriter 12078 public 12079 \family default 12080 , 12081 \family typewriter 12082 published 12083 \family default 12084 set the access rules for the members 12085 \begin_float footnote 12086 \layout Standard 12087 12088 The members of a class are its components: methods (program code) and fields 12089 (also called attributes or variables). 12090 \end_float 12091 of an object of the given class. 12092 \layout Standard 12093 12094 Still, this refined technique does not have anything to do with security. 12095 It is only there to aid programmers create a reasonable design. 12096 If every piece of code could manipulate every data structure, one would 12097 not know where to look for a programming error in the program source code. 12098 On the other hand, if some field is private in C++, one could (with some 12099 knowledge about the compiler used) still reference and modify this field 12100 by pointer manipulation. 12101 In addition to that, a second program like a debugger could watch even 12102 the data of private fields. 12103 \layout Standard 12104 12105 However, when a Java program is compiled into the language of the JVM, the 12106 information about the access rights of the fields and methods is included. 12107 This is where the principle of information hiding is exploited to provide 12108 security. 12109 For example, the verifier of the JVM has to make sure private fields are 12110 never accessed from a foreign piece of code. 12111 But there are many implementations of the JVM which have security flaws 12112 such as not honouring the access rights. 12113 There are debuggers for JVM bytecodes, too. 12114 \layout Standard 12115 12116 When one thinks about security, one has to think of some enemy who could 12117 try to harm the computer or information stored on that computer. 12118 From a JVM user's point of view, the JVM is relatively secure. 12119 Even running untrusted code cannot do much harm. 12120 Because the security flaws in different JVM implementations differ, they 12121 are probably not exploited most times. 12122 \layout Standard 12123 12124 From a Java programmer's point of view, the JVM is not secure. 12125 Untrusted users can do much harm. 12126 For example, an online banking application storing important data in Java 12127 fields (such as access information to the bank's database management system) 12128 is a threat to both the bank and its customers. 12129 This information could easily be extracted by a malicious user. 12130 \layout Standard 12131 12132 Another problem for Java programmers is the amount of symbolical information 12133 stored in class files. 12134 Today, it is easy to de-compile a Java class file back to Java language 12135 source code 12136 \begin_inset LatexCommand \cite{JODE-WWW} 12137 12138 \end_inset 12139 12140 . 12141 This source code can then be read and analyzed by the user. 12142 Facing this problem, the 12143 \begin_inset Quotes eld 12144 \end_inset 12145 12146 only safe course of action is to assume that ALL Java code will at some 12147 point be decompiled 12148 \begin_inset Quotes erd 12149 \end_inset 12150 12151 ( 12152 \begin_inset LatexCommand \cite{JNS} 12153 12154 \end_inset 12155 12156 , page 68). 12157 \layout Standard 12158 12159 We conclude that the principle of information hiding is not enough to provide 12160 a degree of security that both --users and programmers-- could accept. 12161 Programmers should not believe a good design makes a program 12162 \emph on 12163 secure 12164 \emph default 12165 . 12166 12167 \layout Chapter 12168 12169 Appendix 12170 \layout Section 12171 12172 History of JustIce 12173 \layout Standard 12174 12175 The author of JustIce once started to implement a class file decompiler 12176 like Jode 12177 \begin_inset LatexCommand \cite{JODE-WWW} 12178 12179 \end_inset 12180 12181 . 12182 It soon became clear that to successfully implement it, one should exploit 12183 the 12184 \begin_inset Quotes eld 12185 \end_inset 12186 12187 well-behaved 12188 \begin_inset Quotes erd 12189 \end_inset 12190 12191 property of class files (which essentially means that they pass a verifier, 12192 especially pass three) 12193 \begin_inset LatexCommand \cite{Krakatoa-WWW} 12194 12195 \end_inset 12196 12197 . 12198 12199 \layout Standard 12200 12201 JustIce was then developed to understand the 12202 \begin_inset Quotes eld 12203 \end_inset 12204 12205 well-behaved 12206 \begin_inset Quotes erd 12207 \end_inset 12208 12209 property of usual class files. 12210 It took much longer to complete than estimated because of the many inherent 12211 bugs and ambiguities in The Java Virtual Machine Specification, Second 12212 Edition 12213 \begin_inset LatexCommand \cite{vmspec2} 12214 12215 \end_inset 12216 12217 . 12218 \layout Standard 12219 12220 Its name starts with a 12221 \emph on 12222 J 12223 \emph default 12224 like Java does, referring to the tradition of giving Java-related software 12225 such names. 12226 The second part of the name, 12227 \emph on 12228 ICE 12229 \emph default 12230 , was inspired by a novel by William Gibson 12231 \begin_inset LatexCommand \cite{Neuromancer} 12232 12233 \end_inset 12234 12235 . 12236 It is an acronym for 12237 \emph on 12238 Intrusion Countermeasures Electronics 12239 \emph default 12240 , something that is very much like today's firewall systems (see section 12241 12242 \begin_inset LatexCommand \ref{Firewall} 12243 12244 \end_inset 12245 12246 ). 12247 He credits the invention of 12248 \emph on 12249 ICE 12250 \emph default 12251 to Tom Maddox. 12252 The missing three letters were inserted to create a word that makes sense; 12253 in fact, choosing the three-letter combination 12254 \emph on 12255 ust 12256 \emph default 12257 resulted in the creation of a word with a double sense via bi-capitalization. 12258 \layout Standard 12259 12260 JustIce was written using and extending the excellent Byte Code Engineering 12261 Library 12262 \begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} 12263 12264 \end_inset 12265 12266 by Markus Dahm. 12267 It really helped a lot and sped up development time. 12268 \layout Standard 12269 12270 It was also --last but not least-- written to earn its author a German 12271 \emph on 12272 Dipl.-Inform. 12273 12274 \emph default 12275 degree which one may compare to a 12276 \emph on 12277 master 12278 \emph default 12279 degree. 12280 \layout Section 12281 12282 Flaws and Ambiguities Encountered 12283 \layout Standard 12284 12285 While designing, implementing and testing JustIce, a lot of interesting 12286 flaws and ambiguities were found in the specification 12287 \begin_inset LatexCommand \cite{vmspec2} 12288 12289 \end_inset 12290 12291 , the Java compiler 12292 \emph on 12293 javac 12294 \emph default 12295 and the JVM 12296 \emph on 12297 java 12298 \emph default 12299 . 12300 \layout Subsection 12301 12302 Flaws in the Java Virtual Machine Specification 12303 \layout Standard 12304 12305 The Java Virtual Machine Specification, Second Edition was derived from 12306 an in-house document describing the as-is implementation of Sun's genuine 12307 Java Virtual Machine ( 12308 \begin_inset LatexCommand \cite{vmspec2} 12309 12310 \end_inset 12311 12312 , page xiv). 12313 This sometimes leads to problems as there are still a few points left where 12314 Sun's engineers forgot to describe specification details to the public, 12315 in error assuming they would be implementation details. 12316 Another source of mistakes are ambiguities, inherent to natural languages 12317 auch as English. 12318 \layout Subsubsection 12319 12320 A Code Length Maximum of 65535 Bytes per Method 12321 \layout Standard 12322 12323 On page 152, The Java Virtual Machine Specification, Second Edition 12324 \begin_inset LatexCommand \cite{vmspec2} 12325 12326 \end_inset 12327 12328 says that code arrays may at most have a length of 65536 bytes because 12329 certain indices that point into the code are only 16 bits of width. 12330 Page 134 states the code must have 12331 \begin_inset Quotes gld 12332 \end_inset 12333 12334 less than 12335 \begin_inset Quotes grd 12336 \end_inset 12337 12338 65536 bytes. 12339 Therefore, the limitation stated on page 152 is not helpful, but only confusing. 12340 \layout Subsubsection 12341 12342 Subroutines 12343 \layout Standard 12344 12345 The implementation of a provably correct verifier is not possible because 12346 of the ambiguities in the specification 12347 \begin_inset LatexCommand \cite{vmspec2} 12348 12349 \end_inset 12350 12351 . 12352 To reach this goal, various efforts have been made to describe the verifier 12353 and the JVM formally 12354 \begin_inset LatexCommand \cite{Qian,StataAbadi,FreundMitchell,JBook,JPaper} 12355 12356 \end_inset 12357 12358 . 12359 By restricting the code 12360 \emph on 12361 javac 12362 \emph default 12363 produces or by redefining the verifier's behaviour, however, they are never 12364 one-to-one with the behaviour of the existing JVMs. 12365 \layout Standard 12366 12367 Sun's specification does not define the term 12368 \emph on 12369 subroutine 12370 \emph default 12371 although it is used. 12372 Instead, it is explained what bytecode the Java 12373 \emph on 12374 compiler 12375 \emph default 12376 generates when a 12377 \family typewriter 12378 finally 12379 \family default 12380 clause appears in the Java 12381 \emph on 12382 language 12383 \emph default 12384 source code -- this definitely does not belong there, because a verifier 12385 must never assume the code it verifies was created by Sun's 12386 \emph on 12387 javac 12388 \emph default 12389 compiler. 12390 \layout Standard 12391 12392 Clarifying this issue could lead to an 12393 \emph on 12394 official 12395 \emph default 12396 formal specification. 12397 \layout Subsubsection 12398 12399 The Specification Sometimes Satisfies the Verifier 12400 \layout Standard 12401 12402 12403 \begin_inset LatexCommand \label{InvokeInterfaceDescFONG} 12404 12405 \end_inset 12406 12407 Fong 12408 \begin_inset LatexCommand \cite{Fong2-WWW} 12409 12410 \end_inset 12411 12412 found in 1997 that the 12413 \family typewriter 12414 invokeinterface 12415 \family default 12416 opcode was underspecified in the first edition of the Java Virtual Machine 12417 Specification. 12418 He managed to create a class file that did not implement a specific interface 12419 but nevertheless used 12420 \family typewriter 12421 invokeinterface 12422 \family default 12423 to invoke a method. 12424 This class file passed the verifier (up to pass three), but the JVM found 12425 the problem during run-time (pass four). 12426 Fong concluded that the omission in the specification was done on purpose 12427 because the implementation of the data flow analyzer does not allow to 12428 check this constraint (please see section 12429 \begin_inset LatexCommand \ref{NewVerificationStrategy} 12430 12431 \end_inset 12432 12433 for a description of how this limitation could be overcome). 12434 However, in The Java Virtual Machine Specification, Second Edition 12435 \begin_inset LatexCommand \cite{vmspec2} 12436 12437 \end_inset 12438 12439 , the specification of 12440 \family typewriter 12441 invokeinterface 12442 \family default 12443 is corrected. 12444 \layout Standard 12445 12446 Still, there is another case where one would suspect the specification describes 12447 the behaviour of the verifier: on pages 147 and 148 of the specification 12448 12449 \begin_inset LatexCommand \cite{vmspec2} 12450 12451 \end_inset 12452 12453 , verification of instance initialization methods and newly created objects 12454 is explained. 12455 12456 \begin_inset Quotes eld 12457 \end_inset 12458 12459 A valid instruction sequence must not have an uninitialized object on the 12460 operand stack or in a local variable during a backwards branch, or in a 12461 local variable in code protected by an exception handler or a 12462 \family typewriter 12463 finally 12464 \family default 12465 clause 12466 \begin_inset Quotes erd 12467 \end_inset 12468 12469 . 12470 Note that the Java language keyword 12471 \family typewriter 12472 finally 12473 \family default 12474 does not really belong here (Sun should speak of 12475 \emph on 12476 subroutines 12477 \emph default 12478 ), but more important is that this specification is made to satisfy the 12479 verification algorithm: 12480 \begin_inset Quotes eld 12481 \end_inset 12482 12483 Otherwise, a devious piece of code might fool the verifier 12484 \begin_inset Quotes erd 12485 \end_inset 12486 12487 . 12488 12489 \layout Subsubsection 12490 12491 12492 \begin_inset LatexCommand \label{InnerBug} 12493 12494 \end_inset 12495 12496 The '$' Character as a Valid Part of a Java Name 12497 \layout Standard 12498 12499 Because the 12500 \emph on 12501 javac 12502 \emph default 12503 compiler may create class files with a '$' character in their names as 12504 a result of Java source files defining inner classes, this character should 12505 no longer be a valid part of a Java name to avoid problems. 12506 I.e., the method invocation 12507 \emph on 12508 ja\SpecialChar \- 12509 va.lang.Cha\SpecialChar \- 12510 rac\SpecialChar \- 12511 ter.is\SpecialChar \- 12512 Ja\SpecialChar \- 12513 va\SpecialChar \- 12514 Iden\SpecialChar \- 12515 tifier\SpecialChar \- 12516 Part('$'); 12517 \emph default 12518 should return the value 12519 \family typewriter 12520 false 12521 \family default 12522 . 12523 \layout Subsection 12524 12525 Flaws in the Implementation of the 12526 \emph on 12527 Java Platform 12528 \layout Subsubsection 12529 12530 12531 \begin_inset LatexCommand \label{javacRejected} 12532 12533 \end_inset 12534 12535 Sun's Verifier Rejects Code Produced by Sun's Compiler 12536 \layout Standard 12537 12538 Surprisingly, there are a number of examples in which such a thing happens. 12539 \layout Paragraph 12540 12541 12542 \begin_inset LatexCommand \label{StaerkJreject} 12543 12544 \end_inset 12545 12546 Another Problem With Subroutines 12547 \layout Standard 12548 12549 In 12550 \begin_inset LatexCommand \cite{JPaper} 12551 12552 \end_inset 12553 12554 , Strk and Schmid give a few code examples which are compiled correctly 12555 by the 12556 \emph on 12557 javac 12558 \emph default 12559 compiler but the resulting code is rejected by the traditional verifiers. 12560 Algorithms 12561 \begin_inset LatexCommand \ref{StaerkJLang} 12562 12563 \end_inset 12564 12565 and 12566 \begin_inset LatexCommand \ref{StaerkJByteCode} 12567 12568 \end_inset 12569 12570 show one of their examples given in the Java programming language and the 12571 resulting output of the 12572 \emph on 12573 javac 12574 \emph default 12575 compiler. 12576 \begin_float alg 12577 \layout Caption 12578 12579 12580 \begin_inset LatexCommand \label{StaerkJLang} 12581 12582 \end_inset 12583 12584 Strk and Schmid's Rejected Class, Java Language Version 12585 \layout Standard 12586 12587 12588 \family typewriter 12589 class Test1{ 12590 \newline 12591 \SpecialChar \- 12592 \SpecialChar ~ 12593 \SpecialChar ~ 12594 \SpecialChar ~ 12595 \SpecialChar ~ 12596 int test(boolean b){ 12597 \newline 12598 \SpecialChar \- 12599 \SpecialChar ~ 12600 \SpecialChar ~ 12601 \SpecialChar ~ 12602 \SpecialChar ~ 12603 \SpecialChar ~ 12604 \SpecialChar ~ 12605 int i; 12606 \newline 12607 \SpecialChar \- 12608 \SpecialChar ~ 12609 \SpecialChar ~ 12610 \SpecialChar ~ 12611 \SpecialChar ~ 12612 \SpecialChar ~ 12613 \SpecialChar ~ 12614 try{ 12615 \newline 12616 \SpecialChar \- 12617 \SpecialChar ~ 12618 \SpecialChar ~ 12619 \SpecialChar ~ 12620 \SpecialChar ~ 12621 \SpecialChar ~ 12622 \SpecialChar ~ 12623 \SpecialChar ~ 12624 \SpecialChar ~ 12625 if (b) return 1; 12626 \newline 12627 \SpecialChar \- 12628 \SpecialChar ~ 12629 \SpecialChar ~ 12630 \SpecialChar ~ 12631 \SpecialChar ~ 12632 \SpecialChar ~ 12633 \SpecialChar ~ 12634 \SpecialChar ~ 12635 \SpecialChar ~ 12636 i=2; 12637 \newline 12638 \SpecialChar \- 12639 \SpecialChar ~ 12640 \SpecialChar ~ 12641 \SpecialChar ~ 12642 \SpecialChar ~ 12643 \SpecialChar ~ 12644 \SpecialChar ~ 12645 } 12646 \newline 12647 \SpecialChar \- 12648 \SpecialChar ~ 12649 \SpecialChar ~ 12650 \SpecialChar ~ 12651 \SpecialChar ~ 12652 \SpecialChar ~ 12653 \SpecialChar ~ 12654 finally { 12655 \newline 12656 \SpecialChar \- 12657 \SpecialChar ~ 12658 \SpecialChar ~ 12659 \SpecialChar ~ 12660 \SpecialChar ~ 12661 \SpecialChar ~ 12662 \SpecialChar ~ 12663 \SpecialChar ~ 12664 \SpecialChar ~ 12665 if (b) i = 3; 12666 \newline 12667 \SpecialChar \- 12668 \SpecialChar ~ 12669 \SpecialChar ~ 12670 \SpecialChar ~ 12671 \SpecialChar ~ 12672 \SpecialChar ~ 12673 \SpecialChar ~ 12674 } 12675 \newline 12676 \SpecialChar \- 12677 \SpecialChar ~ 12678 \SpecialChar ~ 12679 \SpecialChar ~ 12680 \SpecialChar ~ 12681 \SpecialChar ~ 12682 \SpecialChar ~ 12683 return i; 12684 \newline 12685 \SpecialChar \- 12686 \SpecialChar ~ 12687 \SpecialChar ~ 12688 \SpecialChar ~ 12689 \SpecialChar ~ 12690 } 12691 \newline 12692 \SpecialChar ~ 12693 \SpecialChar ~ 12694 \SpecialChar ~ 12695 } 12696 \end_float 12697 \layout Standard 12698 12699 \begin_float alg 12700 \layout Caption 12701 12702 12703 \begin_inset LatexCommand \label{StaerkJByteCode} 12704 12705 \end_inset 12706 12707 Strk and Schmid's Rejected Class, JVM Bytecode Version 12708 \layout Standard 12709 12710 12711 \family typewriter 12712 int test(boolean arg1) 12713 \layout Standard 12714 12715 12716 \family typewriter 12717 Code(max_stack = 1, max_locals = 6, code_length = 39) 12718 \layout Standard 12719 12720 12721 \family typewriter 12722 0: iload_1 12723 \layout Standard 12724 12725 12726 \family typewriter 12727 1: ifeq #11 12728 \layout Standard 12729 12730 12731 \family typewriter 12732 4: iconst_1 12733 \layout Standard 12734 12735 12736 \family typewriter 12737 5: istore_3 12738 \layout Standard 12739 12740 12741 \family typewriter 12742 6: jsr #27 12743 \layout Standard 12744 12745 12746 \family typewriter 12747 9: iload_3 12748 \layout Standard 12749 12750 12751 \family typewriter 12752 10: ireturn 12753 \layout Standard 12754 12755 12756 \family typewriter 12757 11: iconst_2 12758 \layout Standard 12759 12760 12761 \family typewriter 12762 12: istore_2 12763 \layout Standard 12764 12765 12766 \family typewriter 12767 13: jsr #27 12768 \layout Standard 12769 12770 12771 \family typewriter 12772 16: goto #37 12773 \layout Standard 12774 12775 12776 \family typewriter 12777 19: astore %4 12778 \layout Standard 12779 12780 12781 \family typewriter 12782 21: jsr #27 12783 \layout Standard 12784 12785 12786 \family typewriter 12787 24: aload %4 12788 \layout Standard 12789 12790 12791 \family typewriter 12792 26: athrow 12793 \layout Standard 12794 12795 12796 \family typewriter 12797 27: astore %5 12798 \layout Standard 12799 12800 12801 \family typewriter 12802 29: iload_1 12803 \layout Standard 12804 12805 12806 \family typewriter 12807 30: ifeq #35 12808 \layout Standard 12809 12810 12811 \family typewriter 12812 33: iconst_3 12813 \layout Standard 12814 12815 12816 \family typewriter 12817 34: istore_2 12818 \layout Standard 12819 12820 12821 \family typewriter 12822 35: ret %5 12823 \layout Standard 12824 12825 12826 \family typewriter 12827 37: iload_2 12828 \layout Standard 12829 12830 12831 \family typewriter 12832 38: ireturn 12833 \end_float 12834 If one tries to run this bytecode using a JVM by IBM Corporation, the code 12835 is rejected 12836 \begin_float footnote 12837 \layout Standard 12838 12839 It is also rejected by Sun's JVMs and the Kimera verifier 12840 \begin_inset LatexCommand \cite{Kimera-WWW} 12841 12842 \end_inset 12843 12844 . 12845 \end_float 12846 : 12847 \newline 12848 12849 \family typewriter 12850 ehaase@haneman:/home/ehaase > java Test1 12851 \newline 12852 \SpecialChar \- 12853 \SpecialChar ~ 12854 \SpecialChar ~ 12855 Exception in thread "main" java.lang.VerifyError: 12856 \newline 12857 \SpecialChar \- 12858 \SpecialChar ~ 12859 \SpecialChar ~ 12860 (class: Test1, method: test signature: (Z)I) 12861 \newline 12862 \SpecialChar \- 12863 \SpecialChar ~ 12864 \SpecialChar ~ 12865 Localvariable 2 contains wrong type 12866 \newline 12867 12868 \newline 12869 12870 \family default 12871 In his lectures, Strk explains that the problem lies in the polymorphic 12872 nature of JVM subroutines 12873 \begin_inset LatexCommand \cite{JLectures} 12874 12875 \end_inset 12876 12877 . 12878 Consider algorithm 12879 \begin_inset LatexCommand \ref{StaerkJByteCode} 12880 12881 \end_inset 12882 12883 . 12884 In line 12, an 12885 \family typewriter 12886 int 12887 \family default 12888 is put into local variable number 2. 12889 The subroutine starting at line 27 is then called from line number 13. 12890 Note that this subroutine accesses the local variable number 2. 12891 Finally, line 16 transfers control to line 37 where the verification problem 12892 occurs. 12893 An 12894 \family typewriter 12895 int 12896 \family default 12897 should be read from local variable number 2, but this is marked 12898 \family typewriter 12899 unusable 12900 \family default 12901 , because it was accessed in the subroutine. 12902 \layout Standard 12903 12904 However, the specification ( 12905 \begin_inset LatexCommand \cite{vmspec2} 12906 12907 \end_inset 12908 12909 , page 151) states: 12910 \layout Itemize 12911 12912 For any local variable that [\SpecialChar \ldots{} 12913 ] has been accessed or modified by the subroutine, 12914 use the type of the local variable at the time of the 12915 \family typewriter 12916 ret 12917 \family default 12918 . 12919 \layout Itemize 12920 12921 For any other local variables, use the type of the local variable before 12922 the 12923 \family typewriter 12924 jsr 12925 \family default 12926 instruction. 12927 \layout Standard 12928 12929 As one can see, in the above example local variable number 2 holds an 12930 \family typewriter 12931 int 12932 \family default 12933 data type in both cases; there is no need to mark it 12934 \family typewriter 12935 unusable 12936 \family default 12937 . 12938 This is the reason why JustIce does not reject the above bytecode, thus 12939 being slightly incompatible with the behaviour of other verifiers. 12940 \layout Paragraph 12941 12942 The Maximum Method Length May Be Exceeded 12943 \layout Standard 12944 12945 The 12946 \emph on 12947 javac 12948 \emph default 12949 compiler Sun included in the Java Development Kit version 1.3.0_01 does not 12950 check for the maximum method length of the 12951 \family typewriter 12952 code 12953 \family default 12954 array in a 12955 \family typewriter 12956 Code 12957 \family default 12958 attribute (see section 12959 \begin_inset LatexCommand \ref{CodeAttribute} 12960 12961 \end_inset 12962 12963 ). 12964 A test file containing 65000 lines like 12965 \begin_inset Quotes eld 12966 \end_inset 12967 12968 12969 \family typewriter 12970 Sys\SpecialChar \- 12971 tem.out.println( 12972 \begin_inset Quotes eld 12973 \end_inset 12974 12975 Test 12976 \begin_inset Quotes erd 12977 \end_inset 12978 12979 ); 12980 \family default 12981 12982 \begin_inset Quotes erd 12983 \end_inset 12984 12985 was compiled, but the resulting class file was rejected by the verifier. 12986 \layout Standard 12987 12988 IBM Corporation's 12989 \emph on 12990 jikes 12991 \emph default 12992 compiler does not even generate code, but it locks up while compiling the 12993 test file. 12994 \layout Subsubsection 12995 12996 A Compiler Issue Related to Inner Classes 12997 \layout Standard 12998 12999 The 13000 \emph on 13001 javac 13002 \emph default 13003 compiler has to name class files, even those of so-called anonymous classes 13004 13005 \begin_inset LatexCommand \cite{InnerSpec} 13006 13007 \end_inset 13008 13009 . 13010 \layout Standard 13011 13012 This can cause problems: an inner class 13013 \emph on 13014 I 13015 \emph default 13016 defined in a class 13017 \emph on 13018 A 13019 \emph default 13020 will be compiled into a class file called 13021 \emph on 13022 A$I.class 13023 \emph default 13024 . 13025 A Java class named 13026 \emph on 13027 A$I 13028 \emph default 13029 will also be compiled into a class file named 13030 \emph on 13031 A$I.class 13032 \emph default 13033 overwriting the former class file. 13034 Because Sun did not forbid the ' 13035 \emph on 13036 $ 13037 \emph default 13038 ' character as a legal part of a Java identifier, the 13039 \emph on 13040 javac 13041 \emph default 13042 compiler should use a more sophisticated naming scheme. 13043 \layout Subsubsection 13044 13045 13046 \begin_inset LatexCommand \label{PassFourBug} 13047 13048 \end_inset 13049 13050 Pass Four is Only Partially Implemented 13051 \layout Standard 13052 13053 Pass four defines run-time tests for constraints that could also be verified 13054 in pass three; it is only for performance reasons that these tests are 13055 delayed. 13056 Instead of having all the tests in one place, they are unnecessarily spread 13057 13058 \begin_inset Quotes eld 13059 \end_inset 13060 13061 making the validation of the verification algorithm itself extremely difficult 13062 \begin_inset Quotes erd 13063 \end_inset 13064 13065 13066 \begin_inset LatexCommand \cite{Fong-WWW} 13067 13068 \end_inset 13069 13070 . 13071 Risking security for better performance is often regarded as a bad decision. 13072 For instance, in the 13073 \layout Standard 13074 13075 13076 \family typewriter 13077 java version "1.3.0_01" 13078 \layout Standard 13079 13080 13081 \family typewriter 13082 Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0_01) 13083 \layout Standard 13084 13085 13086 \family typewriter 13087 Java HotSpot(TM) Client VM (build 1.3.0_01, mixed mode) 13088 \layout Standard 13089 13090 Java Virtual Machine, the pass four check for access rights was unintentionally 13091 omitted. 13092 Sadly, other vendors license Sun's code and base their own implementations 13093 on that code. 13094 Therefore, mistakes are often inherited throughout the JVM vendors. 13095 The 13096 \layout Standard 13097 13098 13099 \family typewriter 13100 java version "1.3.0" 13101 \layout Standard 13102 13103 13104 \family typewriter 13105 Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0) 13106 \layout Standard 13107 13108 13109 \family typewriter 13110 Classic VM (build 1.3.0, J2RE 1.3.0 IBM build cx130-20010626 (JIT enabled: jitc)) 13111 \layout Standard 13112 13113 Java Virtual Machine by IBM Corporation, for example, exposes the same mistake. 13114 \layout Section 13115 13116 Related Work 13117 \layout Subsection 13118 13119 The Kimera Project 13120 \layout Standard 13121 13122 It is a misfortune that the Kimera 13123 \begin_inset LatexCommand \cite{Kimera-WWW} 13124 13125 \end_inset 13126 13127 project closed the World Wide Web presence and that the source code of 13128 the Kimera verifier was never released -- it would have been quite interesting 13129 to see how that respected verifier implementation deals with the problems 13130 arising concerning subroutine verification. 13131 \layout Standard 13132 13133 However, Kimera is the single other stand-alone verifier besides JustIce 13134 the author knows of. 13135 The people behind the project found important security breaches in JVM 13136 implementations of various World Wide Web browsers. 13137 \layout Standard 13138 13139 Also, they validated their verifier implementation and published several 13140 papers on JVM implementation verification 13141 \begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} 13142 13143 \end_inset 13144 13145 . 13146 \layout Subsection 13147 13148 The Verifier by Strk, Schmid and Brger 13149 \layout Standard 13150 13151 In 13152 \begin_inset LatexCommand \cite{JBook} 13153 13154 \end_inset 13155 13156 , the authors define the Java programming language and the Java virtual 13157 machine formally using 13158 \emph on 13159 Abstract State Machines 13160 \emph default 13161 (ASM). 13162 This also includes the verifier; its specifications have also been implemented 13163 in the functional programming language AsmGofer 13164 \begin_inset LatexCommand \cite{AsmGofer} 13165 13166 \end_inset 13167 13168 . 13169 This implementation is included on the CD-ROM that accompanies the book. 13170 \layout Standard 13171 13172 The 13173 \begin_inset Quotes eld 13174 \end_inset 13175 13176 13177 \emph on 13178 JBook verifier 13179 \emph default 13180 13181 \begin_inset Quotes erd 13182 \end_inset 13183 13184 does not implement a complete class file verifier. 13185 It currently only implements the bytecode verification. 13186 Its input files are not class files itself, but a textual representation 13187 of class files in so-called Jasmin format 13188 \begin_inset LatexCommand \cite{JVM} 13189 13190 \end_inset 13191 13192 . 13193 Therefore, this implementation is merely of theoretical interest. 13194 \layout Standard 13195 13196 It does, however, implement a bytecode verifier that is founded on a 13197 \emph on 13198 solid 13199 \emph default 13200 theory. 13201 This theory could become the standard for the interpretation of the JVM 13202 specification 13203 \begin_inset LatexCommand \cite{vmspec2} 13204 13205 \end_inset 13206 13207 . 13208 It could even change the specification to remove its ambiguities. 13209 \layout Standard 13210 13211 There is also an unreleased version of this verifier implemented in the 13212 Java programming language using the BCEL. 13213 This implementation, if it should ever be released, promises a lot as it 13214 could combine usability and a solid theory. 13215 \layout Section 13216 13217 13218 \begin_inset LatexCommand \label{GPL} 13219 13220 \end_inset 13221 13222 The GNU General Public License 13223 \layout Standard 13224 13225 13226 \emph on 13227 GNU GENERAL PUBLIC LICENSE 13228 \layout Standard 13229 13230 Version 2, June 1991 13231 \layout Standard 13232 13233 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 13234 \layout Standard 13235 13236 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 13237 \layout Standard 13238 13239 Everyone is permitted to copy and distribute verbatim copies of this license 13240 document, but changing it is not allowed. 13241 \layout Standard 13242 13243 13244 \emph on 13245 Preamble 13246 \layout Standard 13247 13248 The licenses for most software are designed to take away your freedom to 13249 share and change it. 13250 By contrast, the GNU General Public License is intended to guarantee your 13251 freedom to share and change free software--to make sure the software is 13252 free for all its users. 13253 This General Public License applies to most of the Free Software Foundation's 13254 software and to any other program whose authors commit to using it. 13255 (Some other Free Software Foundation software is covered by the GNU Library 13256 General Public License instead.) You can apply it to your programs, too.When 13257 we speak of free software, we are referring to freedom, not price. 13258 Our General Public Licenses are designed to make sure that you have the 13259 freedom to distribute copies of free software (and charge for this service 13260 if you wish), that you receive source code or can get it if you want it, 13261 that you can change the software or use pieces of it in new free programs; 13262 and that you know you can do these things. 13263 \layout Standard 13264 13265 To protect your rights, we need to make restrictions that forbid anyone 13266 to deny you these rights or to ask you to surrender the rights. 13267 \layout Standard 13268 13269 These restrictions translate to certain responsibilities for you if you 13270 distribute copies of the software, or if you modify it. 13271 For example, if you distribute copies of such a program, whether gratis 13272 or for a fee, you must give the recipients all the rights that you have. 13273 You must make sure that they, too, receive or can get the source code. 13274 And you must show them these terms so they know their rights. 13275 \layout Standard 13276 13277 We protect your rights with two steps: 13278 \layout Standard 13279 13280 (1) copyright the software, and 13281 \layout Standard 13282 13283 (2) offer you this license which gives you legal permission to copy, distribute 13284 and/or modify the software. 13285 \layout Standard 13286 13287 Also, for each author's protection and ours, we want to make certain that 13288 everyone understands that there is no warranty for this free software. 13289 If the software is modified by someone else and passed on, we want its 13290 recipients to know that what they have is not the original, so that any 13291 problems introduced by others will not reflect on the original authors' 13292 reputations. 13293 \layout Standard 13294 13295 Finally, any free program is threatened constantly by software patents. 13296 We wish to avoid the danger that redistributors of a free program will 13297 individually obtain patent licenses, in effect making the program proprietary. 13298 To prevent this, we have made it clear that any patent must be licensed 13299 for everyone's free use or not licensed at all. 13300 \layout Standard 13301 13302 The precise terms and conditions for copying, distribution and modification 13303 follow. 13304 \layout Standard 13305 13306 13307 \emph on 13308 GNU GENERAL PUBLIC LICENSE 13309 \layout Standard 13310 13311 13312 \emph on 13313 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 13314 \layout Standard 13315 13316 0. 13317 This License applies to any program or other work which contains a notice 13318 placed by the copyright holder saying it may be distributed under the terms 13319 of this General Public License. 13320 The "Program", below, refers to any such program or work, and a "work based 13321 on the Program" means either the Program or any derivative work under copyright 13322 law: that is to say, a work containing the Program or a portion of it, 13323 either verbatim or with modifications and/or translated into another language. 13324 (Hereinafter, translation is included without limitation in the term "modificat 13325 ion".) Each licensee is addressed as "you". 13326 Activities other than copying, distribution and modification are not covered 13327 by this License; they are outside its scope. 13328 The act of running the Program is not restricted, and the output from the 13329 Program is covered only if its contents constitute a work based on the 13330 Program (independent of having been made by running the Program). 13331 Whether that is true depends on what the Program does. 13332 \layout Standard 13333 13334 1. 13335 You may copy and distribute verbatim copies of the Program's source code 13336 as you receive it, in any medium, provided that you conspicuously and appropria 13337 tely publish on each copy an appropriate copyright notice and disclaimer 13338 of warranty; keep intact all the notices that refer to this License and 13339 to the absence of any warranty; and give any other recipients of the Program 13340 a copy of this License along with the Program. 13341 You may charge a fee for the physical act of transferring a copy, and you 13342 may at your option offer warranty protection in exchange for a fee. 13343 \layout Standard 13344 13345 2. 13346 You may modify your copy or copies of the Program or any portion of it, 13347 thus forming a work based on the Program, and copy and distribute such 13348 modifications or work under the terms of Section 1 above, provided that 13349 you also meet all of these conditions: 13350 \layout Standard 13351 13352 a) You must cause the modified files to carry prominent notices stating 13353 that you changed the files and the date of any change. 13354 \layout Standard 13355 13356 b) You must cause any work that you distribute or publish, that in whole 13357 or in part contains or is derived from the Program or any part thereof, 13358 to be licensed as a whole at no charge to all third parties under the terms 13359 of this License. 13360 \layout Standard 13361 13362 c) If the modified program normally reads commands interactively when run, 13363 you must cause it, when started running for such interactive use in the 13364 most ordinary way, to print or display an announcement including an appropriate 13365 copyright notice and a notice that there is no warranty (or else, saying 13366 that you provide a warranty) and that users may redistribute the program 13367 under these conditions, and telling the user how to view a copy of this 13368 License. 13369 (Exception: if the Program itself is interactive but does not normally 13370 print such an announcement, your work based on the Program is not required 13371 to print an announcement.) These requirements apply to the modified work 13372 as a whole. 13373 If identifiable sections of that work are not derived from the Program, 13374 and can be reasonably considered independent and separate works in themselves, 13375 then this License, and its terms, do not apply to those sections when you 13376 distribute them as separate works. 13377 But when you distribute the same sections as part of a whole which is a 13378 work based on the Program, the distribution of the whole must be on the 13379 terms of this License, whose permissions for other licensees extend to 13380 the entire whole, and thus to each and every part regardless of who wrote 13381 it. 13382 Thus, it is not the intent of this section to claim rights or contest your 13383 rights to work written entirely by you; rather, the intent is to exercise 13384 the right to control the distribution of derivative or collective works 13385 based on the Program. 13386 In addition, mere aggregation of another work not based on the Program 13387 with the Program (or with a work based on the Program) on a volume of a 13388 storage or distribution medium does not bring the other work under the 13389 scope of this License. 13390 \layout Standard 13391 13392 3. 13393 You may copy and distribute the Program (or a work based on it, under Section 13394 2) in object code or executable form under the terms of Sections 1 and 13395 2 above provided that you also do one of the following: 13396 \layout Standard 13397 13398 a) Accompany it with the complete corresponding machine-readable source 13399 code, which must be distributed under the terms of Sections 1 and 2 above 13400 on a medium customarily used for software interchange; or, 13401 \layout Standard 13402 13403 b) Accompany it with a written offer, valid for at least three years, to 13404 give any third party, for a charge no more than your cost of physically 13405 performing source distribution, a complete machine-readable copy of the 13406 corresponding source code, to be distributed under the terms of Sections 13407 1 and 2 above on a medium customarily used for software interchange; or, 13408 \layout Standard 13409 13410 c) Accompany it with the information you received as to the offer to distribute 13411 corresponding source code. 13412 (This alternative is allowed only for noncommercial distribution and only 13413 if you received the program in object code or executable form with such 13414 an offer, in accord with Subsection b above.) The source code for a work 13415 means the preferred form of the work for making modifications to it. 13416 For an executable work, complete source code means all the source code 13417 for all modules it contains, plus any associated interface definition files, 13418 plus the scripts used to control compilation and installation of the executable. 13419 However, as a special exception, the source code distributed need not include 13420 anything that is normally distributed (in either source or binary form) 13421 with the major components (compiler, kernel, and so on) of the operating 13422 system on which the executable runs, unless that component itself accompanies 13423 the executable. 13424 If distribution of executable or object code is made by offering access 13425 to copy from a designated place, then offering equivalent access to copy 13426 the source code from the same place counts as distribution of the source 13427 code, even though third parties are not compelled to copy the source along 13428 with the object code. 13429 \layout Standard 13430 13431 4. 13432 You may not copy, modify, sublicense, or distribute the Program except 13433 as expressly provided under this License. 13434 Any attempt otherwise to copy, modify, sublicense or distribute the Program 13435 is void, and will automatically terminate your rights under this License. 13436 However, parties who have received copies, or rights, from you under this 13437 License will not have their licenses terminated so long as such parties 13438 remain in full compliance. 13439 \layout Standard 13440 13441 5. 13442 You are not required to accept this License, since you have not signed 13443 it. 13444 However, nothing else grants you permission to modify or distribute the 13445 Program or its derivative works. 13446 These actions are prohibited by law if you do not accept this License. 13447 Therefore, by modifying or distributing the Program (or any work based 13448 on the Program), you indicate your acceptance of this License to do so, 13449 and all its terms and conditions for copying, distributing or modifying 13450 the Program or works based on it. 13451 \layout Standard 13452 13453 6. 13454 Each time you redistribute the Program (or any work based on the Program), 13455 the recipient automatically receives a license from the original licensor 13456 to copy, distribute or modify the Program subject to these terms and conditions. 13457 You may not impose any further restrictions on the recipients' exercise 13458 of the rights granted herein. 13459 You are not responsible for enforcing compliance by third parties to this 13460 License. 13461 \layout Standard 13462 13463 7. 13464 If, as a consequence of a court judgment or allegation of patent infringement 13465 or for any other reason (not limited to patent issues), conditions are 13466 imposed on you (whether by court order, agreement or otherwise) that contradict 13467 the conditions of this License, they do not excuse you from the conditions 13468 of this License. 13469 If you cannot distribute so as to satisfy simultaneously your obligations 13470 under this License and any other pertinent obligations, then as a consequence 13471 you may not distribute the Program at all. 13472 For example, if a patent license would not permit royalty-free redistribution 13473 of the Program by all those who receive copies directly or indirectly through 13474 you, then the only way you could satisfy both it and this License would 13475 be to refrain entirely from distribution of the Program. 13476 If any portion of this section is held invalid or unenforceable under any 13477 particular circumstance, the balance of the section is intended to apply 13478 and the section as a whole is intended to apply in other circumstances. 13479 It is not the purpose of this section to induce you to infringe any patents 13480 or other property right claims or to contest validity of any such claims; 13481 this section has the sole purpose of protecting the integrity of the free 13482 software distribution system, which is implemented by public license practices. 13483 Many people have made generous contributions to the wide range of software 13484 distributed through that system in reliance on consistent application of 13485 that system; it is up to the author/donor to decide if he or she is willing 13486 to distribute software through any other system and a licensee cannot impose 13487 that choice. 13488 This section is intended to make thoroughly clear what is believed to be 13489 a consequence of the rest of this License. 13490 \layout Standard 13491 13492 8. 13493 If the distribution and/or use of the Program is restricted in certain 13494 countries either by patents or by copyrighted interfaces, the original 13495 copyright holder who places the Program under this License may add an explicit 13496 geographical distribution limitation excluding those countries, so that 13497 distribution is permitted only in or among countries not thus excluded. 13498 In such case, this License incorporates the limitation as if written in 13499 the body of this License. 13500 \layout Standard 13501 13502 9. 13503 The Free Software Foundation may publish revised and/or new versions of 13504 the General Public License from time to time. 13505 Such new versions will be similar in spirit to the present version, but 13506 may differ in detail to address new problems or concerns. 13507 Each version is given a distinguishing version number. 13508 If the Program specifies a version number of this License which applies 13509 to it and "any later version", you have the option of following the terms 13510 and conditions either of that version or of any later version published 13511 by the Free Software Foundation. 13512 If the Program does not specify a version number of this License, you may 13513 choose any version ever published by the Free Software Foundation. 13514 \layout Standard 13515 13516 10. 13517 If you wish to incorporate parts of the Program into other free programs 13518 whose distribution conditions are different, write to the author to ask 13519 for permission. 13520 For software which is copyrighted by the Free Software Foundation, write 13521 to the Free Software Foundation; we sometimes make exceptions for this. 13522 Our decision will be guided by the two goals of preserving the free status 13523 of all derivatives of our free software and of promoting the sharing and 13524 reuse of software generally. 13525 \layout Standard 13526 13527 13528 \emph on 13529 NO WARRANTY 13530 \layout Standard 13531 13532 11. 13533 BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 13534 THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 13535 EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER 13536 PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER 13537 EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 13538 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13539 THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH 13540 YOU. 13541 SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY 13542 SERVICING, REPAIR OR CORRECTION. 13543 \layout Standard 13544 13545 12. 13546 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 13547 ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 13548 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING 13549 ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF 13550 THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS 13551 OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR 13552 THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 13553 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY 13554 OF SUCH DAMAGES. 13555 \layout Standard 13556 13557 13558 \emph on 13559 END OF TERMS AND CONDITIONS 13560 \layout Addchap 13561 13562 Glossary 13563 \layout Description 13564 13565 Access\SpecialChar ~ 13566 modifiers In the Java programming language, the use of the keywords 13567 13568 \family typewriter 13569 private 13570 \family default 13571 , 13572 \family typewriter 13573 protected 13574 \family default 13575 , 13576 \family typewriter 13577 public 13578 \family default 13579 (or the use of no keyword) defines the access rights for data or program 13580 code (also called visibility). 13581 This information is also used by the JVM: it is part of the class files. 13582 The most important modifier is 13583 \family typewriter 13584 private 13585 \family default 13586 which is used to globally deny access to a field or method. 13587 \layout Description 13588 13589 Access\SpecialChar ~ 13590 rights Access rights are granted or denied by the use of 13591 \latex latex 13592 13593 \backslash 13594 ( 13595 \backslash 13596 triangleright 13597 \backslash 13598 ) 13599 \latex default 13600 access modifiers. 13601 \layout Description 13602 13603 API Applications Programming Interface. 13604 Such an interface is used to include functionality of foreign program modules 13605 (often 13606 \latex latex 13607 13608 \latex default 13609 Java 13610 \latex latex 13611 13612 \backslash 13613 ( 13614 \backslash 13615 triangleright 13616 \backslash 13617 ) 13618 \latex default 13619 packages) into own programs. 13620 \layout Description 13621 13622 Debugger A program used to investigate the behaviour of another program. 13623 Often used to find and remove programming errors, so-called bugs. 13624 \layout Description 13625 13626 Descriptor A symbolic description of type information. 13627 In the JVM's class files, strings in UTF-8 format 13628 \begin_inset LatexCommand \cite{Unicode} 13629 13630 \end_inset 13631 13632 are used to describe type information. 13633 \layout Description 13634 13635 Field A member of a Java object or class, also called variable or attribute. 13636 \layout Description 13637 13638 Method A member of a Java object or class. 13639 Methods include program code or they are abstract representatives for program 13640 code. 13641 A method can be compared to a 13642 \emph on 13643 function 13644 \emph default 13645 in programming languages like C or Pascal. 13646 \layout Description 13647 13648 Opcode Operation Code. 13649 This denotes an instruction in an assembly-like computer language; to some 13650 people it means its binary representation. 13651 \layout Description 13652 13653 Package A package is an entity used in both the Java programming language 13654 and the Java Virtual Machine definition. 13655 It is used to group classes that in the eyes of the programmer belong together. 13656 Package definitions have impact on 13657 \latex latex 13658 13659 \backslash 13660 ( 13661 \backslash 13662 triangleright 13663 \backslash 13664 ) 13665 \latex default 13666 access rights granted to other classes. 13667 \layout Description 13668 13669 Signature A method has a (possibly empty) set of arguments it expects, and 13670 it has a return type (possibly the 13671 \family typewriter 13672 void 13673 \family default 13674 type). 13675 The type information of the arguments and the return type together is called 13676 signature. 13677 A signature can be expressed in terms of a 13678 \latex latex 13679 13680 \backslash 13681 ( 13682 \backslash 13683 triangleright 13684 \backslash 13685 ) 13686 \latex default 13687 descriptor. 13688 \layout Description 13689 13690 Type A field or a method argument has a type such as 13691 \family typewriter 13692 int 13693 \family default 13694 or 13695 \family typewriter 13696 String 13697 \family default 13698 . 13699 In the JVM's context, all values are typed. 13700 Types can be expressed in terms of a 13701 \latex latex 13702 13703 \backslash 13704 ( 13705 \backslash 13706 triangleright 13707 \backslash 13708 ) 13709 \latex default 13710 descriptor. 13711 \layout Standard 13712 13713 13714 \begin_inset LatexCommand \listoffigures{} 13715 13716 \end_inset 13717 13718 13719 \layout Standard 13720 13721 13722 \latex latex 13723 13724 \backslash 13725 addcontentsline{toc}{chapter}{List Of Figures} 13726 \layout Standard 13727 13728 13729 \begin_inset LatexCommand \listofalgorithms{} 13730 13731 \end_inset 13732 13733 13734 \layout Standard 13735 13736 13737 \latex latex 13738 13739 \backslash 13740 addcontentsline{toc}{chapter}{List Of Algorithms} 13741 \layout Bibliography 13742 \bibitem [AppMag-WWW]{AppMag-WWW} 13743 13744 13745 \latex latex 13746 13747 \backslash 13748 addcontentsline{toc}{chapter}{Bibliography} 13749 \latex default 13750 AverStar's AppletMagic(tm): Ada for the Java Virtual Machine. 13751 \newline 13752 13753 \emph on 13754 http://www.appletmagic.com 13755 \layout Bibliography 13756 \bibitem [AsmGofer]{AsmGofer} 13757 13758 Joachim Schmid: AsmGofer. 13759 \newline 13760 13761 \emph on 13762 http://www.tydo.org 13763 \layout Bibliography 13764 \bibitem [BCEL98]{BCEL98} 13765 13766 Markus Dahm: Byte Code Engineering with the BCEL API. 13767 Freie Universitt Berlin, Institut fr Informatik. 13768 Technical Report B-17-98. 13769 \layout Bibliography 13770 \bibitem [BCEL-WWW]{BCEL-WWW} 13771 13772 Markus Dahm: Byte Code Engineering Library. 13773 \emph on 13774 13775 \newline 13776 http://bcel.sourceforge.net 13777 \layout Bibliography 13778 \bibitem [BCV-Soundness]{BCV-Soundness} 13779 13780 Cornelia Pusch: Proving the Soundness of a Java Bytecode Verifier Specification 13781 in Isabelle/HOL. 13782 Technische Universitt Mnchen, Institut fr Informatik. 13783 13784 \newline 13785 13786 \emph on 13787 http://www.in.tum.de/~pusch/ 13788 \layout Bibliography 13789 \bibitem [C]{C} 13790 13791 Brian W. 13792 Kerninghan, Dennis M. 13793 Ritchie: The C Programming Language, Second Edition, ANSI C. 13794 Prentice-Hall 1998, ISBN 0131103628. 13795 \layout Bibliography 13796 \bibitem [CPP-D]{CPP-D} 13797 13798 Bjarne Stroustrup: Die C++ Programmiersprache. 13799 Addison-Wesly-Longman, 1998, ISBN 3-8273-1296-5. 13800 \layout Bibliography 13801 \bibitem [CPP-E]{CPP-E} 13802 13803 Bjarne Stroustrup: The C++-Programming Language, Third Edition. 13804 Addison-Wesley 1997, ISBN 0-201-88954-4. 13805 \layout Bibliography 13806 \bibitem [D3]{D3} 13807 13808 Guido Lang, Andreas Bohne: Delphi 3.0 lernen. 13809 Addison-Wesley-Longman 1997, ISBN 3-8273-1190-x. 13810 \layout Bibliography 13811 \bibitem [DesignPatterns]{DesignPatterns} 13812 13813 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns 13814 Elements of Reusable Object-Oriented Software. 13815 Addison-Wesley 1995, ISBN: 0201633612. 13816 \layout Bibliography 13817 \bibitem [DragonBook]{DragonBook} 13818 13819 Alfred V. 13820 Aho, Ravi Sethi, Jeffrey D. 13821 Ullman: Compilers: Principles, Techniques, and Tools. 13822 Addison-Wesley 1985, ISBN: 0201100886. 13823 \layout Bibliography 13824 \bibitem [EF]{EF} 13825 13826 ElectricalFire. 13827 \emph on 13828 13829 \newline 13830 http://www.mozilla.org/projects/ef/ 13831 \layout Bibliography 13832 \bibitem [f2j]{f2j} 13833 13834 Keith Seymour: f2j - Fortran-to-Java Compiler. 13835 \newline 13836 13837 \emph on 13838 http://cs.utk.edu/f2j/ 13839 \layout Bibliography 13840 \bibitem [Fong-WWW]{Fong-WWW} 13841 13842 Philip W. 13843 L. 13844 Fong: The mysterious Pass One, first draft, September 2, 1997. 13845 13846 \newline 13847 13848 \emph on 13849 http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/pass1/ 13850 \layout Bibliography 13851 \bibitem [Fong2-WWW]{Fong2-WWW} 13852 13853 Philip W. 13854 L. 13855 Fong: A Flaw with the Specification of the Invokeinterface Opcode. 13856 13857 \newline 13858 13859 \emph on 13860 http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/invokeinterface/ 13861 \layout Bibliography 13862 \bibitem [FreundMitchell]{FreundMitchell} 13863 13864 Stephen N. 13865 Freund, John Mitchell: A Formal Framework for the Java Bytecode Language 13866 and Verifier. 13867 Department of Computer Science, Stanford University. 13868 Stanford, CA 94305-9045. 13869 Appeared in OOPSLA '99. 13870 \layout Bibliography 13871 \bibitem [GCC-WWW]{GCC-WWW} 13872 13873 GCC, The GNU compiler collection. 13874 \emph on 13875 13876 \newline 13877 http://gcc.gnu.org 13878 \layout Bibliography 13879 \bibitem [GJ-WWW]{GJ-WWW} 13880 13881 GJ. 13882 A Generic Java Language Extension. 13883 \newline 13884 13885 \emph on 13886 http://www.cis.unisa.edu.au/~pizza/gj/ 13887 \layout Bibliography 13888 \bibitem [InnerSpec]{InnerSpec} 13889 13890 Sun Microsystems: Inner Classes Specification. 13891 \newline 13892 13893 \emph on 13894 http://java.sun.com/products/jdk/1.1/docs/guide/ 13895 \newline 13896 innerclasses/spec/innerclasses.doc.html 13897 \layout Bibliography 13898 \bibitem [J2ME-CLDCS]{J2ME-CLDCS} 13899 13900 Sun Microsystems: J2ME 13901 \latex latex 13902 13903 \backslash 13904 texttrademark 13905 \latex default 13906 \SpecialChar ~ 13907 Connected Limited Device Configuration Specification. 13908 \newline 13909 13910 \emph on 13911 http://jcp.org/aboutJava/communityprocess/final/jsr030/ 13912 \layout Bibliography 13913 \bibitem [JBook]{JBook} 13914 13915 Robert Strk, Joachim Schmid, Egon Brger: Java 13916 \latex latex 13917 13918 \backslash 13919 texttrademark\SpecialChar ~ 13920 13921 \latex default 13922 and the Java 13923 \latex latex 13924 13925 \backslash 13926 texttrademark\SpecialChar ~ 13927 13928 \latex default 13929 Virtual Machine. 13930 Springer-Verlag 2001, ISBN 3-540-42088-6. 13931 \newline 13932 13933 \emph on 13934 http://www.inf.ethz.ch/~jbook/ 13935 \layout Bibliography 13936 \bibitem [JPaper]{JPaper} 13937 13938 Robert F. 13939 Strk, Joachim Schmid: Java bytecode verification is not possible. 13940 ETH Zrich, Department of Computer Science 2000. 13941 \emph on 13942 13943 \newline 13944 http://www.inf.ethz.ch/~staerk/pdf/jbv00.pdf 13945 \layout Bibliography 13946 \bibitem [JLectures]{JLectures} 13947 13948 Robert F. 13949 Strk: Java and the JVM: Definition and Verification (37-474). 13950 \newline 13951 13952 \emph on 13953 http://www.inf.ethz.ch/~jbook/eth37474/ 13954 \newline 13955 http://www.inf.ethz.ch/~jbook/eth37474/javaBV.pdf 13956 \layout Bibliography 13957 \bibitem [JNS]{JNS} 13958 13959 Robert Macgregor, Dave Durbin, John Owlett, Andrew Yeomans: JAVA 13960 \latex latex 13961 13962 \backslash 13963 texttrademark 13964 \latex default 13965 \SpecialChar ~ 13966 Network Security. 13967 Prentice Hall 1998, ISBN 0137615299. 13968 \layout Bibliography 13969 \bibitem [JODE-WWW]{JODE-WWW} 13970 13971 JODE is a java package containing a decompiler and an optimizer for java. 13972 \newline 13973 13974 \emph on 13975 http://jode.sourceforge.net 13976 \layout Bibliography 13977 \bibitem [JustIce]{JustIce} 13978 13979 Enver Haase: JustIce. 13980 A Free Class File Verifier for Java 13981 \latex latex 13982 13983 \backslash 13984 texttrademark 13985 \latex default 13986 \SpecialChar ~ 13987 .Freie Universitt Berlin, Takustrae 9, D-14195 Berlin; September 2001. 13988 \newline 13989 13990 \emph on 13991 http://bcel.sourceforge.net/ 13992 \newline 13993 http://bcel.sourceforge.net/justice 13994 \layout Bibliography 13995 \bibitem [JVM]{JVM} 13996 13997 Jon Meyer, Troy Downing: JAVA Virtual Machine. 13998 O'Reilly 1997, ISBN 1-56592-194-1. 13999 \layout Bibliography 14000 \bibitem [Kaffe-WWW]{Kaffe-WWW} 14001 14002 Kaffe. 14003 Kaffe is a cleanroom, open source implementation of a Java virtual machine 14004 and class libraries. 14005 \emph on 14006 14007 \newline 14008 http://www.kaffe.org 14009 \layout Bibliography 14010 \bibitem [KAWA-WWW]{KAWA-WWW} 14011 14012 Kawa, the Java-based Scheme system. 14013 \emph on 14014 14015 \newline 14016 http://http://www.gnu.org/software/kawa/ 14017 \layout Bibliography 14018 \bibitem [KDE]{KDE} 14019 14020 KDE, the K desktop environment. 14021 \newline 14022 14023 \emph on 14024 http://www.kde.org 14025 \layout Bibliography 14026 \bibitem [Kimera-WWW]{Kimera-WWW} 14027 14028 The Kimera Verifier. 14029 14030 \emph on 14031 14032 \emph default 14033 14034 \newline 14035 Currently off-line because of a World Wide Web presentation rework. 14036 \emph on 14037 14038 \newline 14039 http://kimera.cs.washington.edu/verifier.html 14040 \newline 14041 http://www-kimera.cs.washington.edu 14042 \layout Bibliography 14043 \bibitem [Kimera-TestingJVM]{Kimera-TestingJVM} 14044 14045 Emin Gn Sirer: Testing Java Virtual Machines. 14046 An Experience Report on Automatically Testing Java Virtual Machines. 14047 University of Washington, Dept. 14048 of Computer Science and Engineering. 14049 \newline 14050 14051 \emph on 14052 http://kimera.cs.washington.edu 14053 \layout Bibliography 14054 \bibitem [Kimera-ProdGram]{Kimera-ProdGram} 14055 14056 Emin Gn Sirer, Brian N. 14057 Bershad: Using Production Grammars in Software Testing. 14058 University of Washington, Department of Computer Science. 14059 \newline 14060 14061 \emph on 14062 http://kimera.cs.washington.edu 14063 \layout Bibliography 14064 \bibitem [kissme-WWW]{kissme-WWW} 14065 14066 kissme. 14067 A free Java Virtual Machine. 14068 \emph on 14069 14070 \newline 14071 http://kissme.sourceforge.net 14072 \layout Bibliography 14073 \bibitem [Krakatoa-WWW]{Krakatoa-WWW} 14074 14075 Todd A. 14076 Proebsting, Scott A. 14077 Watterson: Krakatoa: Decompilation in Java (Does Bytecode Reveal Source?). 14078 The University of Arizona, Department of Computer Science. 14079 \newline 14080 14081 \emph on 14082 http://www.cs.arizona.edu/people/saw/papers/Krakatoa-COOTS97.ps.Z 14083 \layout Bibliography 14084 \bibitem [langspec2]{langspec2} 14085 14086 James Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specificati 14087 on, Second Edition. 14088 Addison-Wesley 2000, ISBN 0201310082. 14089 \layout Bibliography 14090 \bibitem [M2]{M2} 14091 14092 Niklaus Wirth: Programming in Modula-2, Fourth Edition. 14093 Springer-Verlag 1988, ISBN 3-540-50150-9. 14094 \layout Bibliography 14095 \bibitem [Mozilla]{Mozilla} 14096 14097 Mozilla.org (The Mozilla Origanization): Mozilla. 14098 \newline 14099 14100 \emph on 14101 http://www.mozilla.org 14102 \layout Bibliography 14103 \bibitem [Neuromancer]{Neuromancer} 14104 14105 William Gibson: Neuromancer. 14106 Ace Books 1994, ISBN 0441000681. 14107 \layout Bibliography 14108 \bibitem [ORP-WWW]{ORP-WWW} 14109 14110 Open Runtime Platform. 14111 A Platform For Bytecode System Research. 14112 \newline 14113 14114 \emph on 14115 http://www.intel.com/research/mrl/orp/index.htm 14116 \layout Bibliography 14117 \bibitem [PL4JVM]{PL4JVM} 14118 14119 Robert Tolksdorf: Programming Languages for the Java Virtual Machine. 14120 \newline 14121 14122 \emph on 14123 http://www.robert-tolksdorf.de/vmlanguages.html 14124 \layout Bibliography 14125 \bibitem [PMG-WWW]{PMG-WWW} 14126 14127 PMG. 14128 Poor Man's Genericity for Java. 14129 14130 \newline 14131 14132 \emph on 14133 14134 \layout Bibliography 14135 \bibitem [Qian]{Qian} 14136 14137 Zhenyu Qian: A Formal Specification of Java 14138 \latex latex 14139 14140 \backslash 14141 texttrademark 14142 \latex default 14143 \SpecialChar ~ 14144 Virtual Machine Instructions for Objects, Methods and Subroutines. 14145 Bremen Institute for Safe Systems (BISS), FB3 Informatik, Universitt Bremen, 14146 D-28334 Bremen, Germany. 14147 \layout Bibliography 14148 \bibitem [SableVM-WWW]{SableVM-WWW} 14149 14150 SableVM. 14151 A Bytecode Interpreter. 14152 \emph on 14153 14154 \newline 14155 http://www.sablevm.org 14156 \layout Bibliography 14157 \bibitem [StataAbadi]{StataAbadi} 14158 14159 Raymie Stata and Martin Abadi: A Type System for Java Bytecode Subroutines. 14160 In: ACM Transactions on Programming Languages and Systems, Vol. 14161 21, No. 14162 1, January 1999, Pages 90-137. 14163 \layout Bibliography 14164 \bibitem [Unknowable]{Unknowable} 14165 14166 G.J. 14167 Chaitin: The Unknowable. 14168 Springer-Verlag 1999, ISBN 981-4021-72-5. 14169 \newline 14170 14171 \emph on 14172 http://www.umcs.maine.edu/~chaitin/unknowable/ 14173 \layout Bibliography 14174 \bibitem [Unicode]{Unicode} 14175 14176 The Unicode Consortium: The Unicode Standard, Version 2.0. 14177 Niso Press 1996, ISBN 0-201-48345-9. 14178 \newline 14179 14180 \emph on 14181 http://www.unicode.org 14182 \layout Bibliography 14183 \bibitem [Yellin-WWW]{Yellin-WWW} 14184 14185 Frank Yellin: Low Level Security in Java. 14186 \emph on 14187 14188 \newline 14189 http://java.sun.com/sfaq/verifier.html 14190 \layout Bibliography 14191 \bibitem [VMSPEC2]{vmspec2} 14192 14193 Tim Lindholm, Frank Yellin: The Java 14194 \latex latex 14195 14196 \backslash 14197 texttrademark\SpecialChar ~ 14198 14199 \latex default 14200 Virtual Machine Specification, Second Edition. 14201 Addison-Wesley 1999, ISBN 0-201-43294-4. 14202 \the_end 14203