[Soot-list] get value of final fields

Patrick Lam plam at sable.mcgill.ca
Thu Jan 31 23:41:43 EST 2013


Ah. It's probably in an attribute of the field, in that case. This 
tutorial shows you how to add attributes; there are similar APIs for 
reading the attributes.

http://www.sable.mcgill.ca/soot/tutorial/tagclass/index.html

On 01/31/13 23:39, Tony Yan wrote:
> 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