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.

¿Fue útil?

Solución

Al igual que con cualquier proyecto que implique JVM bytecode, primero habría que ver si el BCEL tiene cualquier cosa que pueda ser útil para usted. También, quizás FindBugs puede ayudar - aunque no estoy seguro de si se asume código de bytes verificable para empezar o no .

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 IncompatibleClassChangeErrors. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top