Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,18 +178,15 @@ private ExtendedMutatorFactory withDescriptorDependentMutatorFactoryIfNeeded(
Stream.concat(LangMutators.newFactories(), CollectionMutators.newFactories()),
Stream.of(enumFactory)));
} else if (field.getJavaType() == JavaType.MESSAGE) {
Descriptor messageDescriptor;
if (field.isMapField()) {
// Map fields are represented as messages, but we mutate them as actual Java Maps. In case
// the values of the proto map are themselves messages, we need to mutate their type.
// the values of the proto map are themselves messages or enums, we need to mutate their
// type.
FieldDescriptor valueField = field.getMessageType().getFields().get(1);
if (valueField.getJavaType() != JavaType.MESSAGE) {
return originalFactory;
}
messageDescriptor = valueField.getMessageType();
} else {
messageDescriptor = field.getMessageType();
return withDescriptorDependentMutatorFactoryIfNeeded(
originalFactory, valueField, annotations);
}
Descriptor messageDescriptor = field.getMessageType();
return ChainedMutatorFactory.of(
originalFactory.getCache(),
Stream.of(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import com.code_intelligence.jazzer.protobuf.Proto3.EnumField3.TestEnum;
import com.code_intelligence.jazzer.protobuf.Proto3.EnumFieldRepeated3;
import com.code_intelligence.jazzer.protobuf.Proto3.EnumFieldRepeated3.TestEnumRepeated;
import com.code_intelligence.jazzer.protobuf.Proto3.EnumMapField3;
import com.code_intelligence.jazzer.protobuf.Proto3.FloatField3;
import com.code_intelligence.jazzer.protobuf.Proto3.IntegralField3;
import com.code_intelligence.jazzer.protobuf.Proto3.MapField3;
Expand Down Expand Up @@ -1010,6 +1011,12 @@ public static Stream<Arguments> protoStressTestCases() {
false,
distinctElementsRatio(0.45),
distinctElementsRatio(0.45)),
arguments(
new TypeHolder<@NotNull EnumMapField3>() {}.annotatedType(),
"{Builder.Map<String, {Builder.Enum<TestEnum>} -> Message>} -> Message",
false,
distinctElementsRatio(0.45),
distinctElementsRatio(0.45)),
arguments(
new TypeHolder<@NotNull DoubleField3>() {}.annotatedType(),
"{Builder.Double} -> Message",
Expand Down Expand Up @@ -1050,17 +1057,19 @@ public static Stream<Arguments> protoStressTestCases() {
+ " Builder via List<Integer>, Builder via List<Integer>, Builder via List<Long>,"
+ " Builder via List<Long>, Builder via List<Float>, Builder via List<Double>,"
+ " Builder via List<String>, Builder via List<Enum<Enum>>, WithoutInit(Builder via"
+ " List<(cycle) -> Message>), Builder.Map<Integer, Integer>,"
+ " List<(cycle) -> Message>), Builder.Map<Integer, Integer>, Builder.Map<Integer,"
+ " Enum<Enum>>, WithoutInit(Builder.Map<Integer, (cycle) -> Message>),"
+ " Builder.Nullable<FixedValue(OnlyLabel)>, Builder.Nullable<{<empty>} ->"
+ " Message>, Builder.Nullable<Integer> | Builder.Nullable<Long> |"
+ " Builder.Nullable<Integer>} -> Message>)} -> Message>), Builder via"
+ " List<Boolean>, Builder via List<Integer>, Builder via List<Integer>, Builder"
+ " via List<Long>, Builder via List<Long>, Builder via List<Float>, Builder via"
+ " List<Double>, Builder via List<String>, Builder via List<Enum<Enum>>,"
+ " WithoutInit(Builder via List<(cycle) -> Message>), Builder.Map<Integer,"
+ " Integer>, Builder.Nullable<FixedValue(OnlyLabel)>, Builder.Nullable<(cycle) ->"
+ " Message>, Builder.Nullable<Integer> | Builder.Nullable<Long> |"
+ " Builder.Nullable<Integer>} -> Message",
+ " Integer>, Builder.Map<Integer, Enum<Enum>>, WithoutInit(Builder.Map<Integer,"
+ " (cycle) -> Message>), Builder.Nullable<FixedValue(OnlyLabel)>,"
+ " Builder.Nullable<(cycle) -> Message>, Builder.Nullable<Integer> |"
+ " Builder.Nullable<Long> | Builder.Nullable<Integer>} -> Message",
false,
manyDistinctElements(),
manyDistinctElements()),
Expand All @@ -1083,17 +1092,19 @@ public static Stream<Arguments> protoStressTestCases() {
+ " Builder via List<Integer>, Builder via List<Integer>, Builder via List<Long>,"
+ " Builder via List<Long>, Builder via List<Float>, Builder via List<Double>,"
+ " Builder via List<String>, Builder via List<Enum<Enum>>, WithoutInit(Builder via"
+ " List<(cycle) -> Message>), Builder.Map<Integer, Integer>,"
+ " List<(cycle) -> Message>), Builder.Map<Integer, Integer>, Builder.Map<Integer,"
+ " Enum<Enum>>, WithoutInit(Builder.Map<Integer, (cycle) -> Message>),"
+ " Builder.Nullable<FixedValue(OnlyLabel)>, Builder.Nullable<{<empty>} ->"
+ " Message>, Builder.Nullable<Integer> | Builder.Nullable<Long> |"
+ " Builder.Nullable<Integer>} -> Message>)} -> Message>), Builder via"
+ " List<Boolean>, Builder via List<Integer>, Builder via List<Integer>, Builder"
+ " via List<Long>, Builder via List<Long>, Builder via List<Float>, Builder via"
+ " List<Double>, Builder via List<String>, Builder via List<Enum<Enum>>,"
+ " WithoutInit(Builder via List<(cycle) -> Message>), Builder.Map<Integer,"
+ " Integer>, Builder.Nullable<FixedValue(OnlyLabel)>, Builder.Nullable<(cycle) ->"
+ " Message>, Builder.Nullable<Integer> | Builder.Nullable<Long> |"
+ " Builder.Nullable<Integer>} -> Message",
+ " Integer>, Builder.Map<Integer, Enum<Enum>>, WithoutInit(Builder.Map<Integer,"
+ " (cycle) -> Message>), Builder.Nullable<FixedValue(OnlyLabel)>,"
+ " Builder.Nullable<(cycle) -> Message>, Builder.Nullable<Integer> |"
+ " Builder.Nullable<Long> | Builder.Nullable<Integer>} -> Message",
false,
manyDistinctElements(),
manyDistinctElements()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ message TestProtobuf {
}

map<int32, int32> map_field = 25;
map<int32, Enum> enum_map = 26;
map<int32, TestSubProtobuf> message_map = 27;

// Special cases
enum EnumOneLabel {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ message MessageMapField3 {
map<string, MapField3> some_field = 1;
}

message EnumMapField3 {
map<string, EnumField3> some_field = 1;
}

message FloatField3 {
float some_field = 1;
}
Expand Down
3 changes: 2 additions & 1 deletion tests/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,7 @@ java_fuzz_target_test(

java_fuzz_target_test(
name = "MutatorComplexProtoFuzzer",
timeout = "long",
srcs = ["src/test/java/com/example/MutatorComplexProtoFuzzer.java"],
allowed_findings = ["com.code_intelligence.jazzer.api.FuzzerSecurityIssueMedium"],
fuzzer_args = [
Expand All @@ -624,7 +625,7 @@ java_fuzz_target_test(
# Limit runs to catch regressions in mutator efficiency and speed up test runs.
# Especially on Windows this test needs way more iterations than on other platforms.
"-runs=3000000",
"-seed=123",
"-seed=1",
],
target_class = "com.example.MutatorComplexProtoFuzzer",
verify_crash_reproducer = False,
Expand Down