Program: 9417
Project: 9417
Buggy source:
/** 
 * Run without using System.exit(..), putting all messages in holder: <ul> <li>ERROR: compiler error</li> <li>WARNING: compiler warning</li> <li>FAIL: command error (bad arguments, exception thrown)</li> </ul> This handles incremental behavior: <ul> <li>If args include "-incremental", repeat for every input char until 'q' is entered.<li> <li>If args include "-incrementalTagFile {file}", repeat every time we detect that {file} modification time has changed. </li> <li>Either way, list files recompiled each time if args includes "-verbose".</li> <li>Exit when the commmand/compiler throws any Throwable.</li> </ul> When complete, this contains all the messages of the final run of the command and/or any FAIL messages produced in running the command, including any Throwable thrown by the command itself.
 * @param args the String[] command line for the compiler
 * @param holder the MessageHandler sink for messages.
 */
public void run(String[] args,IMessageHolder holder){
  if (LangUtil.isEmpty(args)) {
    args=new String[]{"String_Node_Str"};
  }
 else   if (controller.running()) {
    fail(holder,"String_Node_Str" + controller,null);
    return;
  }
  args=controller.init(args,holder);
  if (0 < holder.numMessages(IMessage.ERROR,true)) {
    return;
  }
  ICommand command=ReflectionFactory.makeCommand(commandName,holder);
  if (0 < holder.numMessages(IMessage.ERROR,true)) {
    return;
  }
  try {
    outer:     while (true) {
      boolean passed=command.runCommand(args,holder);
      if (report(passed,holder) && controller.incremental()) {
        while (controller.doRepeatCommand(command)) {
          holder.clearMessages();
          if (controller.buildFresh()) {
            continue outer;
          }
 else {
            passed=command.repeatCommand(holder);
          }
          if (!report(passed,holder)) {
            break;
          }
        }
      }
      break;
    }
  }
 catch (  AbortException ae) {
    if (ae.isSilent()) {
      quit();
    }
 else {
      IMessage message=ae.getIMessage();
      Throwable thrown=ae.getThrown();
      if (null == thrown) {
        if (null != message) {
          holder.handleMessage(message);
        }
 else {
          fail(holder,"String_Node_Str",ae);
        }
      }
 else       if (null == message) {
        fail(holder,"String_Node_Str",thrown);
      }
 else {
        String mssg=MessageUtil.MESSAGE_MOST.renderToString(message);
        fail(holder,mssg,thrown);
      }
    }
  }
catch (  Throwable t) {
    fail(holder,"String_Node_Str",t);
  }
}

Fixed version (ground truth):
/** 
 * Run without using System.exit(..), putting all messages in holder: <ul> <li>ERROR: compiler error</li> <li>WARNING: compiler warning</li> <li>FAIL: command error (bad arguments, exception thrown)</li> </ul> This handles incremental behavior: <ul> <li>If args include "-incremental", repeat for every input char until 'q' is entered.<li> <li>If args include "-incrementalTagFile {file}", repeat every time we detect that {file} modification time has changed. </li> <li>Either way, list files recompiled each time if args includes "-verbose".</li> <li>Exit when the commmand/compiler throws any Throwable.</li> </ul> When complete, this contains all the messages of the final run of the command and/or any FAIL messages produced in running the command, including any Throwable thrown by the command itself.
 * @param args the String[] command line for the compiler
 * @param holder the MessageHandler sink for messages.
 */
public void run(String[] args,IMessageHolder holder){
  Dump.saveMessageHolder(holder);
  if (LangUtil.isEmpty(args)) {
    args=new String[]{"String_Node_Str"};
  }
 else   if (controller.running()) {
    fail(holder,"String_Node_Str" + controller,null);
    return;
  }
  args=controller.init(args,holder);
  if (0 < holder.numMessages(IMessage.ERROR,true)) {
    return;
  }
  ICommand command=ReflectionFactory.makeCommand(commandName,holder);
  if (0 < holder.numMessages(IMessage.ERROR,true)) {
    return;
  }
  try {
    outer:     while (true) {
      boolean passed=command.runCommand(args,holder);
      if (report(passed,holder) && controller.incremental()) {
        while (controller.doRepeatCommand(command)) {
          holder.clearMessages();
          if (controller.buildFresh()) {
            continue outer;
          }
 else {
            passed=command.repeatCommand(holder);
          }
          if (!report(passed,holder)) {
            break;
          }
        }
      }
      break;
    }
  }
 catch (  AbortException ae) {
    if (ae.isSilent()) {
      quit();
    }
 else {
      IMessage message=ae.getIMessage();
      Throwable thrown=ae.getThrown();
      if (null == thrown) {
        if (null != message) {
          holder.handleMessage(message);
        }
 else {
          fail(holder,"String_Node_Str",ae);
        }
      }
 else       if (null == message) {
        fail(holder,"String_Node_Str",thrown);
      }
 else {
        String mssg=MessageUtil.MESSAGE_MOST.renderToString(message);
        fail(holder,mssg,thrown);
      }
    }
  }
catch (  Throwable t) {
    fail(holder,"String_Node_Str",t);
  }
}