Program: 18345
Project: 18345
Buggy source:
@Override public void drawHighlighted(Canvas c,Highlight[] indices){
  int setCount=mChart.getBarData().getDataSetCount();
  for (int i=0; i < indices.length; i++) {
    Highlight h=indices[i];
    int index=h.getXIndex();
    int dataSetIndex=h.getDataSetIndex();
    BarDataSet set=mChart.getBarData().getDataSetByIndex(dataSetIndex);
    if (set == null || !set.isHighlightEnabled())     continue;
    float barspaceHalf=set.getBarSpace() / 2f;
    Transformer trans=mChart.getTransformer(set.getAxisDependency());
    mHighlightPaint.setColor(set.getHighLightColor());
    mHighlightPaint.setAlpha(set.getHighLightAlpha());
    if (index >= 0 && index < (mChart.getXChartMax() * mAnimator.getPhaseX()) / setCount) {
      BarEntry e=set.getEntryForXIndex(index);
      if (e == null || e.getXIndex() != index)       continue;
      float groupspace=mChart.getBarData().getGroupSpace();
      boolean isStack=h.getStackIndex() < 0 ? false : true;
      float x=index * setCount + dataSetIndex + groupspace / 2f + groupspace * index;
      final float y1;
      final float y2;
      if (isStack) {
        y1=h.getRange().from;
        y2=h.getRange().to * mAnimator.getPhaseY();
      }
 else {
        y1=e.getVal();
        y2=0.f;
      }
      prepareBarHighlight(x,y1,y2,barspaceHalf,trans);
      c.drawRect(mBarRect,mHighlightPaint);
      if (mChart.isDrawHighlightArrowEnabled()) {
        mHighlightPaint.setAlpha(255);
        float offsetY=mAnimator.getPhaseY() * 0.07f;
        float[] values=new float[9];
        trans.getPixelToValueMatrix().getValues(values);
        final float xToYRel=Math.abs(values[Matrix.MSCALE_Y] / values[Matrix.MSCALE_X]);
        final float arrowWidth=set.getBarSpace() / 2.f;
        final float arrowHeight=arrowWidth * xToYRel;
        final float yArrow=y1 > -y2 ? y1 : y1;
        Path arrow=new Path();
        arrow.moveTo(x + 0.4f,yArrow + offsetY);
        arrow.lineTo(x + 0.4f + arrowWidth,yArrow + offsetY - arrowHeight);
        arrow.lineTo(x + 0.4f + arrowWidth,yArrow + offsetY + arrowHeight);
        trans.pathValueToPixel(arrow);
        c.drawPath(arrow,mHighlightPaint);
      }
    }
  }
}

Fixed version (ground truth):
@Override public void drawHighlighted(Canvas c,Highlight[] indices){
  int setCount=mChart.getBarData().getDataSetCount();
  for (int i=0; i < indices.length; i++) {
    Highlight h=indices[i];
    int index=h.getXIndex();
    int dataSetIndex=h.getDataSetIndex();
    BarDataSet set=mChart.getBarData().getDataSetByIndex(dataSetIndex);
    if (set == null || !set.isHighlightEnabled())     continue;
    float barspaceHalf=set.getBarSpace() / 2f;
    Transformer trans=mChart.getTransformer(set.getAxisDependency());
    mHighlightPaint.setColor(set.getHighLightColor());
    mHighlightPaint.setAlpha(set.getHighLightAlpha());
    if (index >= 0 && index < (mChart.getXChartMax() * mAnimator.getPhaseX()) / setCount) {
      BarEntry e=set.getEntryForXIndex(index);
      if (e == null || e.getXIndex() != index)       continue;
      float groupspace=mChart.getBarData().getGroupSpace();
      boolean isStack=h.getStackIndex() < 0 ? false : true;
      float x=index * setCount + dataSetIndex + groupspace / 2f + groupspace * index;
      final float y1;
      final float y2;
      if (isStack) {
        y1=h.getRange().from;
        y2=h.getRange().to;
      }
 else {
        y1=e.getVal();
        y2=0.f;
      }
      prepareBarHighlight(x,y1,y2,barspaceHalf,trans);
      c.drawRect(mBarRect,mHighlightPaint);
      if (mChart.isDrawHighlightArrowEnabled()) {
        mHighlightPaint.setAlpha(255);
        float offsetY=mAnimator.getPhaseY() * 0.07f;
        float[] values=new float[9];
        trans.getPixelToValueMatrix().getValues(values);
        final float xToYRel=Math.abs(values[Matrix.MSCALE_Y] / values[Matrix.MSCALE_X]);
        final float arrowWidth=set.getBarSpace() / 2.f;
        final float arrowHeight=arrowWidth * xToYRel;
        final float yArrow=(y1 > -y2 ? y1 : y1) * mAnimator.getPhaseY();
        Path arrow=new Path();
        arrow.moveTo(x + 0.4f,yArrow + offsetY);
        arrow.lineTo(x + 0.4f + arrowWidth,yArrow + offsetY - arrowHeight);
        arrow.lineTo(x + 0.4f + arrowWidth,yArrow + offsetY + arrowHeight);
        trans.pathValueToPixel(arrow);
        c.drawPath(arrow,mHighlightPaint);
      }
    }
  }
}