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]