Update: They changed it in Java 5. ClassGen.setMajor(49) +
ClassGen.setMinor(0) works.

On Fri, 4 Feb 2022 at 15:26, Stefan Reich <
stefan.reich.maker.of....@googlemail.com> wrote:

> Mystery solved, ladies and gentlemen...
>
> It was...
>
> the byte code version. BCEL outputs version 45.3 by default (JDK 1.1).
> There were multiple changes to the class file format spec since then.
>
> Specifically, they must have allowed ldc to load .class objects directly
> at some point after JDK 1.1. In fact, I distinctly remember the
> Class.forName shenanigans that javac produced back then instead of the
> direct ldc.
>
> Apparently the Java verifier is so strict it judges the class file
> according to its version number and disallows the new version of ldc in a
> class file written for JDK 1.1.
>
> BCEL doesn't check for this though and outputs a broken class file.
> Changing this might be a good idea.
>
> Unfortunately I couldn't find documentation on when the byte code spec
> change happened. Does anyone know?
>
> Neither did I find anything in the HotSpot verifier sources
> <https://github.com/openjdk/jdk/blob/master/src/hotspot/share/classfile/verifier.cpp>
> which is odd to me. No mention of a JDK version there. Only in
> clasfileparser.cpp
> <https://github.com/openjdk/jdk/blob/master/src/hotspot/share/classfile/classFileParser.cpp>
> but didn't find the issue in question there either. I'm by no means an
> expert in the JDK C++ source though.
>
> Cheers
> Stefan
>
> On Thu, 3 Feb 2022 at 08:32, Romain Manni-Bucau <rmannibu...@gmail.com>
> wrote:
>
>> Hi,
>>
>> Maybe a bit ot of topic but did you check with asm (using classreader for
>> ex) if it is readable for it? Javap in verbose mode is hard to read
>> humanly
>> (and not verbosel does not mean much) so an issue can still be hidden.
>>
>> Romain Manni-Bucau
>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>> <https://rmannibucau.metawerx.net/> | Old Blog
>> <http://rmannibucau.wordpress.com> | Github <
>> https://github.com/rmannibucau> |
>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
>> <
>> https://www.packtpub.com/application-development/java-ee-8-high-performance
>> >
>>
>>
>> Le jeu. 3 févr. 2022 à 01:42, Stefan Reich
>> <stefan.reich.maker.of....@googlemail.com.invalid> a écrit :
>>
>> > I'm mainly curious how it's possible that everything looks completely
>> > normal in javap (checked a dozen times), but the class verifier
>> complains
>> > anyway? Something has to be different. Is there a way to dig deeper
>> into a
>> > class file?
>> >
>> > Greetings
>> >
>> > On Wed, 2 Feb 2022 at 23:14, Stefan Reich <
>> > stefan.reich.maker.of....@googlemail.com> wrote:
>> >
>> > > Hmm, no change with latest version.
>> > >
>> > > I did "git clone https://github.com/apache/commons-bcel.git"; and "mvn
>> > > package".
>> > >
>> > > stefan@lenovo-ThinkPad-X220:~/dev/classreftest$ javac -cp
>> > > bcel-6.6.0-SNAPSHOT.jar MakeBadClassFile.java
>> > > stefan@lenovo-ThinkPad-X220:~/dev/classreftest$ java -cp
>> > > bcel-6.6.0-SNAPSHOT.jar:. MakeBadClassFile
>> > > Now please try: java BadClassFile
>> > > stefan@lenovo-ThinkPad-X220:~/dev/classreftest$ java BadClassFile
>> > > Error: Unable to initialize main class BadClassFile
>> > > Caused by: java.lang.VerifyError: (class: BadClassFile, method: main
>> > > signature: ([Ljava/lang/String;)V) Illegal type in constant pool
>> > > stefan@lenovo-ThinkPad-X220:~/dev/classreftest$
>> > >
>> > > On Wed, 2 Feb 2022 at 22:59, Gary Gregory <garydgreg...@gmail.com>
>> > wrote:
>> > >
>> > >> You should try the latest from git master.
>> > >>
>> > >> Gary
>> > >>
>> > >> On Wed, Feb 2, 2022, 15:41 Stefan Reich
>> > >> <stefan.reich.maker.of....@googlemail.com.invalid> wrote:
>> > >>
>> > >> > Hi again,
>> > >> >
>> > >> > actual problem this time...
>> > >> >
>> > >> > I think I am doing everything right... Decompilation in javap -v
>> looks
>> > >> > just like it should. But I get a VerifyError... I'm using JDK 17.
>> Full
>> > >> > program attached. Please advice, thank you :)
>> > >> >
>> > >> > # javac -cp bcel-6.5.0.jar MakeBadClassFile.java
>> > >> > # java -cp bcel-6.5.0.jar:. MakeBadClassFile
>> > >> > # java BadClassFile
>> > >> > Error: Unable to initialize main class BadClassFile
>> > >> > Caused by: java.lang.VerifyError: (class: BadClassFile, method:
>> main
>> > >> > signature: ([Ljava/lang/String;)V) Illegal type in constant pool
>> > >> >
>> > >> >
>> > >> >
>> ---------------------------------------------------------------------
>> > >> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>> > >> > For additional commands, e-mail: dev-h...@commons.apache.org
>> > >>
>> > >
>> > >
>> >
>
>

Reply via email to