Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
-
Patch Available
-
Moderate
Description
=== Description ===
The patch adds checks of two constraints, fixes
exception data flow issue and made arrangements
for further subroutine inlining implementation.
While adding a number of new checks, the patch
reduces the total legth of the code by 75 lines
and reduces verifier memory usage by removing
structures which are not used. At least
removing dead data just improves readability.
=== Testing ===
Before the patch the test WideGoto.class hangs
on verification stage.
After the patch a verifier correctly reports:
Uncaught exception in main:
java.lang.VerifyError: (class: WideGoto,
method: main([Ljava/lang/String;)V) wide should
be followed by iload, fload, aload, lload,
dload, istore, fstore, astore, lstore, dstore,
ret or iinc
The patch passes acceptance tests.
Both patches and non-patched versions fail on
the same thread manager assertion when trying
to run eclipse.
=== Changes ===
Below goes a detailed list of changes:
- Added verification of wide instructions.
Added verification of the total bytecode
length.
- Added a new file for subroutine
implementation, added a reference to the file
to MSVC project. Added design of subroutine
inlining algorithm.
- Added type flags for graph nodes and an
appropriate constructor to create nodes of
different types. Added an assertion to get
instruction range only for
VF_TYPE_NODE_CODE_RANGE nodes.
- Simplified checks of a node type removing
access to a last code instruction of a
node. Removed artificial instructions for
handler nodes and start/end nodes.
- Removed service functions to work with
artificial instructions. Moved instruction
stack maps to the corresponding node maps.
Removed second parsing of method signature when
creating method IN and OUT maps.
- Two times decreased a size of bytecode
annotation structures and completely removed
offset structures for such structures. Added
annotations to vf_Context.
- Removed a dynamic vector of exception
handlers for each instruction.
- Removed debug flag macros which are no
longer used in the current version.
- Simplified edge pre-counting algorithm by
noticing that each basic block except the last
produces at least one OUT edge, so we just need
to make action about those blocks which branch
execution. Used local counters in loops instead
of one global counter to foster compiler
optimizations.
- Made vf_Graph class getters inline putting
their definitions in the header file. Added
GetEdgeCount getter. Removed unused SetNode
method (should be added CopyNode instead for
subroutine inlining).
- Added a new reporter macro to add class
and method names to any report.
- Adopted debug facilities to work with new
data structures.
- When parsing a class file or getting
exception information used local unsigned short
type instead of reused and casted int.
=== Formatting ===
I changed formatting of the code I touched.
- Fixed English and removed excessive "This
function ..." in documentation. Added
Doxygen style documentation using @param and
@return tags for new functions.
- Renamed "deep" -> "depth" and "begin" ->
"start" in variable and function names using
input from a focus group from my cubicle.
- Started using class library C style for
brackets and spaces in function names.
Consistently followed C style for local
variable names and functions (low caps with
underscore). Left Windows/JNI style (camel
style with the first letter in method name
uppercased) for C++ constructs.
- To my ear getting a number of nodes
doesn't imply that we are getting all nodes. So
I renamed GetNodeNumber to GetNodeCount.
- Reduced repeated long indirect pointer
chains context->a->b[i]->c caching in a local
variable.
- Reformat long lines to fit 72 symbols.