instructions should not attempt to put items on top of the stack when the stack is
full (as calculated and declared for each method by the compiler).
➢ Register initialization: Within a single method any use of a register must come
after the initialization of that register (within the method). That is, there should be
at least one store operation to that register before a load operation on that register.
➢ Object initialization: Creation of object instances must always be followed by a
call to one of the possible initialization methods for that object (these are the
constructors) before it can be used.
➢ Access control: Method calls, field accesses, and class references must always
adhere to the Java visibility policies for that method, field, or reference. These
policies are encoded in the modifiers (private, protected, public, etc.).
Figure 8.1. Usage of opaque predicates to prevent decompilation.
Based on the high-level of bytecode integrity expected by the JVM, introducing