Stand-alone Bytecode Verificador
-
22-09-2019 - |
Pregunta
En mi proyecto de código de bytes de instrumentación, que tropieza con frecuencia en VerifyErrors. Sin embargo, el valor por defecto de Java Verificador da poca información sobre qué instrucción dio como resultado el error (que sólo da el método y un mensaje pequeño). ¿Hay alguna verificador de código de bytes independiente que proporciona ayuda con un poco más avanzado en la localización del error, al menos, la ubicación precisa de instrucciones? Gracias.
Otros consejos
ASM CheckClassAdaptor.verify () da una gran respuesta: http://asm.ow2.org/
También estaba buscando algo que pudiera reportar potencial verificar errores, pero especialmente IncompatibleClassChangeError
s. Escribí un pequeño proyecto de prueba con una clase activos y de otra clase cliente que llama métodos de la API, además de una clase principal para ejecutar un verificador; luego cambió la API, recompilarla pero no el cliente, y se comprueba para ver lo que podría ser capturado. -target 7
usada aunque no hay JDK 7 características especiales por ahora.
En primer lugar y lo más obvio, Class.forName
puede encontrar ciertos errores en la firma de la clase de cliente, pero no parece para comprobar cuerpos de los métodos para las llamadas a métodos de la API no existentes y similares, incluso si se llama getDeclaredMethods
; los errores son reportados por la máquina virtual sólo cuando la línea problemática de código se ejecuta realmente.
Justicia en BCEL 5.2 parece ser más fácil;
org.apache.bcel.verifier.Verifier.main(new String[] {clazz});
hace el trabajo:
Pass 3a, method number 1 ['public void m()']:
VERIFIED_REJECTED
Instruction invokestatic[184](3) 4 constraint violated:
Referenced method 'x' with expected signature '()V' not found in class 'API'.
....
He intentado ASM 4.0, pero
org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz});
no funciona; tal vez se comprueba el formato de métodos, pero no vinculación. Inlining main
y pasando checkDataFlow=true
no ayuda.
Búsqueda, también encontré https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm /verifier/CommandLineVerifier.java pero no pude encontrar ninguna manera de hacer este trabajo; la prueba de la unidad que acompaña lanza una ClassNotFoundException
cuando se ejecuta.