Program: 16709
Project: 16709
Buggy source:
private List<String> processSingleLine(String line){
  List<String> data=new ArrayList<String>();
  if (line.trim().length() == 0) {
    return data;
  }
  if (line.trim().length() == 1) {
    if (line.startsWith(STRING_LIMIT))     return data;
  }
  boolean inString=false;
  boolean inS1=false;
  boolean inS2=false;
  String word="String_Node_Str";
  for (int i=0; i < line.length(); i++) {
    Character c=line.charAt(i);
    Character nextC=null;
    if (i < line.length() - 1)     nextC=line.charAt(i + 1);
    if (c == ' ') {
      if (!inString) {
        if (!word.equals("String_Node_Str"))         data.add(word.trim());
        word="String_Node_Str";
      }
 else {
        word+=c;
      }
    }
 else     if (c == S1) {
      if (inString) {
        boolean wordEnd=false;
        if (!inS2) {
          if (nextC != null) {
            if (Character.isWhitespace(nextC)) {
              i++;
              wordEnd=true;
            }
          }
        }
        if (wordEnd) {
          if (!word.equals("String_Node_Str"))           data.add(word.trim());
          word="String_Node_Str";
          inString=false;
          inS1=false;
        }
 else {
          word+=c;
        }
      }
 else {
        inString=true;
        inS1=true;
      }
    }
 else     if (c == S2) {
      if (inString) {
        boolean wordEnd=false;
        if (!inS1) {
          if (nextC != null) {
            if (Character.isWhitespace(nextC)) {
              i++;
              wordEnd=true;
            }
          }
        }
        if (wordEnd) {
          if (!word.equals("String_Node_Str"))           data.add(word.trim());
          word="String_Node_Str";
          inString=false;
          inS2=false;
        }
 else {
          word+=c;
        }
      }
 else {
        inString=true;
        inS2=true;
      }
    }
 else {
      word+=c;
    }
  }
  if (!word.trim().equals("String_Node_Str"))   data.add(word);
  return data;
}

Fixed version (ground truth):
private List<String> processSingleLine(String line){
  List<String> data=new ArrayList<String>();
  if (line.trim().length() == 0) {
    return data;
  }
  if (line.trim().length() == 1) {
    if (line.startsWith(STRING_LIMIT))     return data;
  }
  boolean inString=false;
  boolean inS1=false;
  boolean inS2=false;
  String word="String_Node_Str";
  for (int i=0; i < line.length(); i++) {
    Character c=line.charAt(i);
    Character nextC=null;
    if (i < line.length() - 1)     nextC=line.charAt(i + 1);
    Character lastC=null;
    if (i > 0)     lastC=line.charAt(i - 1);
    if (c == ' ') {
      if (!inString) {
        if (!word.equals("String_Node_Str"))         data.add(word.trim());
        word="String_Node_Str";
      }
 else {
        word+=c;
      }
    }
 else     if (c == S1) {
      if (inString) {
        boolean wordEnd=false;
        if (!inS2) {
          if (nextC != null) {
            if (Character.isWhitespace(nextC)) {
              i++;
              wordEnd=true;
            }
          }
        }
        if (wordEnd) {
          if (!word.equals("String_Node_Str"))           data.add(word.trim());
          word="String_Node_Str";
          inString=false;
          inS1=false;
        }
 else {
          word+=c;
        }
      }
 else       if (lastC == null || lastC == ' ') {
        inString=true;
        inS1=true;
      }
 else {
        word+=c;
      }
    }
 else     if (c == S2) {
      if (inString) {
        boolean wordEnd=false;
        if (!inS1) {
          if (nextC != null) {
            if (Character.isWhitespace(nextC)) {
              i++;
              wordEnd=true;
            }
          }
        }
        if (wordEnd) {
          if (!word.equals("String_Node_Str"))           data.add(word.trim());
          word="String_Node_Str";
          inString=false;
          inS2=false;
        }
 else {
          word+=c;
        }
      }
 else       if (lastC == null || lastC == ' ') {
        inString=true;
        inS2=true;
      }
 else {
        word+=c;
      }
    }
 else {
      word+=c;
    }
  }
  if (!word.trim().equals("String_Node_Str"))   data.add(word);
  return data;
}