public void setLocalTypeTable(LocalVariableTypeTable localTypeTable) { this.localTypeTable = localTypeTable; if (localTypeTable == null) { genericLocalVariables = null; } else { genericLocalVariables = new BitSet(); for(LocalVariable lv : localTypeTable.getLocalVariableTypeTable()) { if (lv.getSignature().indexOf('<') > 0) { genericLocalVariables.set(lv.getIndex()); } } } }
private void printLocal(Writer out, Writer fout, LocalVariable l, int[] v, List<String> defs, List<String> refs) throws IOException { v[l.getIndex()] = 1; v[l.getNameIndex()] = 1; v[l.getSignatureIndex()] = 1; if (!THIS.equals(l.getName())) { out.write(TAB);out.write(TAB); fout.write(TAB);fout.write(TAB); String sig=Utility.signatureToString(l.getSignature()); out.write(sig); fout.write(sig); out.write(SPACE); fout.write(SPACE); String t; out.write(t = l.getName()); defs.add(t); refs.add(t); fout.write(t); out.write(EOL); fout.write(EOL); } }
@CheckForNull GenericObjectType getLocalVariable(int index, int pos) { if (genericLocalVariables == null || !genericLocalVariables.get(index)) { return null; } for (LocalVariable local : localTypeTable.getLocalVariableTypeTable()) { if (local.getIndex() == index && local.getStartPC() <= pos && pos < +local.getStartPC() + local.getLength()) { String signature = local.getSignature(); if (signature.indexOf('<') < 0) { continue; } Type t; try { t = GenericUtilities.getType(signature); if (t instanceof GenericObjectType) { return (GenericObjectType) t; } } catch (RuntimeException e) { AnalysisContext.logError("Bad signature " + signature + " for " + local.getName(), e); } return null; } } return null; }
private void pushByLocalObjectLoad(DismantleBytecode dbc, int register) { Method m = dbc.getMethod(); LocalVariableTable lvt = m.getLocalVariableTable(); if (lvt != null) { LocalVariable lv = LVTHelper.getLocalVariableAtPC(lvt, register, dbc.getPC()); if (lv != null) { String signature = lv.getSignature(); pushByLocalLoad(signature, register); return; } } pushByLocalLoad("Ljava/lang/Object;", register); }
LocalVariable lv = LVTHelper.getLocalVariableAtPC(varTable, register, getPC()); if (lv != null) { String objSignature = lv.getSignature(); if (objSignature.charAt(0) == 'L') { objSignature = objSignature.substring(1, objSignature.length() - 1).replace('/', '.');
signature = lv.getSignature();
if(localVariable != null) { pattern = "CAA_COVARIANT_ARRAY_LOCAL"; arraySignature = localVariable.getSignature();
public void setLocalTypeTable(LocalVariableTypeTable localTypeTable) { this.localTypeTable = localTypeTable; if (localTypeTable == null) { genericLocalVariables = null; } else { genericLocalVariables = new BitSet(); for(LocalVariable lv : localTypeTable.getLocalVariableTypeTable()) { if (lv.getSignature().indexOf('<') > 0) { genericLocalVariables.set(lv.getIndex()); } } } }
final String toStringShared( final boolean typeTable ) { final String name = getName(); final String signature = Utility.signatureToString(getSignature(), false); final String label = "LocalVariable" + (typeTable ? "Types" : "" ); return label + "(start_pc = " + start_pc + ", length = " + length + ", index = " + index + ":" + signature + " " + name + ")"; }
/** * @return string representation. */ public final String toString() { String name = getName(), signature = Utility.signatureToString(getSignature()); return "LocalVariable(start_pc = " + start_pc + ", length = " + length + ", index = " + index + ":" + signature + " " + name + ")"; }
public boolean isRiskyStoreClass(int reg) { LocalVariableTable lvt = getMethod().getLocalVariableTable(); if (lvt != null) { LocalVariable lv = lvt.getLocalVariable(reg, getNextPC()); if ((lv != null) && dangerousStoreClassSigs.contains(lv.getSignature())) { return true; } } return false; }
public boolean isRiskyStoreClass(int reg) { LocalVariableTable lvt = getMethod().getLocalVariableTable(); if (lvt != null) { LocalVariable lv = lvt.getLocalVariable(reg, getNextPC()); if ((lv != null) && dangerousStoreClassSigs.contains(lv.getSignature())) { return true; } } return false; }
private void sawLoad(int seen) { lastLoadWasString = false; LocalVariableTable lvt = getMethod().getLocalVariableTable(); if (lvt != null) { LocalVariable lv = LVTHelper.getLocalVariableAtPC(lvt, RegisterUtils.getALoadReg(this, seen), getPC()); if (lv != null) { lastLoadWasString = Values.SIG_JAVA_LANG_STRING.equals(lv.getSignature()); } } }
private void sawLoad(int seen) { lastLoadWasString = false; LocalVariableTable lvt = getMethod().getLocalVariableTable(); if (lvt != null) { LocalVariable lv = LVTHelper.getLocalVariableAtPC(lvt, RegisterUtils.getALoadReg(this, seen), getPC()); if (lv != null) { lastLoadWasString = Values.SIG_JAVA_LANG_STRING.equals(lv.getSignature()); } } }
private void sawOpcodeAfterBranch(int seen) { if (!ifBlocks.isEmpty()) { IfBlock block = ifBlocks.get(ifBlocks.size() - 1); if (OpcodeUtils.isStore(seen)) { int reg = RegisterUtils.getStoreReg(this, seen); if (!loadedRegs.containsKey(reg)) { LocalVariableTable lvt = getMethod().getLocalVariableTable(); String sig = ""; if (lvt != null) { LocalVariable lv = lvt.getLocalVariable(reg, getPC()); if (lv != null) { sig = lv.getSignature(); } } // ignore boolean flag stores, as this is a // relatively normal occurrence if (!Values.SIG_PRIMITIVE_BOOLEAN.equals(sig) && !Values.SIG_JAVA_LANG_BOOLEAN.equals(sig)) { block.storeRegs.put(Integer.valueOf(RegisterUtils.getStoreReg(this, seen)), Integer.valueOf(getPC())); } } } else if (OpcodeUtils.isReturn(seen)) { copyStoredIntoLoadedforBlock(block); } if (block.end <= getPC()) { state = State.SAW_NOTHING; } } }
@CheckForNull GenericObjectType getLocalVariable(int index, int pos) { if (genericLocalVariables == null || !genericLocalVariables.get(index)) { return null; } for (LocalVariable local : localTypeTable.getLocalVariableTypeTable()) { if (local.getIndex() == index && local.getStartPC() <= pos && pos < +local.getStartPC() + local.getLength()) { String signature = local.getSignature(); if (signature.indexOf('<') < 0) { continue; } Type t; try { t = GenericUtilities.getType(signature); if (t instanceof GenericObjectType) { return (GenericObjectType) t; } } catch (RuntimeException e) { AnalysisContext.logError("Bad signature " + signature + " for " + local.getName(), e); } return null; } } return null; }
private void pushByLocalObjectLoad(DismantleBytecode dbc, int register) { Method m = dbc.getMethod(); LocalVariableTable lvt = m.getLocalVariableTable(); if (lvt != null) { LocalVariable lv = LVTHelper.getLocalVariableAtPC(lvt, register, dbc.getPC()); if (lv != null) { String signature = lv.getSignature(); pushByLocalLoad(signature, register); return; } } pushByLocalLoad("Ljava/lang/Object;", register); }
/** * overrides the visitor to look for local variables where the name has 'Map', 'Set', 'List' in it but the type of that field isn't that. note that this * only is useful if compiled with debug labels. * * @param obj * the currently parsed method */ @Override public void visitMethod(Method obj) { LocalVariableTable lvt = obj.getLocalVariableTable(); if (lvt != null) { LocalVariable[] lvs = lvt.getLocalVariableTable(); for (LocalVariable lv : lvs) { if (checkConfusedName(lv.getName(), lv.getSignature())) { bugReporter.reportBug(new BugInstance(this, BugType.CNC_COLLECTION_NAMING_CONFUSION.name(), NORMAL_PRIORITY).addClass(this) .addString(lv.getName()).addSourceLine(this.clsContext, this, lv.getStartPC())); } } } }
private void updateLocalVariableTable(final LocalVariableTable a) { final LocalVariable[] lv = a.getLocalVariableTable(); removeLocalVariables(); for (final LocalVariable l : lv) { InstructionHandle start = il.findHandle(l.getStartPC()); final InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); // Repair malformed handles if (null == start) { start = il.getStart(); } // end == null => live to end of method // Since we are recreating the LocalVaraible, we must // propagate the orig_index to new copy. addLocalVariable(l.getName(), Type.getType(l.getSignature()), l .getIndex(), start, end, l.getOrigIndex()); } }
/** * overrides the visitor to look for local variables where the name has 'Map', 'Set', 'List' in it but the type of that field isn't that. note that this * only is useful if compiled with debug labels. * * @param obj * the currently parsed method */ @Override public void visitMethod(Method obj) { LocalVariableTable lvt = obj.getLocalVariableTable(); if (lvt != null) { LocalVariable[] lvs = lvt.getLocalVariableTable(); for (LocalVariable lv : lvs) { if (checkConfusedName(lv.getName(), lv.getSignature())) { bugReporter.reportBug(new BugInstance(this, BugType.CNC_COLLECTION_NAMING_CONFUSION.name(), NORMAL_PRIORITY).addClass(this) .addString(lv.getName()).addSourceLine(this.clsContext, this, lv.getStartPC())); } } } }