[Soot-list] get value of final fields

Tony Yan yan at cse.ohio-state.edu
Fri Feb 1 00:21:45 EST 2013


Thanks for the pointer!

I played with it a bit, and found that it can be read from the
`IntegerConstantValueTag' tag of the field.

On Thu, Jan 31, 2013 at 11:41 PM, Patrick Lam <plam at sable.mcgill.ca> wrote:
> 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