[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