Program: 57211
Project: 57211
Buggy source:
/** 
 * Split the edge. <p> Once split, this edge is not referenced anymore by the vertices, it is replaced by the two or three sub-edges and intermediate splitting vertices are introduced to connect these sub-edges together. </p>
 * @param splitCircle circle splitting the edge in several parts
 * @param outsideList list where to put parts that are outside of the split circle
 * @param insideList list where to put parts that are inside the split circle
 */
private void split(final Circle splitCircle,final List<Edge> outsideList,final List<Edge> insideList){
  final double edgeStart=circle.getPhase(start.getLocation().getVector());
  final double arcRelativeStart=MathUtils.normalizeAngle(circle.getInsideArc(splitCircle).getInf(),edgeStart + FastMath.PI) - edgeStart;
  final double arcRelativeEnd=arcRelativeStart + FastMath.PI;
  final double unwrappedEnd=arcRelativeStart - FastMath.PI;
  if (arcRelativeStart < length) {
    if (unwrappedEnd > 0) {
      final Vertex vExit=new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeEnd)));
      final Vertex vEnter=new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeStart)));
      vExit.bindWith(splitCircle);
      vEnter.bindWith(splitCircle);
      final Edge eStartIn=new Edge(start,vExit,unwrappedEnd,circle);
      final Edge eMiddleOut=new Edge(vExit,vEnter,arcRelativeStart - unwrappedEnd,circle);
      final Edge eEndIn=new Edge(vEnter,end,length - arcRelativeStart,circle);
      eStartIn.setNode(node);
      eMiddleOut.setNode(node);
      eEndIn.setNode(node);
      insideList.add(eStartIn);
      insideList.add(eEndIn);
      outsideList.add(eMiddleOut);
    }
 else {
      final Vertex vEnter=new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeStart)));
      vEnter.bindWith(splitCircle);
      final Edge eStartOut=new Edge(start,vEnter,arcRelativeStart,circle);
      final Edge eEndIn=new Edge(vEnter,end,length - arcRelativeStart,circle);
      eStartOut.setNode(node);
      eEndIn.setNode(node);
      outsideList.add(eStartOut);
      insideList.add(eEndIn);
    }
  }
 else {
    if (unwrappedEnd > 0) {
      if (unwrappedEnd > length) {
        insideList.add(this);
      }
 else {
        final Vertex vExit=new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeEnd)));
        vExit.bindWith(splitCircle);
        final Edge eStartIn=new Edge(start,vExit,arcRelativeEnd,circle);
        final Edge eEndOut=new Edge(vExit,end,length - arcRelativeEnd,circle);
        eStartIn.setNode(node);
        eEndOut.setNode(node);
        insideList.add(eStartIn);
        outsideList.add(eEndOut);
      }
    }
 else {
      outsideList.add(this);
    }
  }
}

Fixed version (ground truth):
/** 
 * Split the edge. <p> Once split, this edge is not referenced anymore by the vertices, it is replaced by the two or three sub-edges and intermediate splitting vertices are introduced to connect these sub-edges together. </p>
 * @param splitCircle circle splitting the edge in several parts
 * @param outsideList list where to put parts that are outside of the split circle
 * @param insideList list where to put parts that are inside the split circle
 */
private void split(final Circle splitCircle,final List<Edge> outsideList,final List<Edge> insideList){
  final double edgeStart=circle.getPhase(start.getLocation().getVector());
  final double arcRelativeStart=MathUtils.normalizeAngle(circle.getInsideArc(splitCircle).getInf(),edgeStart + FastMath.PI) - edgeStart;
  final double arcRelativeEnd=arcRelativeStart + FastMath.PI;
  final double unwrappedEnd=arcRelativeStart - FastMath.PI;
  final double tolerance=circle.getTolerance();
  Vertex previousVertex=start;
  if (unwrappedEnd >= length - tolerance) {
    insideList.add(this);
  }
 else {
    double alreadyManagedLength=0;
    if (unwrappedEnd >= 0) {
      previousVertex=addSubEdge(previousVertex,new Vertex(new S2Point(circle.getPointAt(edgeStart + unwrappedEnd))),unwrappedEnd,insideList,splitCircle);
      alreadyManagedLength=unwrappedEnd;
    }
    if (arcRelativeStart >= length - tolerance) {
      if (unwrappedEnd >= 0) {
        previousVertex=addSubEdge(previousVertex,end,length - alreadyManagedLength,outsideList,splitCircle);
      }
 else {
        outsideList.add(this);
      }
    }
 else {
      previousVertex=addSubEdge(previousVertex,new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeStart))),arcRelativeStart - alreadyManagedLength,outsideList,splitCircle);
      alreadyManagedLength=arcRelativeStart;
      if (arcRelativeEnd >= length - tolerance) {
        previousVertex=addSubEdge(previousVertex,end,length - alreadyManagedLength,insideList,splitCircle);
      }
 else {
        previousVertex=addSubEdge(previousVertex,new Vertex(new S2Point(circle.getPointAt(edgeStart + arcRelativeStart))),arcRelativeStart - alreadyManagedLength,insideList,splitCircle);
        alreadyManagedLength=arcRelativeStart;
        previousVertex=addSubEdge(previousVertex,end,length - alreadyManagedLength,outsideList,splitCircle);
      }
    }
  }
}