This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-bcel.git
commit 637dc2659d8631751d3d53b507fcc155743a602b Author: Gary Gregory <[email protected]> AuthorDate: Mon Jan 12 17:29:10 2026 -0500 org.apache.bcel.classfile.Deprecated now requires its the attribute_length item be zero. See https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html#jvms-4.7.15 --- src/main/java/org/apache/bcel/Const.java | 6 +- .../java/org/apache/bcel/classfile/Deprecated.java | 68 ++++++++-------------- .../org/apache/bcel/classfile/DeprecatedTest.java | 35 +++++++++++ 3 files changed, 64 insertions(+), 45 deletions(-) diff --git a/src/main/java/org/apache/bcel/Const.java b/src/main/java/org/apache/bcel/Const.java index b0bc84e9..24445b2e 100644 --- a/src/main/java/org/apache/bcel/Const.java +++ b/src/main/java/org/apache/bcel/Const.java @@ -3104,7 +3104,11 @@ public final class Const { /** Attribute constant for Synthetic. */ public static final byte ATTR_SYNTHETIC = 7; - /** Attribute constant for Deprecated. */ + /** + * Attribute constant for Deprecated. + * + * @see <a href="https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html#jvms-4.7.15">JVM Specification: The Deprecated Attribute</a> + */ public static final byte ATTR_DEPRECATED = 8; /** Attribute constant for PMG. */ diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index 901f7cb8..b2e0ef89 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -16,28 +16,27 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.bcel.classfile; import java.io.DataInput; -import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Const; import org.apache.bcel.util.Args; +import org.apache.commons.lang3.ArrayUtils; /** - * This class is derived from <em>Attribute</em> and denotes that this is a deprecated method. It is instantiated from - * the <em>Attribute.readAttribute()</em> method. + * This class is derived from <em>Attribute</em> and denotes that this is a deprecated method. It is instantiated from the <em>Attribute.readAttribute()</em> + * method. * * @see Attribute + * @see <a href="https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html#jvms-4.7.15">JVM Specification: The Deprecated Attribute</a> */ public final class Deprecated extends Attribute { - private byte[] bytes; - /** - * Initialize from another object. Note that both objects use the same references (shallow copy). Use clone() for a - * physical copy. + * Initialize from another object. Note that both objects use the same references (shallow copy). Use clone() for a physical copy. * * @param c Source to copy. */ @@ -48,39 +47,35 @@ public final class Deprecated extends Attribute { /** * Constructs a Deprecated attribute. * - * @param nameIndex Index in constant pool to CONSTANT_Utf8. - * @param length Content length in bytes. - * @param bytes Attribute contents. + * @param nameIndex Index in constant pool to CONSTANT_Utf8. + * @param length JVM Specification: "The value of the attribute_length item must be zero." + * @param bytes Attribute contents. * @param constantPool Array of constants. + * @see <a href="https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html#jvms-4.7.15">JVM Specification: The Deprecated Attribute</a> */ public Deprecated(final int nameIndex, final int length, final byte[] bytes, final ConstantPool constantPool) { super(Const.ATTR_DEPRECATED, nameIndex, Args.require0(length, "Deprecated attribute length"), constantPool); - this.bytes = bytes; } /** * Constructs object from input stream. * - * @param nameIndex Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param input Input stream - * @param constantPool Array of constants + * @param nameIndex Index in constant pool to CONSTANT_Utf8. + * @param length JVM Specification: "The value of the attribute_length item must be zero." + * @param input Input stream. + * @param constantPool Array of constants. * @throws IOException if an I/O error occurs. + * @see <a href="https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html#jvms-4.7.15">JVM Specification: The Deprecated Attribute</a> */ Deprecated(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException { this(nameIndex, length, (byte[]) null, constantPool); - if (length > 0) { - bytes = new byte[length]; - input.readFully(bytes); - println("Deprecated attribute with length > 0"); - } } /** - * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class. - * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects. + * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class. That is, the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. * - * @param v Visitor object + * @param v Visitor object. */ @Override public void accept(final Visitor v) { @@ -88,39 +83,22 @@ public final class Deprecated extends Attribute { } /** - * @return deep copy of this attribute + * @return deep copy of this attribute. */ @Override public Attribute copy(final ConstantPool constantPool) { final Deprecated c = (Deprecated) clone(); - if (bytes != null) { - c.bytes = bytes.clone(); - } c.setConstantPool(constantPool); return c; } - /** - * Dumps source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException if an I/O error occurs. - */ - @Override - public void dump(final DataOutputStream file) throws IOException { - super.dump(file); - if (super.getLength() > 0) { - file.write(bytes, 0, super.getLength()); - } - } - /** * Gets the data bytes. * * @return data bytes. */ public byte[] getBytes() { - return bytes; + return ArrayUtils.EMPTY_BYTE_ARRAY; } /** @@ -129,11 +107,13 @@ public final class Deprecated extends Attribute { * @param bytes the raw bytes that represents this byte array. */ public void setBytes(final byte[] bytes) { - this.bytes = bytes; + if (bytes != null) { + Args.require0(bytes.length, "Deprecated attribute length"); + } } /** - * @return attribute name + * @return attribute name. */ @Override public String toString() { diff --git a/src/test/java/org/apache/bcel/classfile/DeprecatedTest.java b/src/test/java/org/apache/bcel/classfile/DeprecatedTest.java new file mode 100644 index 00000000..a3fb0ba8 --- /dev/null +++ b/src/test/java/org/apache/bcel/classfile/DeprecatedTest.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.bcel.classfile; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.DataInput; + +import org.junit.jupiter.api.Test; + +public class DeprecatedTest { + + @Test + public void testAttributeLength() { + assertThrows(ClassFormatException.class, () -> new Deprecated(1, 0, (byte[]) null, new ConstantPool())); + assertThrows(ClassFormatException.class, () -> new Deprecated(1, 0, (DataInput) null, new ConstantPool())); + } +}
