rename getNumberOfParameters to getNumberOfPositionalParameters since the Python front end now supports keyword parameters

support variable names in IR for synthetic summaries
This commit is contained in:
Julian Dolby 2018-04-12 19:09:25 -04:00
parent 41d254d547
commit 436d3165f7
28 changed files with 89 additions and 41 deletions

View File

@ -55,7 +55,7 @@ public class JSMethodInstructionVisitor extends JSAbstractInstructionVisitor {
if(fndef instanceof AstGlobalRead) { if(fndef instanceof AstGlobalRead) {
AstGlobalRead agr = (AstGlobalRead)fndef; AstGlobalRead agr = (AstGlobalRead)fndef;
if(agr.getGlobalName().equals("global Function")) { if(agr.getGlobalName().equals("global Function")) {
if(invk.getNumberOfParameters() != 2) if(invk.getNumberOfPositionalParameters() != 2)
return false; return false;
// this may be a genuine use of "new Function()", not a declaration/expression // this may be a genuine use of "new Function()", not a declaration/expression
if(!symtab.isStringConstant(invk.getUse(1))) if(!symtab.isStringConstant(invk.getUse(1)))

View File

@ -103,7 +103,7 @@ public class OptimisticCallgraphBuilder extends FieldBasedCallGraphBuilder {
offset = 1; offset = 1;
} }
for(int i=0;i<invk.getNumberOfParameters();++i) { for(int i=0;i<invk.getNumberOfPositionalParameters();++i) {
// only flow receiver into 'this' if invk is, in fact, a method call // only flow receiver into 'this' if invk is, in fact, a method call
flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeArgVertex(callee)); flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeArgVertex(callee));
//if(i != 1 || !invk.getDeclaredTarget().getSelector().equals(AstMethodReference.fnSelector)) //if(i != 1 || !invk.getDeclaredTarget().getSelector().equals(AstMethodReference.fnSelector))
@ -126,7 +126,7 @@ public class OptimisticCallgraphBuilder extends FieldBasedCallGraphBuilder {
System.err.println("callees " + realCallees + " for " + caller); System.err.println("callees " + realCallees + " for " + caller);
for(FuncVertex realCallee: realCallees) { for(FuncVertex realCallee: realCallees) {
// flow from arguments to parameters // flow from arguments to parameters
for(int i=2;i<invk.getNumberOfParameters();++i) for(int i=2;i<invk.getNumberOfPositionalParameters();++i)
flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(realCallee, i-1)); flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(realCallee, i-1));
// flow from return vertex to result vertex // flow from return vertex to result vertex

View File

@ -109,7 +109,7 @@ public class PessimisticCallGraphBuilder extends FieldBasedCallGraphBuilder {
JavaScriptInvoke use_invk = (JavaScriptInvoke)use; JavaScriptInvoke use_invk = (JavaScriptInvoke)use;
// yes, so add edges from arguments to parameters... // yes, so add edges from arguments to parameters...
for(int i=2;i<use_invk.getNumberOfParameters();++i) for(int i=2;i<use_invk.getNumberOfPositionalParameters();++i)
flowgraph.addEdge(factory.makeVarVertex(caller, use_invk.getUse(i)), factory.makeParamVertex(callee, i)); flowgraph.addEdge(factory.makeVarVertex(caller, use_invk.getUse(i)), factory.makeParamVertex(callee, i));
// ...and from return to result // ...and from return to result
@ -129,7 +129,7 @@ public class PessimisticCallGraphBuilder extends FieldBasedCallGraphBuilder {
// if it's not a local call, add flows from/to unknown // if it's not a local call, add flows from/to unknown
if(!(def instanceof JavaScriptInvoke) || !isFunctionConstructorInvoke((JavaScriptInvoke)def)) { if(!(def instanceof JavaScriptInvoke) || !isFunctionConstructorInvoke((JavaScriptInvoke)def)) {
for(int i=1;i<invk.getNumberOfParameters();++i) for(int i=1;i<invk.getNumberOfPositionalParameters();++i)
flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeUnknownVertex()); flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeUnknownVertex());
flowgraph.addEdge(factory.makeUnknownVertex(), factory.makeVarVertex(caller, invk.getDef())); flowgraph.addEdge(factory.makeUnknownVertex(), factory.makeVarVertex(caller, invk.getDef()));
} }

View File

@ -143,7 +143,7 @@ public class WorklistBasedOptimisticCallgraphBuilder extends FieldBasedCallGraph
offset = 1; offset = 1;
} }
for(int i=0;i<invk.getNumberOfParameters();++i) { for(int i=0;i<invk.getNumberOfPositionalParameters();++i) {
// only flow receiver into 'this' if invk is, in fact, a method call // only flow receiver into 'this' if invk is, in fact, a method call
flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeArgVertex(callee)); flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeArgVertex(callee));
if(i != 1 || !invk.getDeclaredTarget().getSelector().equals(AstMethodReference.fnSelector)) if(i != 1 || !invk.getDeclaredTarget().getSelector().equals(AstMethodReference.fnSelector))
@ -166,7 +166,7 @@ public class WorklistBasedOptimisticCallgraphBuilder extends FieldBasedCallGraph
FuncVertex caller = reflectiveCallee.getFunction(); FuncVertex caller = reflectiveCallee.getFunction();
// flow from arguments to parameters // flow from arguments to parameters
for(int i=2;i<invk.getNumberOfParameters();++i) { for(int i=2;i<invk.getNumberOfPositionalParameters();++i) {
addFlowEdge(flowgraph, factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(realCallee, i-1), worklist); addFlowEdge(flowgraph, factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(realCallee, i-1), worklist);
// flow from return vertex to result vertex // flow from return vertex to result vertex

View File

@ -392,7 +392,7 @@ public class FlowGraphBuilder {
flowgraph.addEdge(cs, factory.makeVarVertex(func, invk.getDef())); flowgraph.addEdge(cs, factory.makeVarVertex(func, invk.getDef()));
// also passed as 'this' to constructor // also passed as 'this' to constructor
if (invk.getNumberOfParameters() > 1) { if (invk.getNumberOfPositionalParameters() > 1) {
flowgraph.addEdge(cs, factory.makeVarVertex(func, invk.getUse(0))); flowgraph.addEdge(cs, factory.makeVarVertex(func, invk.getUse(0)));
} }
} }

View File

@ -135,9 +135,9 @@ public class ArgumentSpecialization {
int v = -1; int v = -1;
for (SSAAbstractInvokeInstruction x : caller.getIR().getCalls(site)) { for (SSAAbstractInvokeInstruction x : caller.getIR().getCalls(site)) {
if (v == -1) { if (v == -1) {
v = x.getNumberOfParameters(); v = x.getNumberOfPositionalParameters();
} else { } else {
if (v != x.getNumberOfParameters()) { if (v != x.getNumberOfPositionalParameters()) {
return baseContext; return baseContext;
} }
} }

View File

@ -1035,7 +1035,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
} }
int paramCount = targetST.getParameterValueNumbers().length; int paramCount = targetST.getParameterValueNumbers().length;
int argCount = instruction.getNumberOfParameters(); int argCount = instruction.getNumberOfPositionalParameters();
// the first two arguments are the function object and the receiver, neither of which // the first two arguments are the function object and the receiver, neither of which
// should become part of the arguments array // should become part of the arguments array

View File

@ -46,7 +46,7 @@ public class JavaScriptConstructTargetSelector implements MethodTargetSelector {
IR callerIR = caller.getIR(); IR callerIR = caller.getIR();
SSAAbstractInvokeInstruction callStmts[] = callerIR.getCalls(site); SSAAbstractInvokeInstruction callStmts[] = callerIR.getCalls(site);
assert callStmts.length == 1; assert callStmts.length == 1;
int nargs = callStmts[0].getNumberOfParameters(); int nargs = callStmts[0].getNumberOfPositionalParameters();
return constructors.findOrCreateConstructorMethod(callerIR, callStmts[0], receiver, nargs - 1); return constructors.findOrCreateConstructorMethod(callerIR, callStmts[0], receiver, nargs - 1);
} else { } else {
return base.getCalleeTarget(caller, site, receiver); return base.getCalleeTarget(caller, site, receiver);

View File

@ -194,7 +194,7 @@ public class JavaScriptFunctionDotCallTargetSelector implements MethodTargetSele
IR callerIR = caller.getIR(); IR callerIR = caller.getIR();
SSAAbstractInvokeInstruction callStmts[] = callerIR.getCalls(site); SSAAbstractInvokeInstruction callStmts[] = callerIR.getCalls(site);
assert callStmts.length == 1; assert callStmts.length == 1;
int nargs = callStmts[0].getNumberOfParameters(); int nargs = callStmts[0].getNumberOfPositionalParameters();
return nargs; return nargs;
} }

View File

@ -132,7 +132,7 @@ public class PropertyNameContextSelector implements ContextSelector {
SSAAbstractInvokeInstruction inst = caller.getIR().getCalls(site)[0]; SSAAbstractInvokeInstruction inst = caller.getIR().getCalls(site)[0];
DefUse du = caller.getDU(); DefUse du = caller.getDU();
for(int i = 0; i < inst.getNumberOfParameters(); i++) { for(int i = 0; i < inst.getNumberOfPositionalParameters(); i++) {
MutableIntSet values = IntSetUtil.make(); MutableIntSet values = IntSetUtil.make();
values.add(inst.getUse(i)); values.add(inst.getUse(i));
collectValues(du, du.getDef(inst.getUse(i)), values); collectValues(du, du.getDef(inst.getUse(i)), values);

View File

@ -48,7 +48,7 @@ public class EscapeCorrelation extends Correlation {
} }
public int getNumberOfArguments() { public int getNumberOfArguments() {
return invoke.getNumberOfParameters() - 2; // deduct one for the function object, one for the receiver return invoke.getNumberOfPositionalParameters() - 2; // deduct one for the function object, one for the receiver
} }
@Override @Override

View File

@ -80,7 +80,7 @@ public class JavaScriptInvoke extends MultiReturnValueInvokeInstruction {
@Override @Override
public int getNumberOfUses() { public int getNumberOfUses() {
return getNumberOfParameters(); return getNumberOfPositionalParameters();
} }
@Override @Override
@ -126,7 +126,7 @@ public class JavaScriptInvoke extends MultiReturnValueInvokeInstruction {
} }
@Override @Override
public int getNumberOfParameters() { public int getNumberOfPositionalParameters() {
if (params == null) { if (params == null) {
return 1; return 1;
} else { } else {

View File

@ -89,7 +89,7 @@ public abstract class FixedParametersInvokeInstruction
} }
@Override @Override
public int getNumberOfParameters() { public int getNumberOfPositionalParameters() {
if (params == null) { if (params == null) {
return 0; return 0;
} else { } else {
@ -107,7 +107,7 @@ public abstract class FixedParametersInvokeInstruction
@Override @Override
public int getNumberOfUses() { public int getNumberOfUses() {
return getNumberOfParameters(); return getNumberOfPositionalParameters();
} }
@Override @Override
@ -119,7 +119,7 @@ public abstract class FixedParametersInvokeInstruction
@Override @Override
public int getUse(int j) { public int getUse(int j) {
if (j < getNumberOfParameters()) if (j < getNumberOfPositionalParameters())
return params[j]; return params[j];
else { else {
return super.getUse(j); return super.getUse(j);

View File

@ -57,7 +57,7 @@ public final class AnalysisUtil {
* including the this pointer. * including the this pointer.
*/ */
public static int[] getParameterNumbers(SSAAbstractInvokeInstruction invokeInstruction) { public static int[] getParameterNumbers(SSAAbstractInvokeInstruction invokeInstruction) {
final int number = invokeInstruction.getNumberOfParameters(); final int number = invokeInstruction.getNumberOfPositionalParameters();
final int[] parameterNumbers = new int[number]; final int[] parameterNumbers = new int[number];
assert (parameterNumbers.length == invokeInstruction.getNumberOfUses()); assert (parameterNumbers.length == invokeInstruction.getNumberOfUses());

View File

@ -302,10 +302,10 @@ public abstract class BasicCallGraph<T> extends AbstractNumberedGraph<CGNode> im
@Override @Override
public Set<CGNode> getNodes(MethodReference m) { public Set<CGNode> getNodes(MethodReference m) {
IMethod im = getClassHierarchy().resolveMethod(m); IMethod im = getClassHierarchy().resolveMethod(m);
if (im == null) { if (im != null) {
return Collections.emptySet(); m = im.getReference();
} }
Set<CGNode> result = mr2Nodes.get(im.getReference()); Set<CGNode> result = mr2Nodes.get(m);
Set<CGNode> empty = Collections.emptySet(); Set<CGNode> empty = Collections.emptySet();
return (result == null) ? empty : result; return (result == null) ? empty : result;
} }

View File

@ -1617,7 +1617,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap
// } // }
// } else { // } else {
// generate contraints from parameter passing // generate contraints from parameter passing
int nUses = instruction.getNumberOfParameters(); int nUses = instruction.getNumberOfPositionalParameters();
int nExpected = target.getMethod().getNumberOfParameters(); int nExpected = target.getMethod().getNumberOfParameters();
/* /*
@ -1635,7 +1635,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap
// TODO: we need much more precise filters than cones in order to handle // TODO: we need much more precise filters than cones in order to handle
// the various types of dispatch logic. We need a filter that expresses // the various types of dispatch logic. We need a filter that expresses
// "the set of types s.t. x.foo resolves to y.foo." // "the set of types s.t. x.foo resolves to y.foo."
for (int i = 0; i < instruction.getNumberOfParameters(); i++) { for (int i = 0; i < instruction.getNumberOfPositionalParameters(); i++) {
if (target.getMethod().getParameterType(i).isReferenceType()) { if (target.getMethod().getParameterType(i).isReferenceType()) {
PointerKey formal = getTargetPointerKey(target, i); PointerKey formal = getTargetPointerKey(target, i);
if (constParams != null && constParams[i] != null) { if (constParams != null && constParams[i] != null) {

View File

@ -696,7 +696,7 @@ public class SDG<T extends InstanceKey> extends AbstractNumberedGraph<Statement>
// don't track reflection into reflective invokes // don't track reflection into reflective invokes
return false; return false;
} }
for (int i = 0; i < call.getNumberOfParameters(); i++) { for (int i = 0; i < call.getNumberOfPositionalParameters(); i++) {
if (call.getUse(i) == caller.getValueNumber()) { if (call.getUse(i) == caller.getValueNumber()) {
if (callee.getValueNumber() == i + 1) { if (callee.getValueNumber() == i + 1) {
return true; return true;

View File

@ -186,7 +186,7 @@ public class BypassMethodTargetSelector implements MethodTargetSelector {
syntheticMethods.put(m, null); syntheticMethods.put(m, null);
return null; return null;
} }
SummarizedMethod n = new SummarizedMethod(m, summ, C); SummarizedMethod n = new SummarizedMethodWithNames(m, summ, C);
syntheticMethods.put(m, n); syntheticMethods.put(m, n);
return n; return n;
} else { } else {

View File

@ -151,7 +151,7 @@ public class LambdaSummaryClass extends SyntheticClass {
private Map<Atom,IField> makeFields() { private Map<Atom,IField> makeFields() {
Map<Atom,IField> result = HashMapFactory.make(); Map<Atom,IField> result = HashMapFactory.make();
for(int i = 0; i < invoke.getNumberOfParameters(); i++) { for(int i = 0; i < invoke.getNumberOfPositionalParameters(); i++) {
final int yuck = i; final int yuck = i;
result.put(Atom.findOrCreateUnicodeAtom("c" + yuck), new IField() { result.put(Atom.findOrCreateUnicodeAtom("c" + yuck), new IField() {
@Override @Override
@ -248,8 +248,8 @@ public class LambdaSummaryClass extends SyntheticClass {
MethodSummary summary = new MethodSummary(ref); MethodSummary summary = new MethodSummary(ref);
int inst = 0; int inst = 0;
int args = invoke.getNumberOfParameters(), v = args + 1; int args = invoke.getNumberOfPositionalParameters(), v = args + 1;
for(int i = 0; i < invoke.getNumberOfParameters(); i++) { for(int i = 0; i < invoke.getNumberOfPositionalParameters(); i++) {
Atom f = Atom.findOrCreateUnicodeAtom("c" + i); Atom f = Atom.findOrCreateUnicodeAtom("c" + i);
summary.addStatement(insts.GetInstruction(inst++, v++, 1, getField(f).getReference())); summary.addStatement(insts.GetInstruction(inst++, v++, 1, getField(f).getReference()));
} }
@ -273,11 +273,11 @@ public class LambdaSummaryClass extends SyntheticClass {
int numParams = getClassHierarchy().resolveMethod(callee).getNumberOfParameters(); int numParams = getClassHierarchy().resolveMethod(callee).getNumberOfParameters();
int params[] = new int[ numParams ]; int params[] = new int[ numParams ];
for(int i = isNew? 1: 0; i < invoke.getNumberOfParameters(); i++) { for(int i = isNew? 1: 0; i < invoke.getNumberOfPositionalParameters(); i++) {
params[i] = args + i + 1; params[i] = args + i + 1;
} }
int n = 2; int n = 2;
for(int i = invoke.getNumberOfParameters(); i < numParams; i++) { for(int i = invoke.getNumberOfPositionalParameters(); i < numParams; i++) {
params[i] = n++; params[i] = n++;
} }

View File

@ -20,6 +20,7 @@ import com.ibm.wala.types.MemberReference;
import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.MethodReference;
import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.strings.Atom;
import com.ibm.wala.util.warnings.Warning; import com.ibm.wala.util.warnings.Warning;
/** /**
@ -69,6 +70,11 @@ public class MethodSummary {
*/ */
private boolean isFactory = false; private boolean isFactory = false;
/**
* Known names for values
*/
private Map<Integer, Atom> valueNames = null;
public MethodSummary(MethodReference method) { public MethodSummary(MethodReference method) {
if (method == null) { if (method == null) {
throw new IllegalArgumentException("null method"); throw new IllegalArgumentException("null method");
@ -76,6 +82,18 @@ public class MethodSummary {
this.method = method; this.method = method;
} }
public void setValueNames(Map<Integer, Atom> nameTable) {
this.valueNames = nameTable;
}
public Map<Integer, Atom> getValueNames() {
return valueNames;
}
public Atom getValue(Integer v) {
return valueNames != null && valueNames.containsKey(v)? valueNames.get(v): null;
}
public int getNumberOfStatements() { public int getNumberOfStatements() {
return (statements == null ? 0 : statements.size()); return (statements == null ? 0 : statements.size());
} }

View File

@ -115,4 +115,9 @@ public class SummarizedMethod extends SyntheticMethod {
return summary.getParameterType(i); return summary.getParameterType(i);
} }
@Override
public String getLocalVariableName(int bcIndex, int localNumber) {
return summary.getValue(localNumber).toString();
}
} }

View File

@ -73,6 +73,10 @@ public class SummarizedMethodWithNames extends SummarizedMethod {
private final MethodSummary summary; private final MethodSummary summary;
private final Map<Integer, Atom> localNames; private final Map<Integer, Atom> localNames;
public SummarizedMethodWithNames(MethodReference ref, MethodSummary summary, IClass declaringClass) {
this(ref, summary, declaringClass, summary.getValueNames());
}
public SummarizedMethodWithNames(MethodReference ref, MethodSummary summary, IClass declaringClass, Map<Integer, Atom> localNames) public SummarizedMethodWithNames(MethodReference ref, MethodSummary summary, IClass declaringClass, Map<Integer, Atom> localNames)
throws NullPointerException { throws NullPointerException {
super(ref, summary, declaringClass); super(ref, summary, declaringClass);

View File

@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParser;
@ -183,10 +184,12 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
private final static String A_NUM_ARGS = "numArgs"; private final static String A_NUM_ARGS = "numArgs";
private final static String A_PARAM_NAMES = "paramNames";
private final static String V_NULL = "null"; private final static String V_NULL = "null";
private final static String V_TRUE = "true"; private final static String V_TRUE = "true";
public XMLMethodSummaryReader(InputStream xmlFile, AnalysisScope scope) { public XMLMethodSummaryReader(InputStream xmlFile, AnalysisScope scope) {
super(); super();
if (xmlFile == null) { if (xmlFile == null) {
@ -924,6 +927,24 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
for (int i = 0; i < nParams; i++) { for (int i = 0; i < nParams; i++) {
symbolTable.put("arg" + i, new Integer(i + 1)); symbolTable.put("arg" + i, new Integer(i + 1));
} }
int pn = 1;
String paramDescString = atts.getValue(A_PARAM_NAMES);
if (paramDescString != null) {
StringTokenizer paramNames = new StringTokenizer(paramDescString);
while (paramNames.hasMoreTokens()) {
symbolTable.put(paramNames.nextToken(), pn++);
}
}
Map<Integer,Atom> nameTable = HashMapFactory.make();
for(Map.Entry<String, Integer> x : symbolTable.entrySet()) {
if (! x.getKey().startsWith("arg")) {
nameTable.put(x.getValue(), Atom.findOrCreateUnicodeAtom(x.getKey()));
}
}
governingMethod.setValueNames(nameTable);
} }
/** /**

View File

@ -139,7 +139,7 @@ public abstract class SSAAbstractInvokeInstruction extends SSAInstruction {
/** /**
* How many parameters does this call specify? * How many parameters does this call specify?
*/ */
public abstract int getNumberOfParameters(); public abstract int getNumberOfPositionalParameters();
/** /**
* How many distinct values does this call return? * How many distinct values does this call return?
@ -199,9 +199,9 @@ public abstract class SSAAbstractInvokeInstruction extends SSAInstruction {
s.append(" "); s.append(" ");
s.append(site.getDeclaredTarget().toString()); s.append(site.getDeclaredTarget().toString());
if (getNumberOfParameters() > 0) { if (getNumberOfPositionalParameters() > 0) {
s.append(" ").append(getValueString(symbolTable, getUse(0))); s.append(" ").append(getValueString(symbolTable, getUse(0)));
for (int i = 1; i < getNumberOfParameters(); i++) { for (int i = 1; i < getNumberOfPositionalParameters(); i++) {
s.append(",").append(getValueString(symbolTable, getUse(i))); s.append(",").append(getValueString(symbolTable, getUse(i)));
} }
} }

View File

@ -101,7 +101,7 @@ public abstract class SSAInvokeInstruction extends SSAAbstractInvokeInstruction
} }
@Override @Override
public int getNumberOfParameters() { public int getNumberOfPositionalParameters() {
return getNumberOfUses(); return getNumberOfUses();
} }

View File

@ -455,7 +455,7 @@ implements IFlowFunctionMap<BasicBlockInContext<E>> {
// } // }
final Map<CodeElement,CodeElement> parameterMap = HashMapFactory.make(); final Map<CodeElement,CodeElement> parameterMap = HashMapFactory.make();
for (int i = 0; i < instruction.getNumberOfParameters(); i++) { for (int i = 0; i < instruction.getNumberOfPositionalParameters(); i++) {
Set<CodeElement> elements = CodeElement.valueElements(instruction.getUse(i)); Set<CodeElement> elements = CodeElement.valueElements(instruction.getUse(i));
for(CodeElement e: elements) { for(CodeElement e: elements) {
parameterMap.put(e, new LocalElement(i+1)); parameterMap.put(e, new LocalElement(i+1));

View File

@ -179,7 +179,7 @@ public class TaintTransferFunctions<E extends ISSABasicBlock> implements
// build list of actual parameter code elements, and return a // build list of actual parameter code elements, and return a
// function // function
final int numParams = ((SSAInvokeInstruction) srcInst) final int numParams = ((SSAInvokeInstruction) srcInst)
.getNumberOfParameters(); .getNumberOfPositionalParameters();
List<CodeElement> actualParams = new ArrayList<>(numParams); List<CodeElement> actualParams = new ArrayList<>(numParams);
for (int i = 0; i < numParams; i++) { for (int i = 0; i < numParams; i++) {
actualParams.add(i, new LocalElement(srcInst.getUse(i))); actualParams.add(i, new LocalElement(srcInst.getUse(i)));

View File

@ -333,7 +333,7 @@ public class SSAtoXMLVisitor implements SSAInstruction.IVisitor {
elt.setAttribute(XMLSummaryWriter.A_DEF, localName); elt.setAttribute(XMLSummaryWriter.A_DEF, localName);
} }
int paramCount = instruction.getNumberOfParameters(); int paramCount = instruction.getNumberOfPositionalParameters();
for (int i=0; i < paramCount; i++) { for (int i=0; i < paramCount; i++) {
String argName = getLocalName(instruction.getUse(i)); String argName = getLocalName(instruction.getUse(i));
elt.setAttribute(XMLSummaryWriter.A_ARG+i, argName); elt.setAttribute(XMLSummaryWriter.A_ARG+i, argName);