<!
DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<
html>
<
head>
<
title>Dalvik bytecode constraints</
title>
<
link rel=stylesheet href=
"dalvik-constraints.css">
</
head>
<
body>
<
h1>Dalvik bytecode constraints</
h1>
<!--
<h1>General integrity constraints</h1>
<table>
<tr>
<th>
Identifier
</th>
<th>
Description
</th>
</tr>
<tr>
<td>
A1
</td>
<td>
The magic number of the DEX file must be "dex\n035\0".
</td>
</tr>
<tr>
<td>
A1
</td>
<td>
The checksum must be an Adler-32 checksum of the whole file contents
except magic and checksum field.
</td>
</tr>
The signature must be a SHA-1 hash of the whole file contents except magic,
checksum, and signature.
The file_size must match the actual file size in bytes.
The header_size must have the value 0x70.
The endian_tag must have either the value ENDIAN_CONSTANT or
REVERSE_ENDIAN_CONSTANT.
For each of the link, string_ids, type_ids, proto_ids, field_ids, method_ids, class_defs
and data sections, the offset and size fields must be either both zero or both
non-zero. In the latter case, the offset must be four-byte-aligned.
All offset fields in the header except map_off must be four-byte-aligned.
The map_off field must be either zero or point into the data section. In the
latter case, the data section must exist.
None of the link, string_ids, type_ids, proto_ids, field_ids, method_ids, class_defs
and data sections must overlap each other or the header.
If a map exists, then each map entry must have a valid type. Each type may
appear at most once.
If a map exists, then each map entry must have a nonzero offset and size. The
offset must point into the corresponding section of the file (i.e. a
string_id_item must point into the string_ids section) and the explicit or
implicit size of the item must match the actual contents and size of the
section.
If a map exists, then the offset of map entry n+1 must be greater or equal to
the offset of map entry n plus then size of map entry n. This implies
non-overlapping entries and low-to-high ordering.
The following types of entries must have an offset that is
four-byte-aligned: string_id_item, type_id_item, proto_id_item, field_id_item,
method_id_item, class_def_item, type_list, code_item,
annotations_directory_item.
For each string_id_item, the string_data_off field must contain a valid
reference into the data section. For the referenced string_data_item, the data
field must contain a valid MUTF-8 string, and the utf16_size must match the
decoded length of the string.
For each type_id_item, the desciptor_idx field must contain a valid reference
into the string_ids list. The referenced string must be a valid type descriptor.
For each proto_id_item, the shorty_idx field must contain a valid reference
into the string_ids list. The referenced string must be a valid shorty descriptor.
Also, the return_type_idx field must be a valid index into the type_ids section,
and the parameters_off field must be either zero or a valid offset pointing
into the data section. If nonzero, the parameter list must not contain any void
entries.
For each field_id_item, both the class_idx and type_idx fields must be a valid
indices into the
type_ids list. The entry referenced by class_idx must be a non-array reference type.
In addition, the name_idx field must be a valid reference into the string_ids
section, and the contents of the referenced entry must conform to the MemberName
specification.
For each method_id_item, the class_idx field must be a valid index into the
type_ids section, and the
referenced entry must be a non-array reference type. The proto_id field must
be a valid reference into the proto_ids list. The name_idx field must be a
valid reference into the string_ids
section, and the contents of the referenced entry must conform to the MemberName
specification.
For each class_def_item, ...
For each field_id_item, the class_idx field must be a valid index into the
type_ids list. The referenced entry must be a non-array reference type.
...
-->
<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>
</
tr>
<
tr>
<
td>
A1
</
td>
<
td>
The <
code>insns</
code> array must not be empty.
</
td>
<
td>
4.
8.
1.
1
</
td>
</
tr>
<
tr>
<
td>
A2
</
td>
<
td>
The first opcode in the <
code>insns</
code> array must have index zero.
</
td>
<
td>
4.
8.
1.
3
</
td>
</
tr>
<
tr>
<
td>
A3
</
td>
<
td>
The <
code>insns</
code> array must only contain valid Dalvik opcodes.
</
td>
<
td>
4.
8.
1.
4
</
td>
</
tr>
<
tr>
<
td>
A4
</
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 possible operands.
</
td>
<
td>
4.
8.
1.
5
</
td>
</
tr>
<
tr>
<
td>
A5
</
td>
<
td>
The last instruction in the <
code>insns</
code> array must end at index
<
code>insns_size-
1</
code>.
</
td>
<
td>
4.
8.
1.
6
</
td>
</
tr>
<
tr>
<
td>
A6
</
td>
<
td>
All <
code>goto</
code> and <
code>if-<kind></
code> targets must
be opcodes within in the same method.
</
td>
<
td>
4.
8.
1.
7
</
td>
</
tr>
<
tr>
<
td>
A7
</
td>
<
td>
All targets of a <
code>packed-switch</
code> instruction must be
opcodes within in the same method. The size and the list of targets
must be consistent.
</
td>
<
td>
4.
8.
1.
8
</
td>
</
tr>
<
tr>
<
td>
A8
</
td>
<
td>
All targets of a <
code>sparse-switch</
code> instruction must be
opcodes within in the same method. The corresponding
table must be
consistent and sorted low-to-high.
</
td>
<
td>
4.
8.
1.
9
</
td>
</
tr>
<
tr>
<
td>
A9
</
td>
<
td>
The <
code>B</
code> operand of the <
code>const-string</
code> and
<
code>const-string/jumbo</
code> instructions must be a valid index
into the string constant pool.
</
td>
<
td>
4.
8.
1.
10
</
td>
</
tr>
<
tr>
<
td>
A10
</
td>
<
td>
The <
code>C</
code> operand of the <
code>iget<kind></
code> and
<
code>iput<kind></
code> instructions must be a valid index into
the field constant pool. The referenced entry must represent an
instance field.
</
td>
<
td>
4.
8.
1.
12
</
td>
</
tr>
<
tr>
<
td>
A11
</
td>
<
td>
The <
code>C</
code> operand of the <
code>sget<kind></
code> and
<
code>sput<kind></
code> instructions must be a valid index into
the field constant pool. The referenced entry must represent a static
field.
</
td>
<
td>
4.
8.
1.
12
</
td>
</
tr>
<
tr>
<
td>
A12
</
td>
<
td>
The <
code>C</
code> operand of the <
code>invoke-virtual</
code>,
<
code>invoke-super</
code>, <
code<invoke-direct</
code> and
<
code>invoke-static</
code> instructions must be a valid index into the
method constant pool. In all cases, the referenced
<
code>method_id</
code> must belong to a class (not an interface).
</
td>
<
td>
4.
8.
1.
13
</
td>
</
tr>
<
tr>
<
td>
A13
</
td>
<
td>
The <
code>B</
code> operand of the <
code>invoke-virtual/range</
code>,
<
code>invoke-super/range</
code>, <
code>invoke-direct/range</
code>, and
<
code>invoke-static/range</
code> instructions must be a valid index
into the method constant pool. In all cases, the referenced
<
code>method_id</
code> must belong to a class (not an interface).
</
td>
<
td>
4.
8.
1.
13
</
td>
</
tr>
<
tr>
<
td>
A14
</
td>
<
td>
A method the name of which starts with a
'<' must only be invoked
implicitly by the VM, not by
code originating from a Dex file. The
only exception is the instance initializer, which may be invoked by
<
code>invoke-direct</
code>.
</
td>
<
td>
4.
8.
1.
14
</
td>
</
tr>
<
tr>
<
td>
A15
</
td>
<
td>
The <
code>C</
code> operand of the <
code>invoke-interface</
code>
instruction must be a valid index into the method constant pool. The
referenced <
code>method_id</
code> must belong to an interface (not a
class).
</
td>
<
td>
4.
8.
1.
15
</
td>
</
tr>
<
tr>
<
td>
A16
</
td>
<
td>
The <
code>B</
code> operand of the <
code>invoke-interface/range</
code>
instruction must be a valid index into the method constant pool.
The referenced <
code>method_id</
code> must belong to an interface (not
a class).
</
td>
<
td>
4.
8.
1.
15
</
td>
</
tr>
<
tr>
<
td>
A17
</
td>
<
td>
The <
code>B</
code> operand of the <
code>const-class</
code>,
<
code>check-cast</
code>, <
code>new-instance</
code>, and
<
code>filled-new-array/range</
code> instructions must be a valid index
into the type constant pool.
</
td>
<
td>
4.
8.
1.
16
</
td>
</
tr>
<
tr>
<
td>
A18
</
td>
<
td>
The <
code>C</
code> operand of the <
code>instance-of</
code>,
<
code>new-array</
code>, and <
code>filled-new-array</
code>
instructions must be a valid index into the type constant pool.
</
td>
<
td>
4.
8.
1.
16
</
td>
</
tr>
<
tr>
<
td>
A19
</
td>
<
td>
The dimensions of an array created by a <
code>new-array</
code>
instruction must be less than <
code>
256</
code>.
</
td>
<
td>
4.
8.
1.
17
</
td>
</
tr>
<
tr>
<
td>
A20
</
td>
<
td>
The <
code>new</
code> instruction must not refer to array classes,
interfaces, or abstract classes.
</
td>
<
td>
4.
8.
1.
18
</
td>
</
tr>
<
tr>
<
td>
A21
</
td>
<
td>
The type referred to by a <
code>new-array</
code> instruction must be
a valid, non-reference type.
</
td>
<
td>
4.
8.
1.
20
</
td>
</
tr>
<
tr>
<
td>
A22
</
td>
<
td>
All registers referred to by an instruction in a single-width
(non-pair) fashion must be valid for the current method. That is,
their indices must be non-negative and smaller than
<
code>registers_size</
code>.
</
td>
<
td>
4.
8.
1.
21
</
td>
</
tr>
<
tr>
<
td>
A23
</
td>
<
td>
All registers referred to by an instruction in a double-width (pair)
fashion must be valid for the current method. That is, their indices
must be non-negative and smaller than <
code>registers_size-
1</
code>.
</
td>
<
td>
4.
8.
1.
23
</
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>
</
tr>
<
tr>
<
td>
B1
</
td>
<
td>
The number and types of arguments (registers and immediate values)
must always match the instruction.
</
td>
<
td>
4.
8.
2.
1
</
td>
</
tr>
<
tr>
<
td>
B2
</
td>
<
td>
Register pairs must never be broken up.
</
td>
<
td>
4.
8.
2.
3
</
td>
</
tr>
<
tr>
<
td>
B3
</
td>
<
td>
A register (or pair) has to be assigned first before it can be
read.
</
td>
<
td>
4.
8.
2.
4
</
td>
</
tr>
<
tr>
<
td>
B4
</
td>
<
td>
An <
code>invoke-direct</
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>
</
tr>
<
tr>
<
td>
B5
</
td>
<
td>
An instance initializer must only be invoked on an uninitialized
instance.
</
td>
<
td>
4.
8.
2.
8
</
td>
</
tr>
<
tr>
<
td>
B6
</
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>
</
tr>
<
tr>
<
td>
B7
</
td>
<
td>
A register which holds the result of a <
code>new-instance</
code>
instruction must not be used if the same
<
code>new-instance</
code> instruction is again executed before
the instance is initialized.
</
td>
<
td>
4.
8.
2.
10
</
td>
</
tr>
<
tr>
<
td>
B8
</
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>
</
tr>
<
tr>
<
td>
B9
</
td>
<
td>
All actual method arguments must be assignment-compatible with their
respective formal arguments.
</
td>
<
td>
4.
8.
2.
12
</
td>
</
tr>
<
tr>
<
td>
B10
</
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>
</
tr>
<
tr>
<
td>
B11
</
td>
<
td>
A <
code>return<kind></
code> instruction must match its
method
's return type.
</
td>
<
td>
4.
8.
2.
14
</
td>
</
tr>
<
tr>
<
td>
B12
</
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>
</
tr>
<
tr>
<
td>
B13
</
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>
</
tr>
<
tr>
<
td>
B14
</
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>
</
tr>
<
tr>
<
td>
B15
</
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>
</
tr>
<
tr>
<
td>
B16
</
td>
<
td>
The <
code>A</
code> operand of a <
code>throw</
code> instruction must
be assignment-compatible with <
code>java.lang.Throwable</
code>.
</
td>
<
td>
4.
8.
2.
19
</
td>
</
tr>
<
tr>
<
td>
B17
</
td>
<
td>
The last reachable instruction of a method must either be a backwards
<
code>goto</
code> or branch, a <
code>return</
code>, or a
<
code>throw</
code> instruction. It must not be possible to leave the
<
code>insns</
code> array at the bottom.
</
td>
<
td>
4.
8.
2.
20
</
td>
</
tr>
<
tr>
<
td>
B18
</
td>
<
td>
The unassigned half of a former register pair may not be read (is
considered invalid) until it has been re-assigned by some other
instruction.
</
td>
<
td>
4.
8.
2.
3,
4.
8.
2.
4
</
td>
</
tr>
<
tr>
<
td>
B19
</
td>
<
td>
A <
code>move-result<kind></
code> instruction must be immediately
preceded (in the <
code>insns</
code> array) by an
<
code>invoke-<kind></
code> instruction. The only exception is
the <
code>move-result-
object</
code> instruction, which may also be
preceded by a <
code>filled-new-array</
code> instruction.
</
td>
<
td>
-
</
td>
</
tr>
<
tr>
<
td>
B20
</
td>
<
td>
A <
code>move-result<kind></
code> instruction must be immediately
preceded (in actual control flow) by a matching
<
code>return-<kind></
code> instruction (it must not be jumped
to). The only exception is the <
code>move-result-
object</
code>
instruction, which may also be preceded by a
<
code>filled-new-array</
code> instruction.
</
td>
<
td>
-
</
td>
</
tr>
<
tr>
<
td>
B21
</
td>
<
td>
A <
code>move-exception</
code> instruction must only appear as the
first instruction in an exception handler.
</
td>
<
td>
-
</
td>
</
tr>
<
tr>
<
td>
B22
</
td>
<
td>
The <
code>packed-switch-data</
code>, <
code>sparse-switch-data</
code>,
and <
code>fill-array-data</
code> pseudo-instructions must not be
reachable by control flow.
</
td>
<
td>
-
</
td>
</
tr>
</
table>
</
body>
</
html>