+ private void addValueFlowBetweenParametersToCaller(MethodInvokeNode min,
+ MethodDescriptor mdCaller, MethodDescriptor mdCallee) {
+
+ System.out.println("***addValueFlowBetweenParametersToCaller from mdCallee=" + mdCallee);
+
+ Set<NTuple<Location>> PCLocTupleSet = mapMethodInvokeNodeToPCLocTupleSet.get(min);
+ System.out.println("-PCLocTupleSet=" + PCLocTupleSet);
+
+ GlobalFlowGraph calleeSubGlobalGraph = getSubGlobalFlowGraph(mdCallee);
+ GlobalFlowGraph callerSubGlobalGraph = getSubGlobalFlowGraph(mdCaller);
+
+ // if the parameter A reaches to the parameter B
+ // then, add an edge the argument A -> the argument B to the global flow graph
+ FlowGraph calleeFlowGraph = getFlowGraph(mdCallee);
+ FlowGraph callerFlowGraph = getFlowGraph(mdCaller);
+ int numParam = calleeFlowGraph.getNumParameters();
+
+ for (int i = 0; i < numParam; i++) {
+ for (int k = 0; k < numParam; k++) {
+
+ if (i != k) {
+
+ System.out.println("i=" + i + " k=" + k);
+
+ FlowNode paramNode1 = calleeFlowGraph.getParamFlowNode(i);
+ FlowNode paramNode2 = calleeFlowGraph.getParamFlowNode(k);
+
+ NTuple<Descriptor> arg1Tuple = getNodeTupleByArgIdx(min, i);
+ NTuple<Descriptor> arg2Tuple = getNodeTupleByArgIdx(min, k);
+
+ NTuple<Descriptor> paramDescTuple1 = paramNode1.getCurrentDescTuple();
+ NTuple<Descriptor> paramDescTuple2 = paramNode2.getCurrentDescTuple();
+
+ if (paramDescTuple1.get(0).equals(paramDescTuple2.get(0))) {
+ // if two parameters share the same prefix
+ // it already has been assigned to a composite location
+ // so we don't need to add an additional ordering relation caused by these two
+ // paramters.
+ continue;
+ }
+
+ NTuple<Location> paramLocTuple1 = translateToLocTuple(mdCallee, paramDescTuple1);
+ NTuple<Location> paramLocTuple2 = translateToLocTuple(mdCallee, paramDescTuple2);
+
+ // check if the callee propagates an ordering constraints through
+ // parameters
+
+ // Set<FlowNode> localReachSet = calleeFlowGraph.getLocalReachFlowNodeSetFrom(paramNode1);
+
+ Set<GlobalFlowNode> reachToParam1Set =
+ calleeSubGlobalGraph.getIncomingNodeSetByPrefix(paramLocTuple1.get(0));
+
+ // System.out.println("-- localReachSet from param1=" + localReachSet);
+
+ GlobalFlowNode globalFlowNodeParam1 = calleeSubGlobalGraph.getFlowNode(paramLocTuple1);
+ GlobalFlowNode globalFlowNodeParam2 = calleeSubGlobalGraph.getFlowNode(paramLocTuple2);
+
+ System.out.println("-param1CurTuple=" + paramDescTuple1 + " param2CurTuple="
+ + paramDescTuple2);
+
+ System.out.println("arg1Tuple=" + arg1Tuple + " arg2Tuple=" + arg2Tuple);
+ // System.out.println("-reachToParam1Set=" + reachToParam1Set);
+
+ if (arg1Tuple.size() > 0 && arg2Tuple.size() > 0
+ && reachToParam1Set.contains(globalFlowNodeParam2)) {
+ // need to propagate an ordering relation s.t. arg1 is higher
+ // than arg2
+ System.out.println("---param1=" + paramNode1 + " is higher than param2=" + paramNode2);
+
+ NTuple<Location> callerSrcNodeLocTuple =
+ translateToCallerLocTuple(min, mdCallee, mdCaller, paramLocTuple1);
+
+ NTuple<Location> callerDstNodeLocTuple =
+ translateToCallerLocTuple(min, mdCallee, mdCaller, paramLocTuple2);
+
+ System.out.println("---callerSrcNodeLocTuple=" + callerSrcNodeLocTuple);
+ System.out.println("---callerDstNodeLocTuple=" + callerDstNodeLocTuple);
+
+ System.out.println("-----add global value flow :" + callerSrcNodeLocTuple + "->"
+ + callerDstNodeLocTuple);
+ callerSubGlobalGraph.addValueFlowEdge(callerSrcNodeLocTuple, callerDstNodeLocTuple);
+ for (Iterator iterator = PCLocTupleSet.iterator(); iterator.hasNext();) {
+ NTuple<Location> pcLocTuple = (NTuple<Location>) iterator.next();
+ System.out.println("-----add global value flow PC :" + pcLocTuple + "->"
+ + callerSrcNodeLocTuple);
+ callerSubGlobalGraph.addValueFlowEdge(pcLocTuple, callerSrcNodeLocTuple);
+ }
+
+ // add a new flow between the corresponding arguments.
+ callerFlowGraph.addValueFlowEdge(arg1Tuple, arg2Tuple);
+ System.out.println("arg1=" + arg1Tuple + " arg2=" + arg2Tuple);
+
+ // System.out
+ // .println("-arg1Tuple=" + arg1Tuple + " is higher than arg2Tuple=" + arg2Tuple);
+
+ }
+
+ System.out.println();
+ }
+ }
+ }
+
+ }
+