Program: 91796
Project: 91796
Buggy source:
/** 
 * Parse annotation file for a dso given a symbol
 * @param monitor monitor
 * @param input annotation file input stream
 * @param workingDir working directory configuration
 * @param currentDso dso
 * @param currentSym symbol
 */
public static void parseAnnotation(IProgressMonitor monitor,BufferedReader input,IPath workingDir,PMDso currentDso,PMSymbol currentSym){
  if (monitor != null && monitor.isCanceled()) {
    return;
  }
  boolean grabBlock=false;
  boolean blockStarted=false;
  String dsoName, lineRef;
  String line=null;
  String items[];
  float percent;
  try {
    while ((line=input.readLine()) != null) {
      if (line.startsWith("String_Node_Str")) {
        grabBlock=true;
        dsoName=line.replace("String_Node_Str","String_Node_Str");
        blockStarted=false;
        if ((workingDir != null) && (dsoName.startsWith("String_Node_Str"))) {
          if (workingDir.toOSString().endsWith("String_Node_Str")) {
            dsoName=workingDir.toOSString() + dsoName.substring(2);
          }
 else {
            dsoName=workingDir.toOSString() + dsoName.substring(1);
          }
        }
        currentDso.setPath(dsoName);
      }
 else       if (line.startsWith("String_Node_Str")) {
        if (blockStarted) {
          blockStarted=false;
          grabBlock=false;
        }
 else {
          blockStarted=true;
        }
      }
 else       if (grabBlock && blockStarted) {
        items=line.trim().split("String_Node_Str");
        if (items.length != 2) {
          continue;
        }
        percent=Float.parseFloat(items[0]);
        lineRef=items[1];
        items=lineRef.split("String_Node_Str");
        if (currentDso == null) {
          break;
        }
 else {
          int lineNum=-1;
          try {
            lineNum=Integer.parseInt(items[1]);
          }
 catch (          NumberFormatException e) {
          }
          currentSym.addPercent(lineNum,percent);
          if (currentSym.getParent().getName().equals(PerfPlugin.STRINGS_UnfiledSymbols)) {
            currentSym.getParent().removeChild(currentSym);
            currentDso.getFile(items[0]).addChild(currentSym);
          }
 else           if (!((PMFile)currentSym.getParent()).getPath().equals(items[0])) {
            currentSym.markConflict();
            currentSym.getParent().removeChild(currentSym);
            currentDso.getFile(PerfPlugin.STRINGS_MultipleFilesForSymbol).addChild(currentSym);
          }
        }
      }
    }
  }
 catch (  IOException e) {
    logException(e);
  }
}

Fixed version (ground truth):
/** 
 * Parse annotation file for a dso given a symbol
 * @param monitor monitor
 * @param input annotation file input stream
 * @param workingDir working directory configuration
 * @param currentDso dso
 * @param currentSym symbol
 */
public static void parseAnnotation(IProgressMonitor monitor,BufferedReader input,IPath workingDir,PMDso currentDso,PMSymbol currentSym){
  if (monitor != null && monitor.isCanceled()) {
    return;
  }
  boolean grabBlock=false;
  boolean blockStarted=false;
  String dsoName, lineRef;
  String line=null;
  String items[];
  float percent;
  try {
    while ((line=input.readLine()) != null) {
      if (line.startsWith("String_Node_Str")) {
        grabBlock=true;
        dsoName=line.replace("String_Node_Str","String_Node_Str");
        blockStarted=false;
        if ((workingDir != null) && (dsoName.startsWith("String_Node_Str"))) {
          if (workingDir.toOSString().endsWith("String_Node_Str")) {
            dsoName=workingDir.toOSString() + dsoName.substring(2);
          }
 else {
            dsoName=workingDir.toOSString() + dsoName.substring(1);
          }
        }
        currentDso.setPath(dsoName);
      }
 else       if (line.startsWith("String_Node_Str")) {
        if (blockStarted) {
          blockStarted=false;
          grabBlock=false;
        }
 else {
          blockStarted=true;
        }
      }
 else       if (grabBlock && blockStarted) {
        items=line.trim().split("String_Node_Str");
        if (items.length != 2) {
          continue;
        }
        percent=Float.parseFloat(items[0]);
        lineRef=items[1];
        items=lineRef.split("String_Node_Str");
        if (currentDso == null) {
          break;
        }
 else {
          int lineNum=-1;
          try {
            if (items.length > 1) {
              lineNum=Integer.parseInt(items[1]);
            }
          }
 catch (          NumberFormatException e) {
          }
          currentSym.addPercent(lineNum,percent);
          if (currentSym.getParent().getName().equals(PerfPlugin.STRINGS_UnfiledSymbols)) {
            currentSym.getParent().removeChild(currentSym);
            currentDso.getFile(items[0]).addChild(currentSym);
          }
 else           if (!((PMFile)currentSym.getParent()).getPath().equals(items[0])) {
            currentSym.markConflict();
            currentSym.getParent().removeChild(currentSym);
            currentDso.getFile(PerfPlugin.STRINGS_MultipleFilesForSymbol).addChild(currentSym);
          }
        }
      }
    }
  }
 catch (  IOException e) {
    logException(e);
  }
}