Program: 54961
Project: 54961
Buggy source:
/** 
 * This method will draw the performance information into the canvas
 * @param c				canvas of the surface view
 * @param frameRate 	current frame rate (FPS)
 * @param load			current load (percentage [0..1])
 * @param averageSignalStrength		average magnitude of the signal in the selected channel
 */
private void drawPerformanceInfo(Canvas c,int frameRate,double load,float averageSignalStrength){
  Rect bounds=new Rect();
  String text;
  float yPos=height * 0.01f;
  float rightBorder=width * 0.99f;
  if (demodulationEnabled) {
    text=String.format("String_Node_Str",channelFrequency / 1000000f);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (demodulationEnabled) {
    text=String.format("String_Node_Str",averageSignalStrength);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    float indicatorWidth=width / 10;
    float indicatorPosX=rightBorder - indicatorWidth;
    float indicatorPosY=yPos + bounds.height();
    float squelchTickPos=(squelch - minDB) / (maxDB - minDB) * indicatorWidth;
    float signalWidth=(averageSignalStrength - minDB) / (maxDB - minDB) * indicatorWidth;
    if (signalWidth < 0)     signalWidth=0;
    if (signalWidth > indicatorWidth)     signalWidth=indicatorWidth;
    c.drawRect(indicatorPosX,yPos + bounds.height() * 0.1f,indicatorPosX + signalWidth,indicatorPosY,squelchPaint);
    c.drawLine(indicatorPosX,indicatorPosY,indicatorPosX,yPos,textPaint);
    c.drawLine(rightBorder,indicatorPosY,rightBorder,yPos,textPaint);
    c.drawLine(indicatorPosX,indicatorPosY,rightBorder,indicatorPosY,textPaint);
    c.drawLine(indicatorPosX + squelchTickPos,indicatorPosY + 2,indicatorPosX + squelchTickPos,yPos + bounds.height() * 0.5f,textPaint);
    c.drawText(text,indicatorPosX - bounds.width() * 1.1f,indicatorPosY,textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (recordingEnabled) {
    text=String.format("String_Node_Str",source.getFrequency() / 1000000f,source.getSampleRate() / 1000000f);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    defaultPaint.setColor(Color.RED);
    c.drawCircle(rightBorder - bounds.width() - (bounds.height() / 2) * 1.3f,yPos + bounds.height() / 2,bounds.height() / 2,defaultPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (showDebugInformation) {
    text=frameRate + "String_Node_Str";
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
    text=String.format("String_Node_Str",load * 100);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
}

Fixed version (ground truth):
/** 
 * This method will draw the performance information into the canvas
 * @param c				canvas of the surface view
 * @param frameRate 	current frame rate (FPS)
 * @param load			current load (percentage [0..1])
 * @param averageSignalStrength		average magnitude of the signal in the selected channel
 */
private void drawPerformanceInfo(Canvas c,int frameRate,double load,float averageSignalStrength){
  Rect bounds=new Rect();
  String text;
  float yPos=height * 0.01f;
  float rightBorder=width * 0.99f;
  if (source != null) {
    text=source.getName();
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
    if (source instanceof HackrfSource) {
      text=String.format("String_Node_Str",((HackrfSource)source).getFrequencyShift() / 1000000f);
      textSmallPaint.getTextBounds(text,0,text.length(),bounds);
      c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
      yPos+=bounds.height() * 1.1f;
    }
    if (source instanceof RtlsdrSource) {
      text=String.format("String_Node_Str",((RtlsdrSource)source).getFrequencyShift() / 1000000f);
      textSmallPaint.getTextBounds(text,0,text.length(),bounds);
      c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
      yPos+=bounds.height() * 1.1f;
      text="String_Node_Str" + ((RtlsdrSource)source).getFrequencyCorrection();
      textSmallPaint.getTextBounds(text,0,text.length(),bounds);
      c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
      yPos+=bounds.height() * 1.1f;
    }
  }
  if (demodulationEnabled) {
    text=String.format("String_Node_Str",channelFrequency / 1000000f);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (demodulationEnabled) {
    text=String.format("String_Node_Str",averageSignalStrength);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    float indicatorWidth=width / 10;
    float indicatorPosX=rightBorder - indicatorWidth;
    float indicatorPosY=yPos + bounds.height();
    float squelchTickPos=(squelch - minDB) / (maxDB - minDB) * indicatorWidth;
    float signalWidth=(averageSignalStrength - minDB) / (maxDB - minDB) * indicatorWidth;
    if (signalWidth < 0)     signalWidth=0;
    if (signalWidth > indicatorWidth)     signalWidth=indicatorWidth;
    c.drawRect(indicatorPosX,yPos + bounds.height() * 0.1f,indicatorPosX + signalWidth,indicatorPosY,squelchPaint);
    c.drawLine(indicatorPosX,indicatorPosY,indicatorPosX,yPos,textPaint);
    c.drawLine(rightBorder,indicatorPosY,rightBorder,yPos,textPaint);
    c.drawLine(indicatorPosX,indicatorPosY,rightBorder,indicatorPosY,textPaint);
    c.drawLine(indicatorPosX + squelchTickPos,indicatorPosY + 2,indicatorPosX + squelchTickPos,yPos + bounds.height() * 0.5f,textPaint);
    c.drawText(text,indicatorPosX - bounds.width() * 1.1f,indicatorPosY,textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (recordingEnabled) {
    text=String.format("String_Node_Str",source.getFrequency() / 1000000f,source.getSampleRate() / 1000000f);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    defaultPaint.setColor(Color.RED);
    c.drawCircle(rightBorder - bounds.width() - (bounds.height() / 2) * 1.3f,yPos + bounds.height() / 2,bounds.height() / 2,defaultPaint);
    yPos+=bounds.height() * 1.1f;
  }
  if (showDebugInformation) {
    text=frameRate + "String_Node_Str";
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
    text=String.format("String_Node_Str",load * 100);
    textSmallPaint.getTextBounds(text,0,text.length(),bounds);
    c.drawText(text,rightBorder - bounds.width(),yPos + bounds.height(),textSmallPaint);
    yPos+=bounds.height() * 1.1f;
  }
}