Program: 186673
Project: 186673
Buggy source:
private void createFlowGraph(MethodInfo method){
  logger.debug("String_Node_Str" + method);
  Map<Integer,BasicBlockNode> nodeTable=new HashMap<Integer,BasicBlockNode>();
  graph=new DefaultFlowGraph<CFGNode,CFGEdge>(CFGEdge.class,new DedicatedNode(DedicatedNodeName.ENTRY),new DedicatedNode(DedicatedNodeName.EXIT));
  blocks=new ArrayList<BasicBlock>();
  int i=0;
  for (  BasicBlock bb : BasicBlock.buildBasicBlocks(method.getCode())) {
    BasicBlockNode n=addBasicBlock(i++,bb);
    nodeTable.put(bb.getFirstInstruction().getPosition(),n);
  }
  graph.addEdge(graph.getEntry(),nodeTable.get(blocks.get(0).getFirstInstruction().getPosition()),entryEdge());
  hasThrowEdges=false;
  for (  BasicBlockNode bbNode : nodeTable.values()) {
    BasicBlock bb=bbNode.getBasicBlock();
    FlowInfo bbf=bb.getExitFlowInfo();
    if (bbf.isExit()) {
      if (bbNode.getBasicBlock().getLastInstruction().getInstruction().getOpcode() == Constants.ATHROW) {
        logger.warn("String_Node_Str" + this.toString() + "String_Node_Str");
        hasThrowEdges=true;
      }
 else {
        graph.addEdge(bbNode,graph.getExit(),exitEdge());
      }
    }
 else     if (!bbf.isAlwaysTaken()) {
      BasicBlockNode bbSucc=nodeTable.get(bbNode.getBasicBlock().getLastInstruction().getNext().getPosition());
      if (bbSucc == null) {
        internalError("String_Node_Str" + bbNode.getBasicBlock().getLastInstruction());
      }
      graph.addEdge(bbNode,bbSucc,new CFGEdge(EdgeKind.NEXT_EDGE));
    }
    for (    FlowTarget target : bbf.getTargets()) {
      BasicBlockNode targetNode=nodeTable.get(target.getTarget().getPosition());
      if (targetNode == null)       internalError("String_Node_Str" + bbNode + "String_Node_Str"+ target);
      graph.addEdge(bbNode,targetNode,new CFGEdge(target.getEdgeKind()));
    }
  }
  this.graph.addEdge(graph.getEntry(),graph.getExit(),exitEdge());
}

Fixed version (ground truth):
private void createFlowGraph(MethodInfo method){
  logger.debug("String_Node_Str" + method);
  Map<Integer,BasicBlockNode> nodeTable=new HashMap<Integer,BasicBlockNode>();
  graph=new DefaultFlowGraph<CFGNode,CFGEdge>(CFGEdge.class,new DedicatedNode(DedicatedNodeName.ENTRY),new DedicatedNode(DedicatedNodeName.EXIT));
  blocks=new ArrayList<BasicBlock>();
  int i=0;
  for (  BasicBlock bb : BasicBlock.buildBasicBlocks(method.getCode())) {
    BasicBlockNode n=addBasicBlock(i++,bb);
    nodeTable.put(bb.getFirstInstruction().getPosition(),n);
  }
  graph.addEdge(graph.getEntry(),nodeTable.get(blocks.get(0).getFirstInstruction().getPosition()),entryEdge());
  hasThrowEdges=false;
  for (  BasicBlockNode bbNode : nodeTable.values()) {
    BasicBlock bb=bbNode.getBasicBlock();
    FlowInfo bbf=bb.getExitFlowInfo();
    if (bbf.isExit()) {
      if (bbNode.getBasicBlock().getLastInstruction().getInstruction().getOpcode() == Constants.ATHROW) {
        if (ignoreATHROW) {
          if (logger.isTraceEnabled()) {
            logger.trace("String_Node_Str" + this.toString() + "String_Node_Str");
          }
        }
 else {
          logger.warn("String_Node_Str" + this.toString() + "String_Node_Str");
        }
        hasThrowEdges=true;
      }
 else {
        graph.addEdge(bbNode,graph.getExit(),exitEdge());
      }
    }
 else     if (!bbf.isAlwaysTaken()) {
      BasicBlockNode bbSucc=nodeTable.get(bbNode.getBasicBlock().getLastInstruction().getNext().getPosition());
      if (bbSucc == null) {
        internalError("String_Node_Str" + bbNode.getBasicBlock().getLastInstruction());
      }
      graph.addEdge(bbNode,bbSucc,new CFGEdge(EdgeKind.NEXT_EDGE));
    }
    for (    FlowTarget target : bbf.getTargets()) {
      BasicBlockNode targetNode=nodeTable.get(target.getTarget().getPosition());
      if (targetNode == null)       internalError("String_Node_Str" + bbNode + "String_Node_Str"+ target);
      graph.addEdge(bbNode,targetNode,new CFGEdge(target.getEdgeKind()));
    }
  }
  this.graph.addEdge(graph.getEntry(),graph.getExit(),exitEdge());
}