Program: 75664
Project: 75664
Buggy source:
/** 
 * Generate code for a method.
 * @param method The method.
 * @return The code.
 */
private String _generateMethod(SootMethod method){
  byte indentLevel;
  if (method.isConcrete() && !(method.isNative())) {
    StringBuffer code=new StringBuffer();
    String description="String_Node_Str" + method.getSubSignature();
    code.append(_comment(description));
    JimpleBody body=(JimpleBody)(method.retrieveActiveBody());
    CSwitch visitor=new CSwitch(_context);
    Type returnType=method.getReturnType();
    visitor.returnType=returnType;
    code.append(CNames.typeNameOf(returnType));
    _updateRequiredTypes(returnType);
    code.append("String_Node_Str");
    code.append(CNames.functionNameOf(method));
    code.append("String_Node_Str");
    int parameterIndex;
    int parameterCount=0;
    String thisLocalName=null;
    HashSet parameterAndThisLocals=new HashSet();
    if (!method.isStatic()) {
      parameterAndThisLocals.add(body.getThisLocal());
      thisLocalName=CNames.localNameOf(body.getThisLocal());
      code.append(CNames.instanceNameOf(method.getDeclaringClass()) + "String_Node_Str" + thisLocalName);
      parameterCount++;
    }
    for (parameterIndex=0; parameterIndex < method.getParameterCount(); parameterIndex++) {
      if (parameterCount++ > 0)       code.append("String_Node_Str");
      Local local=body.getParameterLocal(parameterIndex);
      parameterAndThisLocals.add(local);
      Type parameterType=local.getType();
      code.append(CNames.typeNameOf(parameterType) + "String_Node_Str" + CNames.localNameOf(local));
      _updateRequiredTypes(parameterType);
    }
    code.append("String_Node_Str");
    Iterator locals=body.getLocals().iterator();
    while (locals.hasNext()) {
      Local nextLocal=(Local)(locals.next());
      if (!parameterAndThisLocals.contains(nextLocal)) {
        code.append(_indent(1));
        Type localType=nextLocal.getType();
        code.append(CNames.typeNameOf(localType));
        code.append("String_Node_Str" + CNames.localNameOf(nextLocal) + "String_Node_Str");
        _updateRequiredTypes(localType);
      }
    }
    ExceptionTracker tracker=new ExceptionTracker();
    tracker.init(body);
    Iterator units=body.getUnits().iterator();
    while (units.hasNext()) {
      Unit unit=(Unit)(units.next());
      Unit target=null;
      if (unit instanceof GotoStmt) {
        target=((GotoStmt)unit).getTarget();
      }
 else       if (unit instanceof IfStmt) {
        target=((IfStmt)unit).getTarget();
      }
 else       if (tracker.isHandlerUnit(unit)) {
        target=unit;
      }
      if (target != null) {
        visitor.addTarget(target);
      }
    }
    if (thisLocalName != null)     visitor.setThisLocalName(thisLocalName);
    units=body.getUnits().iterator();
    if (!_context.getSingleClassMode()) {
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append("String_Node_Str" + _indent(1) + "String_Node_Str");
      if (tracker.trapsExist()) {
        code.append(_indent(1) + "String_Node_Str");
        code.append(_indent(1) + "String_Node_Str");
        code.append(_indent(1) + "String_Node_Str");
      }
      if (tracker.trapsExist()) {
        indentLevel=2;
      }
 else {
        indentLevel=1;
      }
    }
 else {
      indentLevel=1;
    }
    visitor.indentLevel=indentLevel;
    boolean handle_exceptions=tracker.trapsExist() && (!_context.getSingleClassMode());
    while (units.hasNext()) {
      Unit unit=(Unit)(units.next());
      if (visitor.isTarget(unit)) {
        code.append(visitor.getLabel(unit) + "String_Node_Str");
      }
      if (handle_exceptions && tracker.isBeginUnit(unit)) {
        tracker.beginUnitEncountered(unit);
        code.append(_indent(2) + "String_Node_Str" + tracker.getEpc()+ "String_Node_Str");
        code.append(_indent(2) + "String_Node_Str" + tracker.beginIndexOf(unit)+ "String_Node_Str");
      }
      unit.apply(visitor);
      StringBuffer newCode=visitor.getCode();
      if (newCode.length() > 0) {
        code.append(_indent(indentLevel)).append(newCode).append("String_Node_Str");
      }
      if (handle_exceptions && tracker.isEndUnit(unit)) {
        code.append(_indent(2) + "String_Node_Str" + tracker.endIndexOf(unit)+ "String_Node_Str");
        tracker.endUnitEncountered(unit);
        code.append(_indent(2) + "String_Node_Str" + tracker.getEpc()+ "String_Node_Str");
      }
      if (handle_exceptions && tracker.isHandlerUnit(unit)) {
        code.append(_indent(2) + "String_Node_Str" + tracker.handlerIndexOf(unit)+ "String_Node_Str");
      }
    }
    if (tracker.trapsExist()) {
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append("String_Node_Str" + _indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      for (int i=0; i <= (tracker.getEpc() - 1); i++) {
        code.append(_indent(3) + "String_Node_Str" + (i)+ "String_Node_Str");
        if (tracker.getHandlerUnitList(i).size() > 0) {
          Iterator j=tracker.getTrapsForEpc(i).listIterator();
          code.append(_indent(4));
          while (j.hasNext()) {
            Trap currentTrap=(Trap)j.next();
            code.append("String_Node_Str" + currentTrap.getException() + "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
            code.append(_indent(5) + "String_Node_Str" + visitor.getLabel(currentTrap.getHandlerUnit())+ "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
          }
          code.append("String_Node_Str" + _indent(4) + "String_Node_Str");
          code.append(_indent(5) + "String_Node_Str");
          code.append(_indent(5) + "String_Node_Str" + "String_Node_Str");
          code.append(_indent(4) + "String_Node_Str");
        }
 else {
          code.append(_indent(4) + "String_Node_Str");
        }
      }
      code.append(_indent(3) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
    }
    code.append("String_Node_Str");
    code.append(_comment(description));
    return code.toString();
  }
 else {
    return "String_Node_Str";
  }
}

Fixed version (ground truth):
/** 
 * Generate code for a method.
 * @param method The method.
 * @return The code.
 */
private String _generateMethod(SootMethod method){
  byte indentLevel;
  if (method.isConcrete() && !(method.isNative())) {
    StringBuffer code=new StringBuffer();
    String description="String_Node_Str" + method.getSubSignature();
    code.append(_comment(description));
    JimpleBody body=(JimpleBody)(method.retrieveActiveBody());
    CSwitch visitor=new CSwitch(_context);
    Type returnType=method.getReturnType();
    visitor.returnType=returnType;
    code.append(CNames.typeNameOf(returnType));
    _updateRequiredTypes(returnType);
    code.append("String_Node_Str");
    code.append(CNames.functionNameOf(method));
    code.append("String_Node_Str");
    int parameterIndex;
    int parameterCount=0;
    String thisLocalName=null;
    HashSet parameterAndThisLocals=new HashSet();
    if (!method.isStatic()) {
      parameterAndThisLocals.add(body.getThisLocal());
      thisLocalName=CNames.localNameOf(body.getThisLocal());
      code.append(CNames.instanceNameOf(method.getDeclaringClass()) + "String_Node_Str" + thisLocalName);
      parameterCount++;
    }
    for (parameterIndex=0; parameterIndex < method.getParameterCount(); parameterIndex++) {
      if (parameterCount++ > 0)       code.append("String_Node_Str");
      Local local=body.getParameterLocal(parameterIndex);
      parameterAndThisLocals.add(local);
      Type parameterType=local.getType();
      code.append(CNames.typeNameOf(parameterType) + "String_Node_Str" + CNames.localNameOf(local));
      _updateRequiredTypes(parameterType);
    }
    code.append("String_Node_Str");
    Iterator locals=body.getLocals().iterator();
    while (locals.hasNext()) {
      Local nextLocal=(Local)(locals.next());
      if (!parameterAndThisLocals.contains(nextLocal)) {
        code.append(_indent(1));
        Type localType=nextLocal.getType();
        code.append(CNames.typeNameOf(localType));
        code.append("String_Node_Str" + CNames.localNameOf(nextLocal) + "String_Node_Str");
        _updateRequiredTypes(localType);
      }
    }
    ExceptionTracker tracker=new ExceptionTracker();
    tracker.init(body);
    Iterator units=body.getUnits().iterator();
    while (units.hasNext()) {
      Unit unit=(Unit)(units.next());
      Unit target=null;
      if (unit instanceof GotoStmt) {
        target=((GotoStmt)unit).getTarget();
      }
 else       if (unit instanceof IfStmt) {
        target=((IfStmt)unit).getTarget();
      }
 else       if (tracker.isHandlerUnit(unit)) {
        target=unit;
      }
      if (target != null) {
        visitor.addTarget(target);
      }
    }
    if (thisLocalName != null)     visitor.setThisLocalName(thisLocalName);
    units=body.getUnits().iterator();
    if (!_context.getSingleClassMode()) {
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append("String_Node_Str" + _indent(1) + "String_Node_Str");
      if (tracker.trapsExist()) {
        code.append(_indent(1) + "String_Node_Str");
        code.append(_indent(1) + "String_Node_Str");
        code.append(_indent(1) + "String_Node_Str");
      }
      if (tracker.trapsExist()) {
        indentLevel=2;
      }
 else {
        indentLevel=1;
      }
    }
 else {
      indentLevel=1;
    }
    visitor.indentLevel=indentLevel;
    boolean handle_exceptions=tracker.trapsExist() && (!_context.getSingleClassMode());
    while (units.hasNext()) {
      Unit unit=(Unit)(units.next());
      if (visitor.isTarget(unit)) {
        code.append(visitor.getLabel(unit) + "String_Node_Str");
      }
      if (handle_exceptions && tracker.isBeginUnit(unit)) {
        tracker.beginUnitEncountered(unit);
        code.append(_indent(2) + "String_Node_Str" + tracker.getEpc()+ "String_Node_Str");
        code.append(_indent(2) + "String_Node_Str" + tracker.beginIndexOf(unit)+ "String_Node_Str");
      }
      unit.apply(visitor);
      StringBuffer newCode=visitor.getCode();
      if (newCode.length() > 0) {
        code.append(_indent(indentLevel)).append(newCode).append("String_Node_Str");
      }
      if (handle_exceptions && tracker.isEndUnit(unit)) {
        code.append(_indent(2) + "String_Node_Str" + tracker.endIndexOf(unit)+ "String_Node_Str");
        tracker.endUnitEncountered(unit);
        code.append(_indent(2) + "String_Node_Str" + tracker.getEpc()+ "String_Node_Str");
      }
      if (handle_exceptions && tracker.isHandlerUnit(unit)) {
        code.append(_indent(2) + "String_Node_Str" + tracker.handlerIndexOf(unit)+ "String_Node_Str");
      }
    }
    if (tracker.trapsExist()) {
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str" + "String_Node_Str");
      code.append("String_Node_Str" + _indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      for (int i=0; i <= (tracker.getEpc() - 1); i++) {
        code.append(_indent(3) + "String_Node_Str" + (i)+ "String_Node_Str");
        if (tracker.getHandlerUnitList(i).size() > 0) {
          Iterator j=tracker.getTrapsForEpc(i).listIterator();
          code.append(_indent(4));
          while (j.hasNext()) {
            Trap currentTrap=(Trap)j.next();
            code.append("String_Node_Str" + currentTrap.getException() + "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
            code.append(_indent(5) + "String_Node_Str" + visitor.getLabel(currentTrap.getHandlerUnit())+ "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
            code.append(_indent(4) + "String_Node_Str");
          }
          code.append("String_Node_Str" + _indent(4) + "String_Node_Str");
          code.append(_indent(5) + "String_Node_Str");
          code.append(_indent(5) + "String_Node_Str" + "String_Node_Str");
          code.append(_indent(4) + "String_Node_Str");
        }
 else {
          code.append(_indent(4) + "String_Node_Str");
        }
      }
      code.append(_indent(3) + "String_Node_Str");
      code.append(_indent(2) + "String_Node_Str");
      code.append(_indent(1) + "String_Node_Str");
    }
    code.append("String_Node_Str");
    code.append(_comment(description));
    return code.toString();
  }
 else {
    return "String_Node_Str";
  }
}