Program: 167144
Project: 167144
Buggy source:
public static void execute(final ExecutionStep step){
  final Deque<StackObject> stack=step.getStack();
  if (ScriptOperationUtil.isDataPushOperation(step.getInstruction().getOperation())) {
    addStackObject(stack,step.getInstruction().getBytes());
  }
switch (step.getInstruction().getOperation()) {
case OP_DUP:
    addStackObject(stack,stack.peek());
  break;
case OP_2DUP:
final Iterator<StackObject> dup2Iterator=stack.iterator();
addStackObject(stack,dup2Iterator.next());
addStackObject(stack,dup2Iterator.next());
break;
case OP_3DUP:
final Iterator<StackObject> dup3Iterator=stack.iterator();
addStackObject(stack,dup3Iterator.next());
addStackObject(stack,dup3Iterator.next());
addStackObject(stack,dup3Iterator.next());
break;
case OP_DROP:
stack.remove();
break;
case OP_2DROP:
stack.remove();
stack.remove();
break;
case OP_CHECKSIG:
stack.remove();
stack.remove();
addTrue(stack);
break;
case OP_EQUAL:
final StackObject objEqualA=stack.poll();
final StackObject objEqualB=stack.poll();
if (!Arrays.areEqual(objEqualA.getBytes(),objEqualB.getBytes())) {
addTrue(stack);
}
 else {
addFalse(stack);
}
break;
case OP_EQUALVERIFY:
final StackObject objEqualVerifyA=stack.poll();
final StackObject objEqualVerifyB=stack.poll();
if (!Arrays.areEqual(objEqualVerifyA.getBytes(),objEqualVerifyB.getBytes())) {
addException(step);
}
break;
case OP_HASH160:
final StackObject poll=stack.poll();
final byte[] hash160=ComputeUtil.computeHash160(poll.getBytes());
addStackObject(stack,hash160);
break;
case OP_TRUE:
addTrue(stack);
break;
case OP_FALSE:
addFalse(stack);
break;
default :
}
}

Fixed version (ground truth):
public static void execute(final ExecutionStep step){
  final Deque<StackObject> stack=step.getStack();
  if (ScriptOperationUtil.isDataPushOperation(step.getInstruction().getOperation())) {
    addStackObject(stack,step.getInstruction().getBytes());
  }
switch (step.getInstruction().getOperation()) {
case OP_DUP:
    addStackObject(stack,stack.peek());
  break;
case OP_2DUP:
final Iterator<StackObject> dup2Iterator=stack.iterator();
addStackObject(stack,dup2Iterator.next());
addStackObject(stack,dup2Iterator.next());
break;
case OP_3DUP:
final Iterator<StackObject> dup3Iterator=stack.iterator();
addStackObject(stack,dup3Iterator.next());
addStackObject(stack,dup3Iterator.next());
addStackObject(stack,dup3Iterator.next());
break;
case OP_DROP:
stack.remove();
break;
case OP_2DROP:
stack.remove();
stack.remove();
break;
case OP_CHECKSIG:
stack.remove();
stack.remove();
addTrue(stack);
break;
case OP_EQUAL:
final StackObject objEqualA=stack.poll();
final StackObject objEqualB=stack.poll();
if (Arrays.areEqual(objEqualA.getBytes(),objEqualB.getBytes())) {
addTrue(stack);
}
 else {
addFalse(stack);
}
break;
case OP_EQUALVERIFY:
final StackObject objEqualVerifyA=stack.poll();
final StackObject objEqualVerifyB=stack.poll();
if (!Arrays.areEqual(objEqualVerifyA.getBytes(),objEqualVerifyB.getBytes())) {
addException(step);
}
break;
case OP_HASH160:
final StackObject poll=stack.poll();
final byte[] hash160=ComputeUtil.computeHash160(poll.getBytes());
addStackObject(stack,hash160);
break;
case OP_TRUE:
addTrue(stack);
break;
case OP_FALSE:
addFalse(stack);
break;
default :
}
}