I believe I have seen this too, when I've seen (and my experience is
very limited) a local variable with a length of 0 then it meant the
method you are looking at ends in a local variable declaration, eg:
Public void somemethod() {
...
Object o = new Object();
}
The local variable o has a length of 0 instructions, at least that's
what I understand.
Mac
-----Original Message-----
From: Arrin Daley [mailto:[EMAIL PROTECTED]
Sent: 14 August 2007 03:56
To: BCEL Users List
Subject: Re: getLocalVariable returns null but appears to exist
Hi Eric
LocalVariableTables like LineNumberTables are an optional attribute to
JavaClass, they don't have to exist and if they do exist they don't have
to be correct. It depends what you are doing if you are generating the
code that you the snippet is working on then that's OK you can trust the
LocalVaraibleTable (provided you built it correctly) but if the code
comes from elsewhere then I suggest that the LocalVariableTable could
contain anything or not exist at all.
As for why it is returning null, I had a look at the BCEL source
(available online):
143 public final LocalVariable getLocalVariable( int index, int pc )
{
144 for (int i = 0; i < local_variable_table_length; i++) {
145 if (local_variable_table[i].getIndex() == index) {
146 int start_pc = local_variable_table[i].getStartPC();
147 int end_pc = start_pc +
local_variable_table[i].getLength();
148 if ((pc >= start_pc) && (pc < end_pc)) {
149 return local_variable_table[i];
150 }
151 }
152 }
153 return null;
154 }
line 148 has the test (pc >= start_pc) && (pc < end_pc) with a length of
zero the pc cannot be less than the end_pc so therefore it doesn't find
the localvariable and returns null.
A way to get around it might be to request the LocalVariableTable as a
LocalVariable[] and then search the LocalVariable array yourself.
Hope it helps
Bye Arrin
Eric Sheridan wrote:
>Group,
>
>I am calling the following code snippet:
>
>StoreInstruction si = (StoreInstruction)instruction;
>int index = si.getIndex();
>int pc = ihs[i].getPosition() + 2;
>LocalVariable lv = lvt.getLocalVariable(index, pc);
>
>if(lv == null)
>{
> System.out.println("[ERROR] unable to locate assigned variable
name. ");
> System.out.println("[*] pc " + pc + " index " + index);
> System.out.println(lvt.toString());
> return;
>}
>
>The result of "getLocalVariable" is null for a particular local
variable and I cant figure out why. Below is a result of the
'System.out.println()'s' found in the previous code segment:
>
>[ERROR] unable to locate assigned variable name.
>[*] pc 472 index 6
>LocalVariable(start_pc = 346, length = 76, index = 11:int i)
>LocalVariable(start_pc = 266, length = 201, index = 6:String[] fields)
>LocalVariable(start_pc = 277, length = 190, index = 7:int id)
>LocalVariable(start_pc = 311, length = 156, index =
8:org.apache.ecs.html.Table t)
>LocalVariable(start_pc = 334, length = 133, index =
9:org.apache.ecs.html.TR header)
>LocalVariable(start_pc = 343, length = 124, index =
10:org.apache.ecs.html.TR results)
>LocalVariable(start_pc = 472, length = 0, index = 6:Exception e)
>LocalVariable(start_pc = 485, length = 103, index =
6:org.apache.ecs.html.A a)
>LocalVariable(start_pc = 593, length = 34, index = 6:Exception e)
>LocalVariable(start_pc = 0, length = 629, index =
0:org.owasp.webgoat.lessons.WSDLScanning this)
>LocalVariable(start_pc = 0, length = 629, index =
1:org.owasp.webgoat.session.WebSession s)
>LocalVariable(start_pc = 8, length = 621, index =
2:org.apache.ecs.ElementContainer ec)
>LocalVariable(start_pc = 24, length = 605, index =
3:org.apache.ecs.html.Table t1)
>LocalVariable(start_pc = 46, length = 583, index =
4:org.apache.ecs.html.TR tr)
>LocalVariable(start_pc = 218, length = 411, index =
5:org.apache.ecs.Element b)
>
>The variable appears to exist (the line - LocalVariable(start_pc = 472,
length = 0, index = 6:Exception e) ) but
>getLocalVariable returns null. Any ideas why? Does "length = 0" have
any significance?
>
>As usual, thanks in advance for everyones input!
>
>-Eric
>
>
>
--
Conventional wisdom says to know your limits. To know your limits you
need to find them first. Finding you limits generally involves getting
in over your head and hoping you live long enough to benefit from the
experience. That's the fun part.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]