[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Problems on using getDefBoxes() to get methods writing array fields
Hi,
I followed Ondrej's suggestions to
successfully get a list of methods that write the non-array fields, but I
couldn't get the methods that write the array fields (except for the constructor
method). So could you help me in this? Thanks!
Tao
For example, my code is:
Body activeBody =
method.getActiveBody();
Iterator defBoxIt =
activeBody.getDefBoxes().iterator();
while (defBoxIt.hasNext())
{
ValueBox box = (ValueBox)
defBoxIt.next();
Value v =
box.getValue();
System.out.println("Method:
"+method.getName()+" Write All:"+ v.toString());
if (v
instanceof FieldRef) {
FieldRef sfr =
(FieldRef)v;
SootField sf =
sfr.getField();
System.out.println("Method:
"+method.getName()+" Write Field:"+
sf.getName());
}
}
Running it on the class in the end of
this message, I got following trace:
Method: <init> Write All:r0
Method:
<init> Write All:r0.<uniqueBoundedStack: int
numberOfElements>
Method: <init> Write
Field:numberOfElements
Method: <init> Write
All:r0.<uniqueBoundedStack: int max>
Method: <init> Write
Field:max
Method: <init> Write All:$i0
Method: <init> Write
All:$r1
Method: <init> Write All:r0.<uniqueBoundedStack: int[]
elems>
Method: <init> Write Field:elems
Method: push Write
All:r0
Method: push Write All:i0
Method: push Write All:z0
Method: push
Write All:i1
Method: push Write All:$r1
Method: push Write
All:$i3
Method: push Write All:z0
Method: push Write All:i1
Method:
push Write All:$i4
Method: push Write All:i2
Method: push Write
All:$r2
Method: push Write All:$r3
Method: push Write All:$i5
Method:
push Write All:$i6
Method: push Write All:$r2[i2]
Method: push Write
All:i2
Method: push Write All:$i7
Method: push Write All:$i8
Method:
push Write All:$r4
Method: push Write All:$i9
Method: push Write
All:$i10
Method: push Write All:$r4[$i10]
Method: push Write
All:$i11
Method: push Write All:$i12
Method: push Write All:$r5
Method:
push Write All:$i13
Method: push Write All:$r5[$i13]
Method: push Write
All:$i14
Method: push Write All:$i15
Method: push Write
All:r0.<uniqueBoundedStack: int numberOfElements>
Method: push Write
Field:numberOfElements
Method: push Write All:$r7
public class
uniqueBoundedStack {
private int[] elems;
private int
numberOfElements;
private int max;
public uniqueBoundedStack()
{
numberOfElements = 0;
max =
2;
elems = new int[max];
}
public void push(int k) {
int
index;
boolean alreadyMember;
alreadyMember = false;
for(index=0; index<numberOfElements;
index++) {
if(k==elems[index])
{
alreadyMember =
true;
break;
}
}
if
(alreadyMember) {
for (int j=index;
j<numberOfElements-1; j++) {
elems[j] =
elems[j+1];
}
elems[numberOfElements-1]
= k;
}
else {
if
(numberOfElements < max) {
elems[numberOfElements]
=
k;
numberOfElements++;
return;
}
else {
System.out.println("Stack full, cannot
push");
return;
}
}
}
......
}
>Spark doesn't keep such a summary, so you'll have to build one yourself.
>It shouldn't be too hard, though. For each method that you're interested
>in:
>1) Get its body with getActiveBody()
>2) Get the List of the body's def boxes with body.getDefBoxes()
>3) Iterate through it. Each element is a ValueBox. Get its value, and
>see if it's a StaticFieldRef.
>4) Do the same for body.getUseBoxes() (UseBoxes give values read;
>DefBoxes give values written)
>
>Ondrej
>
>On Tue, Apr 22, 2003 at 04:30:58PM +0200, Richard Stahl wrote:
>> Hello,
>>
>> I would like to get the following info out of the Spark:
>>
>> for all class fields of a class (classes) get all methods (and/or basic
>> blocks) acccessing (reading and/or writing) the field, i.e.,
>> field-access summaries.
>>
>> In case, there is not simple and straightforward way to do this: Could
>> you, please, give me an advice (opinion) on where to start and what to
>> use (from the SOOT/Spark API) to get this info in an efficient way?
>>
>> Thanks a lot.
>>
>> Best regards,
>>
>> Richard
>