Field names
public class Example { public String text = "some text"; public static void main (String[] args) { System.out.println("Goodbye, cruel world!"); } }

You could give a field an absurdly long name.

$ for i in `seq 1 65535`; do echo -n "a" >> "65k.txt"; done $ ./fox --set 0x9 --file=65k.txt --output=Example.class ExampleO.class $ ./fox --get 0x9 --list Example.class 0x0009 UTF-8 (0x1) [0xffff]

All of the decompilers I tried handle this correctly, however. It's annoying, and if you do this with several fields, or one which is used often, it will complicate analysis (and it's worth noting that you can, by repeating usage, significantly increase the output size) but it doesn't have any hugely dramatic effects.

The decompilation size can be further increased by employing the use of non-printable characters, where decompilers will escape them in member names. Fernflower does not escape these characters. Procyon and CFR opt to render these in the \uxxxx notation, a sixfold increase in size over the single byte characters. With a 65k long field name, each reference to the field will increase the decompilation output by over 300 kilobytes. Referencing the field can be a matter of a few bytes.

$ for i in `seq 1 65535`; do echo -ne "\033" >> "65k.txt"; done $ fox --set 0x9 --file=65k.txt --output=Example2.class Example.class $ fox --get 0x9 --list Example2.class 0x0009 UTF-8 (0x01) [0xffff]

Also, JD-GUI doesn't escape anything in member names by default.

$ ./fox --set 0x9 --file=insert --output=Example.class ExampleO.class
insert lolname="hello world"; public void thisIsNotARealFunction() { Not real code lol } public String test
JD-GUI 1.4.0 import java.io.PrintStream; public class Example { public String lolname="hello world"; public void thisIsNotARealFunction() { Not real code lol } public String test = "some text"; public static void main(String[] paramArrayOfString) { System.out.println("Goodbye, cruel world!"); } }