You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1081 lines
20 KiB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Java bytecode constraints</title>
<link rel=stylesheet href="java-constraints.css">
</head>
<body>
<h1>
Bytecode constraints
</h1>
<p>
From the point of view of a piece of code written in the Java
programming language or targeted in the same way to <code>.class</code>
files, the Dalvik VM aims to behave in a way
that is fully consistent with the language's definition.
That is, the code running in Dalvik will behave the same as it
would have running in any other virtual machine. This includes
verification failures.
The Dx/Dalvik system will check roughly the same
constraints that any other VM would, except as noted in the file
<a href="verifier.html">verifier.html</a>. The following table briefly
lists all Dx/Dalvik verification constraints together their analogs
from the book <i>The Java<super>TM</super> Language Specification</i>,
second edition. In the numbering scheme, the first three
elements refer to the specification chapter, the fourth one to the
bullet inside that chapter. The failure mode specifies whether the
constraint will fail during the Dx conversion or during verification in
the VM itself.
</p>
<h2>
Static constraints
</h2>
<p>
Static constraints are constraints on individual elements of the bytecode.
They usually can be checked without employing control or data-flow analysis
techniques.
</p>
<table>
<tr>
<th>
Identifier
</th>
<th>
Description
</th>
<th>
Spec equivalent
</th>
<th>
Failure mode
</th>
</tr>
<tr>
<td>
A1
</td>
<td>
The <code>code</code> array must not be empty.
</td>
<td>
4.8.1.1
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A2
</td>
<td>
The <code>code</code> array must not be larger than 65535 bytes.
</td>
<td>
4.8.1.2
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A3
</td>
<td>
The first opcode in <code>code</code> array must have index
<code>0</code>.
</td>
<td>
4.8.1.3
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A4
</td>
<td>
The <code>code</code> array must only contain valid opcodes.
</td>
<td>
4.8.1.4
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A5
</td>
<td>
The index of instruction <code>n+1</code> must equal the index of
instruction <code>n</code> plus the length of instruction
<code>n</code>, taking into account a possible <code>wide</code>
instruction. Opcodes modified by a <code>wide</code> instruction must
not be directly reachable.
</td>
<td>
4.8.1.5
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A6
</td>
<td>
The last instruction in <code>code</code> array must end at index
<code>code_length-1</code>.
</td>
<td>
4.8.1.6
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A7
</td>
<td>
All jump and branch targets must be opcodes within the same method.
Opcodes modified by a <code>wide</code> instruction must not be
directly reachable via a jump or branch instruction.
</td>
<td>
4.8.1.7
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A8
</td>
<td>
All targets of a <code>tableswitch</code> instruction must be opcodes
within the same method. Upper and lower bounds must be consistent.
Opcodes modified by a <code>wide</code> instruction must not be
directly reachable via a <code>tableswitch</code> instruction.
</td>
<td>
4.8.1.8
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A9
</td>
<td>
All targets of a <code>lookupswitch</code> instruction must be opcodes
within the same method. Its table must be consistent and sorted
low-to-high. Opcodes modified by a <code>wide</code> instruction must
not be directly reachable via a <code>lookupswitch</code> instruction.
</td>
<td>
4.8.1.9
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A10
</td>
<td>
The operands of <code>ldc</code> and <code>ldc_w</code> instructions
must be valid indices into the constant pool. The respective entries
must be of type <code>CONSTANT_Integer</code>,
<code>CONSTANT_Float</code>, or <code>CONSTANT_String</code>.
</td>
<td>
4.8.1.10
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A11
</td>
<td>
The operands of <code>ldc2_w</code> instructions must be valid indices
into the constant pool. The respective entries must be of type
<code>CONSTANT_Long</code> or <code>CONSTANT_Double</code>. The
subsequent constant pool entry must be valid and remain unused.
</td>
<td>
4.8.1.11
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A12
</td>
<td>
The Operands of <code>get&lt;kind&gt;</code> and
<code>put&lt;kind&gt;</code> instructions must be valid indices into
constant pool. The respective entries must be of type
<code>CONSTANT_Fieldref</code>.
</td>
<td>
4.8.1.12
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A13
</td>
<td>
The first two operands of <code>invokevirtual</code>,
<code>invokespecial</code>, and <code>invokestatic</code> must form a
valid 16-bit index into the constant pool. The respective entries must
be of type <code>CONSTANT_Methodref</code>.
</td>
<td>
4.8.1.13
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A14
</td>
<td>
Methods whose names start with '<' must only be invoked implicitly by
the VM, not by class file code. The only exception is the instance
initializer, which may be invoked by <code>invokespecial</code>.
</td>
<td>
4.8.1.14
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A15
</td>
<td>
The first two operands of <code>invokeinterface</code> must form a
valid 16-bit index into the constant pool. The entry must be of type
<code>CONSTANT_Interface_Methodref</code>. The third operand must
specify number of local variables and the fourth operand must always
be zero.
</td>
<td>
4.8.1.15
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A16
</td>
<td>
The operands of <code>instanceof</code>, <code>checkcast</code>,
<code>new</code>, and <code>anewarray</code> instructions must
be a valid index into the constant pool. The first two operands of
<code>multianewarray</code> instruction must form a valid 16-bit index
into the constant pool. All respective entries must be of type
<code>CONSTANT_Class</code>.
</td>
<td>
4.8.1.16
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A17
</td>
<td>
The dimensions of an array created by <code>anewarray</code>
instructions must be less than <code>256</code>.
</td>
<td>
4.8.1.17
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A18
</td>
<td>
The <code>new</code> instruction must not reference array classes,
interfaces, or abstract classes.
</td>
<td>
4.8.1.18
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A19
</td>
<td>
The type referenced by a <code>multinewarray</code> instruction must
have at least as many dimensions as specified in the instruction. The
dimensions operand must not be <code>0</code>
</td>
<td>
4.8.1.19
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A20
</td>
<td>
The type referenced by a <code>newarray</code> instruction must be a
valid, non-reference type.
</td>
<td>
4.8.1.20
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A21
</td>
<td>
The index operand of instructions explicitly referencing single-width
local variables must be non-negative and smaller than
<code>max_locals</code>.
</td>
<td>
4.8.1.21
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A22
</td>
<td>
The index operand of instructions implicitly referencing single-width
local variables must be non-negative and smaller than
<code>max_locals</code>.
</td>
<td>
4.8.1.22
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A23
</td>
<td>
The index operand of instructions explicitly referencing double-width
local variables must be non-negative and smaller than
<code>max_locals-1</code>.
</td>
<td>
4.8.1.23
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A24
</td>
<td>
The index operand of instructions implicitly referencing double-width
local variables must be non-negative and smaller than
<code>max_locals-1</code>.
</td>
<td>
4.8.1.24
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A25
</td>
<td>
The index operand of <code>wide</code> instructions explicitly
referencing single-width local variables must be non-negative and
smaller than <code>max_locals</code>.
</td>
<td>
4.8.1.25
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
A26
</td>
<td>
The index operand of <code>wide</code> instructions explicitly
referencing double-width local variables must be non-negative and
smaller than <code>max_locals-1</code>.
</td>
<td>
4.8.1.25
</td>
<td>
DX
</td>
</tr>
</table>
<h2>
Structural constraints
</h2>
<p>
Structural constraints are constraints on relationships between several
elements of the bytecode. They usually can't be checked without employing
control or data-flow analysis techniques.
</p>
<table>
<tr>
<th>
Identifier
</th>
<th>
Description
</th>
<th>
Spec equivalent
</th>
<th>
Failure mode
</th>
</tr>
<tr>
<td>
B1
</td>
<td>
The number and types of arguments (operands and local variables) must
always match the instruction.
</td>
<td>
4.8.2.1
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B2
</td>
<td>
The operand stack must have the same depth for all executions paths
leading to an instruction.
</td>
<td>
4.8.2.2
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B3
</td>
<td>
Local variable pairs must never be broken up.
</td>
<td>
4.8.2.3
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B4
</td>
<td>
A local variable (or pair) has to be assigned first before it can be
read.
</td>
<td>
4.8.2.4
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B5
</td>
<td>
The operand stack must never grow beyond <code>max_stack</code>.
</td>
<td>
4.8.2.5
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B6
</td>
<td>
The operand stack must never underflow.
</td>
<td>
4.8.2.6
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B7
</td>
<td>
An <code>invokespecial</code> instruction must only invoke an instance
initializer or a method in the current class or one of its
superclasses.
</td>
<td>
4.8.2.7
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B8
</td>
<td>
An instance initializer must only be invoked on an uninitialized
instance residing on the operand stack.
</td>
<td>
4.8.2.8
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B9
</td>
<td>
Instance methods may only be invoked on and instance fields may only
be accessed on already initialized instances.
</td>
<td>
4.8.2.9
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B10
</td>
<td>
The must be no backwards branches with uninitialized instances on the
operand stack or in local variables. There must be no code protected
by an exception handler that contains local variables with
uninitialized instances.
</td>
<td>
4.8.2.10
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B11
</td>
<td>
An instance initializer must call another instance initializer (same
class or superclass) before any instance members can be accessed.
Exceptions are non-inherited instance fields, which can be assigned
before calling another initializer, and the <code>Object</code> class
in general.
</td>
<td>
4.8.2.11
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B12
</td>
<td>
All actual method arguments must be assignment-compatible with formal
arguments.
</td>
<td>
4.8.2.12
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B13
</td>
<td>
For each instance method invocation, the actual instance must be
assignment-compatible with the class or interface specified in the
instruction.
</td>
<td>
4.8.2.13
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B14
</td>
<td>
A returns instruction must match its method's return type.
</td>
<td>
4.8.2.14
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B15
</td>
<td>
When accessing protected members of a superclass, the actual type of
the instance being accessed must be either the current class or one
of its subclasses.
</td>
<td>
4.8.2.15
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B16
</td>
<td>
The type of a value stored into a static field must be
assignment-compatible with or convertible to the field's type.
</td>
<td>
4.8.2.16
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B17
</td>
<td>
The type of a value stored into a field must be assignment-compatible
with or convertible to the field's type.
</td>
<td>
4.8.2.17
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B18
</td>
<td>
The type of every value stored into an array must be
assignment-compatible with the array's component type.
</td>
<td>
4.8.2.18
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B19
</td>
<td>
The operand of an <code>athrow</code> instruction must be
assignment-compatible with <code>java.lang.Throwable</code>.
</td>
<td>
4.8.2.19
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B20
</td>
<td>
The last reachable instruction of a method must either be a backwards
jump or branch, a return, or an <code>athrow</code> instruction. It
must not be possible to leave the <code>code</code> array at the
bottom.
</td>
<td>
4.8.2.20
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B21
</td>
<td>
Local variable values must not be used as return addresses.
</td>
<td>
4.8.2.21
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B22
</td>
<td>
There must be a single, uniquely determined return instruction per
subroutine call.
</td>
<td>
4.8.2.22
</td>
<td>
VM
</td>
</tr>
<tr>
<td>
B23
</td>
<td>
Subroutine calls must not be directly or indirectly self-recursive.
</td>
<td>
4.8.2.23
</td>
<td>
DX
</td>
</tr>
<tr>
<td>
B24
</td>
<td>
<code>ReturnAddress</code> instances must not be reused. If a
subroutine returns to a <code>ReturnAddress</code> further up the
stack than where its original call instruction is located, then all
<code>ReturnAddress</code> instances further down the stack must
never be used.
</td>
<td>
4.8.2.24
</td>
<td>
DX
</td>
</tr>
</table>
</body>
</html>