Ich arbeite an Code, der Einträge in der StackFrameMap (SFM) berechnet. Das Ziel besteht darin, Einträge (SFM) generieren zu können, die den Java 7-Bytecode-Prüfer glücklich machen. Nach einer TDD-Methode habe ich zunächst gefälschte SMF-Einträge erstellt, über die sich der Verifizierer beschweren konnte. Ich würde diese durch meine korrekt berechneten Einträge ersetzen, um zu sehen, dass ich es richtig gemacht habe.
Das Problem ist: Ich kann den Bytecode-Prüfer nicht dazu bringen, sich zu beschweren. Hier ist ein Beispiel, beginnend mit dem ursprünglichen Java-Code (dieser Code soll nichts nützliches tun):
%Vor%Dies erzeugt den folgenden Bytecode (mit SFM):
%Vor%Nun ändere ich den SFM so, dass er folgendes enthält:
%Vor% Wie Sie sehen, ist das völlig falsch, aber es lädt ohne Fehler . Ich habe die JVM-Spezifikation gelesen und konnte keinen Grund sehen, warum das funktioniert. Ich bin nicht mit der Option SplitBytecodeVerifier
.
BEARBEITEN : Eclipse wurde gemäß der folgenden akzeptierten Antwort so eingestellt, dass Java 6-Klassendateien (Version 50.0) ausgegeben werden. Classfiles dieser Version ignorieren Probleme mit der StackFrameMap. Nach dem Ändern der Einstellung für die Verwendung des standardmäßigen Java 7-Klassendateiformats (51.0) funktionierte es wie erwartet.
Ich kann Ihre Ergebnisse nicht reproduzieren. Ich habe versucht, den Stapelrahmen zu ändern, und es konnte nicht wie erwartet geladen werden. Wenn Sie möchten, kann ich meine modifizierte Klassendatei veröffentlichen.
Es ist nicht klar, was passiert ist, aber Sie haben fast sicher irgendwo einen Fehler gemacht. Die wahrscheinlichste Erklärung ist, dass Ihre Klassendatei die Version 50.0 hat. In diesem Fall wird die JVM auf die normale Überprüfung zurückgesetzt, wenn die Stackmap ungültig ist. Sie müssen die Version auf 51.0 festlegen, um die Stackmap-Überprüfung zu erzwingen. Eine andere Möglichkeit besteht darin, dass Sie einfach die Bearbeitung der Datei durcheinander gebracht haben und die Änderungen nicht wirklich gespeichert haben oder die Änderungen, die Sie dachten, nicht vorgenommen haben.
Hier ist die Assembly für meine geänderte Klassendatei.
%Vor%Tags und Links java bytecode bytecode-manipulation