Program: 40503
Project: 40503
Buggy source:
/** 
 * Propagate information for an "exit" edge to the appropriate return sites [23] for each d5 s.t. <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. <c, d1> -> <edge.s_p, edge.d2> was recorded as call flow
 */
private void propagateToReturnSites(final PathEdge<T> edge,IntSet succ,final T c,final IntSet D4){
  if (DEBUG_LEVEL > 1) {
    System.err.println("String_Node_Str" + succ);
    for (IntIterator it=succ.intIterator(); it.hasNext(); ) {
      int x=it.next();
      System.err.println("String_Node_Str" + x + "String_Node_Str"+ supergraph.getNode(x));
    }
  }
  P proc=supergraph.getProcOf(c);
  final T[] entries=supergraph.getEntriesForProcedure(proc);
  for (Iterator<? extends T> retSites=supergraph.getReturnSites(c); 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 (!succ.contains(supergraph.getNumber(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(){
        public void act(        final int d4){
          if (D5 != null) {
            D5.foreach(new IntSetAction(){
              public void act(              final int d5){
                for (int i=0; i < entries.length; i++) {
                  final T s_p=entries[i];
                  if (DEBUG_LEVEL > 1) {
                    System.err.println("String_Node_Str" + s_p);
                  }
                  IntSet D3=getInversePathEdges(s_p,c,d4);
                  if (DEBUG_LEVEL > 1) {
                    System.err.println("String_Node_Str" + D3);
                  }
                  if (D3 != null) {
                    D3.foreach(new IntSetAction(){
                      public void act(                      int d3){
                        propagate(s_p,d3,retSite,d5);
                      }
                    }
);
                  }
                }
              }
            }
);
          }
        }
      }
;
      D4.foreach(action);
    }
  }
}

Fixed version (ground truth):
/** 
 * Propagate information for an "exit" edge to the appropriate return sites [23] for each d5 s.t. <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. <c, d1> -> <edge.s_p, edge.d2> was recorded as call flow
 */
private void propagateToReturnSites(final PathEdge<T> edge,IntSet succ,final T c,final IntSet D4){
  if (DEBUG_LEVEL > 1) {
    System.err.println("String_Node_Str" + succ);
    for (IntIterator it=succ.intIterator(); it.hasNext(); ) {
      int x=it.next();
      System.err.println("String_Node_Str" + x + "String_Node_Str"+ supergraph.getNode(x));
    }
  }
  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 (!succ.contains(supergraph.getNumber(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(){
        public void act(        final int d4){
          if (D5 != null) {
            D5.foreach(new IntSetAction(){
              public void act(              final int d5){
                for (int i=0; i < entries.length; i++) {
                  final T s_p=entries[i];
                  if (DEBUG_LEVEL > 1) {
                    System.err.println("String_Node_Str" + s_p);
                  }
                  IntSet D3=getInversePathEdges(s_p,c,d4);
                  if (DEBUG_LEVEL > 1) {
                    System.err.println("String_Node_Str" + D3);
                  }
                  if (D3 != null) {
                    D3.foreach(new IntSetAction(){
                      public void act(                      int d3){
                        propagate(s_p,d3,retSite,d5);
                      }
                    }
);
                  }
                }
              }
            }
);
          }
        }
      }
;
      D4.foreach(action);
    }
  }
}