- 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();
- }
- }
- }
-
- }
-