- System.out.println("calleeFlowGraph=" + calleeFlowGraph + " of " + possibleMdCallee);
- // find parameter node
- Set<FlowNode> paramNodeSet = calleeFlowGraph.getParameterNodeSet();
-
- for (Iterator iterator = paramNodeSet.iterator(); iterator.hasNext();) {
- FlowNode paramFlowNode1 = (FlowNode) iterator.next();
-
- for (Iterator iterator2 = paramNodeSet.iterator(); iterator2.hasNext();) {
- FlowNode paramFlowNode2 = (FlowNode) iterator2.next();
-
- String paramSymbol1 = getSymbol(0, paramFlowNode1);
- String paramSymbol2 = getSymbol(0, paramFlowNode2);
- // if two parameters have a relation, we need to propagate this relation
- // to the caller
- if (!(paramSymbol1.equals(paramSymbol2))
- && calleeLattice.isComparable(paramSymbol1, paramSymbol2)) {
- int higherLocIdxCallee;
- int lowerLocIdxCallee;
- if (calleeLattice.isGreaterThan(paramSymbol1, paramSymbol2)) {
- higherLocIdxCallee = calleeFlowGraph.getParamIdx(paramFlowNode1.getDescTuple());
- lowerLocIdxCallee = calleeFlowGraph.getParamIdx(paramFlowNode2.getDescTuple());
- } else {
- higherLocIdxCallee = calleeFlowGraph.getParamIdx(paramFlowNode2.getDescTuple());
- lowerLocIdxCallee = calleeFlowGraph.getParamIdx(paramFlowNode1.getDescTuple());
- }
-
- NTuple<Descriptor> higherArg = getArgTupleByArgIdx(min, higherLocIdxCallee);
- NTuple<Descriptor> lowerArg = getArgTupleByArgIdx(min, lowerLocIdxCallee);
-
- if (higherArg != null && lowerArg != null) {
- // if the argument has the TOP location, getArgTupleByArgIdx returns
- // null
- addFlowGraphEdge(mdCaller, higherArg, lowerArg);
+ int numParam = calleeLocInfo.getNumParam();
+ for (int i = 0; i < numParam; i++) {
+ CompositeLocation param1 = calleeLocInfo.getParamCompositeLocation(i);
+ for (int k = 0; k < numParam; k++) {
+ if (i != k) {
+ CompositeLocation param2 = calleeLocInfo.getParamCompositeLocation(k);
+ if (isGreaterThan(param1, param2)) {
+ NTuple<Descriptor> argDescTuple1 = getArgTupleByArgIdx(min, i);
+ NTuple<Descriptor> argDescTuple2 = getArgTupleByArgIdx(min, k);
+ addRelation(methodLattice, methodInfo, argDescTuple1.get(0), argDescTuple2.get(0));