Program: 18280
Project: 18280
Buggy source:
protected void drawCircles(Canvas c){
  mRenderPaint.setStyle(Paint.Style.FILL);
  float phaseX=mAnimator.getPhaseX();
  float phaseY=mAnimator.getPhaseY();
  List<LineDataSet> dataSets=mChart.getLineData().getDataSets();
  for (int i=0; i < dataSets.size(); i++) {
    LineDataSet dataSet=dataSets.get(i);
    if (!dataSet.isVisible() || !dataSet.isDrawCirclesEnabled() || dataSet.getEntryCount() == 0)     continue;
    mCirclePaintInner.setColor(dataSet.getCircleHoleColor());
    Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
    List<Entry> entries=dataSet.getYVals();
    Entry entryFrom=dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX);
    Entry entryTo=dataSet.getEntryForXIndex(mMaxX);
    int diff=(entryFrom == entryTo) ? 1 : 0;
    int minx=Math.max(dataSet.getEntryPosition(entryFrom) - diff,0);
    int maxx=Math.min(Math.max(minx + 2,dataSet.getEntryPosition(entryTo) + 1),entries.size());
    CircleBuffer buffer=mCircleBuffers[i];
    buffer.setPhases(phaseX,phaseY);
    buffer.limitFrom(minx);
    buffer.limitTo(maxx);
    buffer.feed(entries);
    trans.pointValuesToPixel(buffer.buffer);
    float halfsize=dataSet.getCircleSize() / 2f;
    for (int j=0, count=(int)Math.ceil((maxx - minx) * phaseX + minx) * 2; j < count; j+=2) {
      float x=buffer.buffer[j];
      float y=buffer.buffer[j + 1];
      if (!mViewPortHandler.isInBoundsRight(x))       break;
      if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y))       continue;
      int circleColor=dataSet.getCircleColor(j / 2 + minx);
      mRenderPaint.setColor(circleColor);
      c.drawCircle(x,y,dataSet.getCircleSize(),mRenderPaint);
      if (dataSet.isDrawCircleHoleEnabled() && circleColor != mCirclePaintInner.getColor())       c.drawCircle(x,y,halfsize,mCirclePaintInner);
    }
  }
}

Fixed version (ground truth):
protected void drawCircles(Canvas c){
  mRenderPaint.setStyle(Paint.Style.FILL);
  float phaseX=mAnimator.getPhaseX();
  float phaseY=mAnimator.getPhaseY();
  List<LineDataSet> dataSets=mChart.getLineData().getDataSets();
  for (int i=0; i < dataSets.size(); i++) {
    LineDataSet dataSet=dataSets.get(i);
    if (!dataSet.isVisible() || !dataSet.isDrawCirclesEnabled() || dataSet.getEntryCount() == 0)     continue;
    mCirclePaintInner.setColor(dataSet.getCircleHoleColor());
    Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
    List<Entry> entries=dataSet.getYVals();
    Entry entryFrom=dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX,DataSet.Rounding.DOWN);
    Entry entryTo=dataSet.getEntryForXIndex(mMaxX,DataSet.Rounding.UP);
    int minx=Math.max(dataSet.getEntryPosition(entryFrom),0);
    int maxx=Math.min(dataSet.getEntryPosition(entryTo) + 1,entries.size());
    CircleBuffer buffer=mCircleBuffers[i];
    buffer.setPhases(phaseX,phaseY);
    buffer.limitFrom(minx);
    buffer.limitTo(maxx);
    buffer.feed(entries);
    trans.pointValuesToPixel(buffer.buffer);
    float halfsize=dataSet.getCircleSize() / 2f;
    for (int j=0, count=(int)Math.ceil((maxx - minx) * phaseX + minx) * 2; j < count; j+=2) {
      float x=buffer.buffer[j];
      float y=buffer.buffer[j + 1];
      if (!mViewPortHandler.isInBoundsRight(x))       break;
      if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y))       continue;
      int circleColor=dataSet.getCircleColor(j / 2 + minx);
      mRenderPaint.setColor(circleColor);
      c.drawCircle(x,y,dataSet.getCircleSize(),mRenderPaint);
      if (dataSet.isDrawCircleHoleEnabled() && circleColor != mCirclePaintInner.getColor())       c.drawCircle(x,y,halfsize,mCirclePaintInner);
    }
  }
}