Program: 99640
Project: 99640
Buggy source:
/** 
 * Propagate information for an "exit" edge to the appropriate return sites [23] for each d5 s.t.   {@literal <s_p,d2> -> <returnSite(c),d5>} ..
 * @param edge the edge being processed
 * @param succ numbers of the nodes that are successors of edge.n (the return block in the callee) in the call graph.
 * @param c a call site of edge.s_p
 * @param D4 set of d1 s.t. {@literal <c, d1> -> <edge.s_p, edge.d2>} was recorded as call flow
 */
private void propagateToReturnSites(final PathEdge<T> edge,final T c,final IntSet D4){
  P proc=supergraph.getProcOf(c);
  final T[] entries=supergraph.getEntriesForProcedure(proc);
  for (Iterator<? extends T> retSites=supergraph.getReturnSites(c,supergraph.getProcOf(edge.target)); retSites.hasNext(); ) {
    final T retSite=retSites.next();
    if (DEBUG_LEVEL > 1) {
      System.err.println("String_Node_Str" + retSite + "String_Node_Str"+ supergraph.getNumber(retSite));
    }
    if (!supergraph.hasEdge(edge.target,retSite)) {
      continue;
    }
    if (DEBUG_LEVEL > 1) {
      System.err.println("String_Node_Str" + retSite);
    }
    final IFlowFunction retf=flowFunctionMap.getReturnFlowFunction(c,edge.target,retSite);
    if (retf instanceof IBinaryReturnFlowFunction) {
      propagateToReturnSiteWithBinaryFlowFunction(edge,c,D4,entries,retSite,retf);
    }
 else {
      final IntSet D5=computeFlow(edge.d2,(IUnaryFlowFunction)retf);
      if (DEBUG_LEVEL > 1) {
        System.err.println("String_Node_Str" + D4);
        System.err.println("String_Node_Str" + D5);
      }
      IntSetAction action=new IntSetAction(){
        @Override public void act(        final int d4){
          propToReturnSite(c,entries,retSite,d4,D5,edge);
        }
      }
;
      D4.foreach(action);
    }
  }
}

Fixed version (ground truth):
/** 
 * Propagate information for an "exit" edge to the appropriate return sites [23] for each d5 s.t.   {@literal <s_p,d2> -> <returnSite(c),d5>} ..
 * @param edge the edge being processed
 * @param succ numbers of the nodes that are successors of edge.n (the return block in the callee) in the call graph.
 * @param c a call site of edge.s_p
 * @param D4 set of d1 s.t. {@literal <c, d1> -> <edge.s_p, edge.d2>} was recorded as call flow
 */
@SuppressWarnings("String_Node_Str") private void propagateToReturnSites(final PathEdge<T> edge,final T c,final IntSet D4){
  P proc=supergraph.getProcOf(c);
  final T[] entries=supergraph.getEntriesForProcedure(proc);
  for (Iterator<? extends T> retSites=supergraph.getReturnSites(c,supergraph.getProcOf(edge.target)); retSites.hasNext(); ) {
    final T retSite=retSites.next();
    if (DEBUG_LEVEL > 1) {
      System.err.println("String_Node_Str" + retSite + "String_Node_Str"+ supergraph.getNumber(retSite));
    }
    if (!supergraph.hasEdge(edge.target,retSite)) {
      continue;
    }
    if (DEBUG_LEVEL > 1) {
      System.err.println("String_Node_Str" + retSite);
    }
    final IFlowFunction retf=flowFunctionMap.getReturnFlowFunction(c,edge.target,retSite);
    if (retf instanceof IBinaryReturnFlowFunction) {
      propagateToReturnSiteWithBinaryFlowFunction(edge,c,D4,entries,retSite,retf);
    }
 else {
      final IntSet D5=computeFlow(edge.d2,(IUnaryFlowFunction)retf);
      if (DEBUG_LEVEL > 1) {
        System.err.println("String_Node_Str" + D4);
        System.err.println("String_Node_Str" + D5);
      }
      IntSetAction action=new IntSetAction(){
        @Override public void act(        final int d4){
          propToReturnSite(c,entries,retSite,d4,D5,edge);
        }
      }
;
      D4.foreach(action);
    }
  }
}