[Soot-list] get value of final fields

Tony Yan yan at cse.ohio-state.edu
Thu Jan 31 23:39:07 EST 2013


Actually, it is in the classfile. You need to use the "-constants"
option for javap.

$ javap -c -constants A
Compiled from "A.java"
public class A {
  public static final int f = 1;

  public A();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method
java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field
java/lang/System.out:Ljava/io/PrintStream;
       3: iconst_1
       4: invokevirtual #3                  // Method
java/io/PrintStream.println:(I)V
       7: return
}

On Thu, Jan 31, 2013 at 11:31 PM, Patrick Lam <plam at sable.mcgill.ca> wrote:
> On 01/31/13 23:19, Tony Yan wrote:
>> Hi,
>>
>> Is it possible in soot to get the value of a final field?
>>
>> Example:
>>
>> class A {
>>    public static final int f = 1;
>> }
>>
>> Is the fact that `f' is always `1' saved somewhere in soot?
>
> No, because that information doesn't seem to be in the classfile; I'm
> not quite sure why. If you look at java.lang.System, on the other hand,
> you'll find a class initializers which sets java.lang.System.out to
> null. That's where you should find the information you're looking for.
> Note that javac inlines the f field in the bytecode at the end.
>
> pat
>
> plam at plym:/tmp$ cat A.java
> public class A {
>      public static final int f = 1;
>      public static void main(String[] argv) { System.out.println(f); }
> }
>
> plam at plym:/tmp$ java soot.Main -soot-class-path
> .:/usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar -f j A
> Soot started on Fri Feb 01 04:23:06 GMT 2013
> Transforming A...
> Writing to sootOutput/A.jimp
> Soot finished on Fri Feb 01 04:23:07 GMT 2013
> Soot has run for 0 min. 1 sec.
>
> plam at plym:/tmp$ cat sootOutput/A.jimp
> class A extends java.lang.Object
> {
>      public static final int f;
>
>      void <init>()
>      {
>          A r0;
>
>          r0 := @this;
>          specialinvoke r0.<init>();
>          return;
>      }
>
>      public static void main(java.lang.String[])
>      {
>          java.lang.String[] r0;
>          java.io.PrintStream $r1;
>
>          r0 := @parameter0;
>          $r1 = java.lang.System.out;
>          $r1.println(1);
>          return;
>      }
> }
>
> plam at plym:/tmp$ javap A
> Compiled from "A.java"
> class A extends java.lang.Object{
>      public static final int f;
>      A();
> }
>
> plam at plym:/tmp$ javap -c A
> Compiled from "A.java"
> class A extends java.lang.Object{
> public static final int f;
>
> A();
>    Code:
>     0:  aload_0
>     1:  invokespecial   #1; //Method java/lang/Object."<init>":()V
>     4:  return
>
> public static void main(java.lang.String[]);
>    Code:
>     0:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
>     3:  iconst_1
>     4:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
>     7:  return
>
> }
>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list


More information about the Soot-list mailing list