Program: 9626
Project: 9626
Buggy source:
/** 
 * Execute in a separate VM. Differences from normal same-VM execution: <ul> <li>ignores any message holder {class} set</li> <li>No resource-copying between interative runs</li> <li>failonerror fails when process interface fails  to return negative values</li> </ul>
 * @param args String[] of the complete compiler command to execute
 * @see DefaultCompilerAdapter#executeExternalCompile(String[],int)
 * @throws BuildException if ajc aborts (negative value)or if failonerror and there were compile errors.
 */
protected void executeInOtherVM(String[] args){
  if (null != messageHolder) {
    log("String_Node_Str" + messageHolder.getClass().getName(),Project.MSG_WARN);
  }
  CommandlineJava javaCmd=new CommandlineJava();
  javaCmd.setClassname(org.aspectj.tools.ajc.Main.class.getName());
  final Path vmClasspath=javaCmd.createClasspath(getProject());
  if ((null != forkclasspath) && (0 != forkclasspath.size())) {
    vmClasspath.addExisting(forkclasspath);
  }
 else {
    File aspectjtools=findAspectjtoolsJar();
    if (null != aspectjtools) {
      vmClasspath.createPathElement().setLocation(aspectjtools);
    }
  }
  if (null != maxMem) {
    javaCmd.setMaxmemory(maxMem);
  }
  File tempFile=null;
  int numArgs=args.length;
  args=GuardedCommand.limitTo(args,MAX_COMMANDLINE,getLocation());
  if (args.length != numArgs) {
    tempFile=new File(args[1]);
  }
  try {
    String[] javaArgs=javaCmd.getCommandline();
    String[] both=new String[javaArgs.length + args.length];
    System.arraycopy(javaArgs,0,both,0,javaArgs.length);
    System.arraycopy(args,0,both,javaArgs.length,args.length);
    if (both[0].endsWith("String_Node_Str")) {
      String path=both[0];
      path=path.substring(0,path.length() - 4);
      path=path + "String_Node_Str";
      File javaw=new File(path);
      if (javaw.canRead() && javaw.isFile()) {
        both[0]=path;
      }
    }
    if (verbose) {
      log("String_Node_Str" + Arrays.asList(both));
    }
    int result=execInOtherVM(both);
    if (0 > result) {
      throw new BuildException("String_Node_Str" + result + "String_Node_Str");
    }
 else     if (failonerror && (0 < result)) {
      throw new BuildException("String_Node_Str" + result);
    }
    doCompletionTasks();
  }
  finally {
    if (null != tempFile) {
      tempFile.delete();
    }
  }
}

Fixed version (ground truth):
/** 
 * Execute in a separate VM. Differences from normal same-VM execution: <ul> <li>ignores any message holder {class} set</li> <li>No resource-copying between interative runs</li> <li>failonerror fails when process interface fails  to return negative values</li> </ul>
 * @param args String[] of the complete compiler command to execute
 * @see DefaultCompilerAdapter#executeExternalCompile(String[],int)
 * @throws BuildException if ajc aborts (negative value)or if failonerror and there were compile errors.
 */
protected void executeInOtherVM(String[] args){
  if (null != messageHolder) {
    log("String_Node_Str" + messageHolder.getClass().getName(),Project.MSG_WARN);
  }
  CommandlineJava javaCmd=new CommandlineJava();
  javaCmd.setClassname(org.aspectj.tools.ajc.Main.class.getName());
  final Path vmClasspath=javaCmd.createClasspath(getProject());
{
    File aspectjtools=null;
    int vmClasspathSize=vmClasspath.size();
    if ((null != forkclasspath) && (0 != forkclasspath.size())) {
      vmClasspath.addExisting(forkclasspath);
    }
 else {
      aspectjtools=findAspectjtoolsJar();
      if (null != aspectjtools) {
        vmClasspath.createPathElement().setLocation(aspectjtools);
      }
    }
    int newVmClasspathSize=vmClasspath.size();
    if (vmClasspathSize == newVmClasspathSize) {
      String m="String_Node_Str";
      if (null != aspectjtools) {
        m+="String_Node_Str" + aspectjtools.toString();
      }
 else       if (null != forkclasspath) {
        m+="String_Node_Str" + forkclasspath.toString();
      }
 else {
        m+="String_Node_Str";
      }
      throw new BuildException(m);
    }
  }
  if (null != maxMem) {
    javaCmd.setMaxmemory(maxMem);
  }
  File tempFile=null;
  int numArgs=args.length;
  args=GuardedCommand.limitTo(args,MAX_COMMANDLINE,getLocation());
  if (args.length != numArgs) {
    tempFile=new File(args[1]);
  }
  try {
    String[] javaArgs=javaCmd.getCommandline();
    String[] both=new String[javaArgs.length + args.length];
    System.arraycopy(javaArgs,0,both,0,javaArgs.length);
    System.arraycopy(args,0,both,javaArgs.length,args.length);
    if (both[0].endsWith("String_Node_Str")) {
      String path=both[0];
      path=path.substring(0,path.length() - 4);
      path=path + "String_Node_Str";
      File javaw=new File(path);
      if (javaw.canRead() && javaw.isFile()) {
        both[0]=path;
      }
    }
    if (verbose) {
      log("String_Node_Str" + Arrays.asList(both));
    }
    int result=execInOtherVM(both);
    if (0 > result) {
      throw new BuildException("String_Node_Str" + result + "String_Node_Str");
    }
 else     if (failonerror && (0 < result)) {
      throw new BuildException("String_Node_Str" + result);
    }
    doCompletionTasks();
  }
  finally {
    if (null != tempFile) {
      tempFile.delete();
    }
  }
}