Program: 18613
Project: 18613
Buggy source:
@Override public void drawValues(Canvas c){
  if (passesCheck()) {
    ArrayList<BarDataSet> dataSets=mChart.getBarData().getDataSets();
    float posOffset=0f;
    float negOffset=0f;
    boolean drawValueAboveBar=mChart.isDrawValueAboveBarEnabled();
    posOffset=(drawValueAboveBar ? -Utils.convertDpToPixel(5) : Utils.calcTextHeight(mValuePaint,"String_Node_Str") * 1.5f);
    negOffset=(drawValueAboveBar ? Utils.calcTextHeight(mValuePaint,"String_Node_Str") * 1.5f : -Utils.convertDpToPixel(5));
    for (int i=0; i < mChart.getBarData().getDataSetCount(); i++) {
      BarDataSet dataSet=dataSets.get(i);
      if (!dataSet.isDrawValuesEnabled())       continue;
      applyValueTextStyle(dataSet);
      ValueFormatter formatter=dataSet.getValueFormatter();
      Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
      ArrayList<BarEntry> entries=dataSet.getYVals();
      float[] valuePoints=getTransformedValues(trans,entries,i);
      if (!mChart.isDrawValuesForWholeStackEnabled()) {
        for (int j=0; j < valuePoints.length * mAnimator.getPhaseX(); j+=2) {
          if (!mViewPortHandler.isInBoundsRight(valuePoints[j]))           break;
          if (!mViewPortHandler.isInBoundsY(valuePoints[j + 1]) || !mViewPortHandler.isInBoundsLeft(valuePoints[j]))           continue;
          float val=entries.get(j / 2).getVal();
          drawValue(c,val,valuePoints[j],valuePoints[j + 1] + (val >= 0 ? posOffset : negOffset),formatter);
        }
      }
 else {
        for (int j=0; j < (valuePoints.length - 1) * mAnimator.getPhaseX(); j+=2) {
          if (!mViewPortHandler.isInBoundsRight(valuePoints[j]))           break;
          if (!mViewPortHandler.isInBoundsY(valuePoints[j + 1]) || !mViewPortHandler.isInBoundsLeft(valuePoints[j]))           continue;
          BarEntry e=entries.get(j / 2);
          float[] vals=e.getVals();
          if (vals == null) {
            drawValue(c,e.getVal(),valuePoints[j],valuePoints[j + 1] + (e.getVal() >= 0 ? posOffset : negOffset),formatter);
          }
 else {
            float[] transformed=new float[vals.length * 2];
            int cnt=0;
            float add=e.getVal();
            for (int k=0; k < transformed.length; k+=2) {
              add-=vals[cnt];
              transformed[k + 1]=(vals[cnt] + add) * mAnimator.getPhaseY();
              cnt++;
            }
            trans.pointValuesToPixel(transformed);
            for (int k=0; k < transformed.length; k+=2) {
              drawValue(c,vals[k / 2],valuePoints[j],transformed[k + 1] + (vals[k / 2] >= 0 ? posOffset : negOffset),formatter);
            }
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
@Override public void drawValues(Canvas c){
  if (passesCheck()) {
    ArrayList<BarDataSet> dataSets=mChart.getBarData().getDataSets();
    float posOffset=0f;
    float negOffset=0f;
    boolean drawValueAboveBar=mChart.isDrawValueAboveBarEnabled();
    posOffset=(drawValueAboveBar ? -Utils.convertDpToPixel(5) : Utils.calcTextHeight(mValuePaint,"String_Node_Str") * 1.5f);
    negOffset=(drawValueAboveBar ? Utils.calcTextHeight(mValuePaint,"String_Node_Str") * 1.5f : -Utils.convertDpToPixel(5));
    for (int i=0; i < mChart.getBarData().getDataSetCount(); i++) {
      BarDataSet dataSet=dataSets.get(i);
      if (!dataSet.isDrawValuesEnabled())       continue;
      applyValueTextStyle(dataSet);
      ValueFormatter formatter=dataSet.getValueFormatter();
      Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
      ArrayList<BarEntry> entries=dataSet.getYVals();
      float[] valuePoints=getTransformedValues(trans,entries,i);
      if (!mChart.isDrawValuesForWholeStackEnabled()) {
        for (int j=0; j < valuePoints.length * mAnimator.getPhaseX(); j+=2) {
          if (!mViewPortHandler.isInBoundsRight(valuePoints[j]))           break;
          if (!mViewPortHandler.isInBoundsY(valuePoints[j + 1]) || !mViewPortHandler.isInBoundsLeft(valuePoints[j]))           continue;
          float val=entries.get(j / 2).getVal();
          drawValue(c,val,valuePoints[j],valuePoints[j + 1] + (val >= 0 ? posOffset : negOffset),formatter);
        }
      }
 else {
        for (int j=0; j < (valuePoints.length - 1) * mAnimator.getPhaseX(); j+=2) {
          BarEntry e=entries.get(j / 2);
          float[] vals=e.getVals();
          if (vals == null) {
            if (!mViewPortHandler.isInBoundsRight(valuePoints[j]))             break;
            if (!mViewPortHandler.isInBoundsY(valuePoints[j + 1]) || !mViewPortHandler.isInBoundsLeft(valuePoints[j]))             continue;
            drawValue(c,e.getVal(),valuePoints[j],valuePoints[j + 1] + (e.getVal() >= 0 ? posOffset : negOffset),formatter);
          }
 else {
            float[] transformed=new float[vals.length * 2];
            int cnt=0;
            float add=e.getVal();
            for (int k=0; k < transformed.length; k+=2) {
              add-=vals[cnt];
              transformed[k + 1]=(vals[cnt] + add) * mAnimator.getPhaseY();
              cnt++;
            }
            trans.pointValuesToPixel(transformed);
            for (int k=0; k < transformed.length; k+=2) {
              float x=valuePoints[j];
              float y=transformed[k + 1] + (vals[k / 2] >= 0 ? posOffset : negOffset);
              if (!mViewPortHandler.isInBoundsRight(x))               break;
              if (!mViewPortHandler.isInBoundsY(y) || !mViewPortHandler.isInBoundsLeft(x))               continue;
              drawValue(c,vals[k / 2],x,y,formatter);
            }
          }
        }
      }
    }
  }
}