Program: 180725
Project: 180725
Buggy source:
private List<CandidateProgram<Action>> generatePopulation(){
  Random rGen=new Random();
  ArrayList<ArrayList<String>> storage=new ArrayList<ArrayList<String>>();
  FullInitialiser<Action> f=new FullInitialiser<Action>(model);
  List<CandidateProgram<Action>> firstPass=f.getInitialPopulation();
  for (  CandidateProgram<Action> c : firstPass) {
    AntRepresentation b=(AntRepresentation)semMod.codeToBehaviour(c.getRootNode());
    if (!b.isConstant()) {
      storage.add(b.getAntRepresentation());
    }
  }
  ArrayList<String> result;
  String oB=("String_Node_Str");
  String cB=("String_Node_Str");
  int partSize=10;
  while (storage.size() < model.getPopulationSize()) {
    int cFunc=rGen.nextInt(model.getFunctions().size());
    result=new ArrayList<String>();
    if (cFunc == 0) {
      ArrayList<String> part1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> part2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(part1) > partSize) {
        part1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(part2) > partSize) {
        part2=storage.get(rGen.nextInt(storage.size()));
      }
      result.add(oB);
      for (      String p : part1) {
        result.add(p);
      }
      result.add(cB);
      result.add(oB);
      for (      String p : part2) {
        result.add(p);
      }
      result.add(cB);
    }
 else     if (cFunc == 1) {
      ArrayList<String> p1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> p2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p1) > partSize) {
        p1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(p2) > partSize) {
        p2=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(p1,p2,"String_Node_Str");
    }
 else     if (cFunc == 2) {
      ArrayList<String> p1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> p2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p1) > partSize) {
        p1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(p2) > partSize) {
        p2=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(p1,p2,"String_Node_Str");
      ArrayList<String> p3=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p3) > partSize) {
        p3=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(result,p3,"String_Node_Str");
    }
    result=semMod.condenseAntRep(result);
    if (!storage.contains(result) && result.size() > 2) {
      storage.add(result);
    }
  }
  List<CandidateProgram<Action>> firstGen=new ArrayList<CandidateProgram<Action>>();
  int i=1;
  for (  ArrayList<String> toProg : storage) {
    Node<Action> holder=semMod.behaviourToCode(new AntRepresentation(toProg));
    firstGen.add(new CandidateProgram<Action>(holder,model));
    i++;
  }
  storage=null;
  return firstGen;
}

Fixed version (ground truth):
private List<CandidateProgram<Object>> generatePopulation(){
  Random rGen=new Random();
  ArrayList<ArrayList<String>> storage=new ArrayList<ArrayList<String>>();
  FullInitialiser<Object> f=new FullInitialiser<Object>(model);
  List<CandidateProgram<Object>> firstPass=f.getInitialPopulation();
  for (  CandidateProgram<Object> c : firstPass) {
    AntRepresentation b=(AntRepresentation)semMod.codeToBehaviour(c.getRootNode());
    if (!b.isConstant()) {
      storage.add(b.getAntRepresentation());
    }
  }
  ArrayList<String> result;
  String oB=("String_Node_Str");
  String cB=("String_Node_Str");
  int partSize=10;
  while (storage.size() < model.getPopulationSize()) {
    int cFunc=rGen.nextInt(model.getFunctions().size());
    result=new ArrayList<String>();
    if (cFunc == 0) {
      ArrayList<String> part1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> part2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(part1) > partSize) {
        part1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(part2) > partSize) {
        part2=storage.get(rGen.nextInt(storage.size()));
      }
      result.add(oB);
      for (      String p : part1) {
        result.add(p);
      }
      result.add(cB);
      result.add(oB);
      for (      String p : part2) {
        result.add(p);
      }
      result.add(cB);
    }
 else     if (cFunc == 1) {
      ArrayList<String> p1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> p2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p1) > partSize) {
        p1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(p2) > partSize) {
        p2=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(p1,p2,"String_Node_Str");
    }
 else     if (cFunc == 2) {
      ArrayList<String> p1=storage.get(rGen.nextInt(storage.size()));
      ArrayList<String> p2=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p1) > partSize) {
        p1=storage.get(rGen.nextInt(storage.size()));
      }
      while (getMoves(p2) > partSize) {
        p2=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(p1,p2,"String_Node_Str");
      ArrayList<String> p3=storage.get(rGen.nextInt(storage.size()));
      while (getMoves(p3) > partSize) {
        p3=storage.get(rGen.nextInt(storage.size()));
      }
      result=semMod.joinPaths(result,p3,"String_Node_Str");
    }
    result=semMod.condenseAntRep(result);
    if (!storage.contains(result) && result.size() > 2) {
      storage.add(result);
    }
  }
  List<CandidateProgram<Object>> firstGen=new ArrayList<CandidateProgram<Object>>();
  int i=1;
  for (  ArrayList<String> toProg : storage) {
    Node<Object> holder=semMod.behaviourToCode(new AntRepresentation(toProg));
    firstGen.add(new CandidateProgram<Object>(holder,model));
    i++;
  }
  storage=null;
  return firstGen;
}