Program: 18385
Project: 18385
Buggy source:
@Override public void drawValues(Canvas c){
  if (passesCheck()) {
    List<BarDataSet> dataSets=mChart.getBarData().getDataSets();
    final float valueOffsetPlus=Utils.convertDpToPixel(5f);
    float posOffset=0f;
    float negOffset=0f;
    boolean drawValueAboveBar=mChart.isDrawValueAboveBarEnabled();
    if (drawValueAboveBar)     mValuePaint.setTextAlign(Align.LEFT);
 else     mValuePaint.setTextAlign(Align.RIGHT);
    for (int i=0; i < mChart.getBarData().getDataSetCount(); i++) {
      BarDataSet dataSet=dataSets.get(i);
      if (!dataSet.isDrawValuesEnabled())       continue;
      boolean isInverted=mChart.isInverted(dataSet.getAxisDependency());
      applyValueTextStyle(dataSet);
      mYOffset=Utils.calcTextHeight(mValuePaint,"String_Node_Str") / 2f;
      ValueFormatter formatter=dataSet.getValueFormatter();
      Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
      List<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.isInBoundsX(valuePoints[j]))           continue;
          if (!mViewPortHandler.isInBoundsTop(valuePoints[j + 1]))           break;
          if (!mViewPortHandler.isInBoundsBottom(valuePoints[j + 1]))           continue;
          float val=entries.get(j / 2).getVal();
          String valueText=formatter.getFormattedValue(val);
          float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
          posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
          negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
          if (isInverted) {
            posOffset=-posOffset - valueTextWidth;
            negOffset=-negOffset - valueTextWidth;
          }
          drawValue(c,valueText,valuePoints[j] + (val >= 0 ? posOffset : negOffset),valuePoints[j + 1]);
        }
      }
 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.isInBoundsX(valuePoints[j]))             continue;
            if (!mViewPortHandler.isInBoundsTop(valuePoints[j + 1]))             break;
            if (!mViewPortHandler.isInBoundsBottom(valuePoints[j + 1]))             continue;
            float val=e.getVal();
            String valueText=formatter.getFormattedValue(val);
            float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
            posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
            negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
            if (isInverted) {
              posOffset=-posOffset - valueTextWidth;
              negOffset=-negOffset - valueTextWidth;
            }
            drawValue(c,valueText,valuePoints[j] + (e.getVal() >= 0 ? posOffset : negOffset),valuePoints[j + 1]);
          }
 else {
            float[] transformed=new float[vals.length * 2];
            float allPos=e.getPositiveSum();
            float allNeg=e.getNegativeSum();
            for (int k=0, idx=0; k < transformed.length; k+=2, idx++) {
              float value=vals[idx];
              float y;
              if (value >= 0f) {
                allPos-=value;
                y=value + allPos;
              }
 else {
                allNeg-=Math.abs(value);
                y=value + allNeg;
              }
              transformed[k]=y * mAnimator.getPhaseY();
            }
            trans.pointValuesToPixel(transformed);
            for (int k=0; k < transformed.length; k+=2) {
              float val=vals[k / 2];
              String valueText=formatter.getFormattedValue(val);
              float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
              posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
              negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
              if (isInverted) {
                posOffset=-posOffset - valueTextWidth;
                negOffset=-negOffset - valueTextWidth;
              }
              float x=transformed[k] + (val >= 0 ? posOffset : negOffset);
              float y=valuePoints[j + 1];
              if (!mViewPortHandler.isInBoundsX(x))               continue;
              if (!mViewPortHandler.isInBoundsTop(y))               break;
              if (!mViewPortHandler.isInBoundsBottom(y))               continue;
              drawValue(c,valueText,x,y);
            }
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
@Override public void drawValues(Canvas c){
  if (passesCheck()) {
    List<BarDataSet> dataSets=mChart.getBarData().getDataSets();
    final float valueOffsetPlus=Utils.convertDpToPixel(5f);
    float posOffset=0f;
    float negOffset=0f;
    boolean drawValueAboveBar=mChart.isDrawValueAboveBarEnabled();
    if (drawValueAboveBar)     mValuePaint.setTextAlign(Align.LEFT);
 else     mValuePaint.setTextAlign(Align.RIGHT);
    for (int i=0; i < mChart.getBarData().getDataSetCount(); i++) {
      BarDataSet dataSet=dataSets.get(i);
      if (!dataSet.isDrawValuesEnabled())       continue;
      boolean isInverted=mChart.isInverted(dataSet.getAxisDependency());
      applyValueTextStyle(dataSet);
      mYOffset=Utils.calcTextHeight(mValuePaint,"String_Node_Str") / 2f;
      ValueFormatter formatter=dataSet.getValueFormatter();
      Transformer trans=mChart.getTransformer(dataSet.getAxisDependency());
      List<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.isInBoundsX(valuePoints[j]))           continue;
          if (!mViewPortHandler.isInBoundsTop(valuePoints[j + 1]))           break;
          if (!mViewPortHandler.isInBoundsBottom(valuePoints[j + 1]))           continue;
          float val=entries.get(j / 2).getVal();
          String valueText=formatter.getFormattedValue(val);
          float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
          posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
          negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
          if (isInverted) {
            posOffset=-posOffset - valueTextWidth;
            negOffset=-negOffset - valueTextWidth;
          }
          drawValue(c,valueText,valuePoints[j] + (val >= 0 ? posOffset : negOffset),valuePoints[j + 1]);
        }
      }
 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.isInBoundsX(valuePoints[j]))             continue;
            if (!mViewPortHandler.isInBoundsTop(valuePoints[j + 1]))             break;
            if (!mViewPortHandler.isInBoundsBottom(valuePoints[j + 1]))             continue;
            float val=e.getVal();
            String valueText=formatter.getFormattedValue(val);
            float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
            posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
            negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
            if (isInverted) {
              posOffset=-posOffset - valueTextWidth;
              negOffset=-negOffset - valueTextWidth;
            }
            drawValue(c,valueText,valuePoints[j] + (e.getVal() >= 0 ? posOffset : negOffset),valuePoints[j + 1]);
          }
 else {
            float[] transformed=new float[vals.length * 2];
            float posY=0f;
            float negY=0f;
            for (int k=0, idx=0; k < transformed.length; k+=2, idx++) {
              float value=vals[idx];
              float y;
              if (value >= 0f) {
                posY+=value;
                y=posY;
              }
 else {
                negY+=value;
                y=negY;
              }
              transformed[k]=y * mAnimator.getPhaseY();
            }
            trans.pointValuesToPixel(transformed);
            for (int k=0; k < transformed.length; k+=2) {
              float val=vals[k / 2];
              String valueText=formatter.getFormattedValue(val);
              float valueTextWidth=Utils.calcTextWidth(mValuePaint,valueText);
              posOffset=(drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus));
              negOffset=(drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus);
              if (isInverted) {
                posOffset=-posOffset - valueTextWidth;
                negOffset=-negOffset - valueTextWidth;
              }
              float x=transformed[k] + (val >= 0 ? posOffset : negOffset);
              float y=valuePoints[j + 1];
              if (!mViewPortHandler.isInBoundsX(x))               continue;
              if (!mViewPortHandler.isInBoundsTop(y))               break;
              if (!mViewPortHandler.isInBoundsBottom(y))               continue;
              drawValue(c,valueText,x,y);
            }
          }
        }
      }
    }
  }
}