Avoid unchanged messages after CrossOver.
diff --git a/src/protobuf_mutator.cc b/src/protobuf_mutator.cc
index 6b91e0c..f31a976 100644
--- a/src/protobuf_mutator.cc
+++ b/src/protobuf_mutator.cc
@@ -166,7 +166,7 @@
delete_weight_ *= 1 - adjustment;
}
Sample(message);
- assert(mutation() != Mutation::None);
+ assert(mutation() != Mutation::None || !size_increase_hint);
}
// Returns selected field.
@@ -486,12 +486,22 @@
void ProtobufMutator::CrossOver(const protobuf::Message& message1,
protobuf::Message* message2) {
+ // CrossOver can produce result which still equals to inputs. So we backup
+ // message2 to later comparison. message1 is already constant.
+ std::unique_ptr<protobuf::Message> message2_copy(message2->New());
+ message2_copy->CopyFrom(*message2);
+
CrossOverImpl(message1, message2);
if (keep_initialized_ && !message2->IsInitialized()) {
InitializeMessage(message2, kMaxInitializeDepth);
assert(message2->IsInitialized());
}
+
+ if (MessageDifferencer::Equals(*message2_copy, *message2) ||
+ MessageDifferencer::Equals(message1, *message2)) {
+ Mutate(message2, 0);
+ }
}
void ProtobufMutator::CrossOverImpl(const protobuf::Message& message1,