Skip to content

Commit b5379d7

Browse files
committed
feat: add basic mutator runtime
Propagate a new class MutatorRuntime to every mutator. For now the class only contains the fuzz test method, necessary for implementation of @DictionaryProvider annotation, in order to extract thunks returning Stream<?>. This class can be extended in the future to contain the table of recent compares, etc. to improve fuzzing performance.
1 parent 2c67ff9 commit b5379d7

File tree

73 files changed

+448
-128
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+448
-128
lines changed

selffuzz/src/test/java/com/code_intelligence/selffuzz/Helpers.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.code_intelligence.selffuzz.jazzer.mutation.api.PseudoRandom;
2222
import com.code_intelligence.selffuzz.jazzer.mutation.api.SerializingMutator;
2323
import com.code_intelligence.selffuzz.jazzer.mutation.engine.SeededPseudoRandom;
24+
import com.code_intelligence.selffuzz.jazzer.mutation.runtime.MutatorRuntime;
2425
import java.io.ByteArrayInputStream;
2526
import java.io.ByteArrayOutputStream;
2627
import java.io.DataInputStream;
@@ -42,4 +43,14 @@ public static <T> void assertMutator(SerializingMutator<T> mutator, byte[] data,
4243

4344
assertEquals(crossedOver, deserialized);
4445
}
46+
47+
public static MutatorRuntime dummyMutatorRuntime() {
48+
try {
49+
return MutatorRuntime.forFuzzTestMethod(Helpers.class.getMethod("dummyFuzzTestMethod"));
50+
} catch (NoSuchMethodException e) {
51+
throw new RuntimeException(e);
52+
}
53+
}
54+
55+
public static void dummyFuzzTestMethod() {}
4556
}

selffuzz/src/test/java/com/code_intelligence/selffuzz/mutation/mutator/lang/FloatingPointMutatorFuzzTests.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.code_intelligence.selffuzz.mutation.mutator.lang;
1818

1919
import static com.code_intelligence.selffuzz.Helpers.assertMutator;
20+
import static com.code_intelligence.selffuzz.Helpers.dummyMutatorRuntime;
2021
import static com.code_intelligence.selffuzz.jazzer.mutation.support.TypeSupport.withExtraAnnotations;
2122
import static org.junit.jupiter.api.Assumptions.assumeTrue;
2223

@@ -42,6 +43,7 @@ public void doubleMutatorTest(double min, double max, long seed, byte @NotNull [
4243
(SerializingMutator<Double>)
4344
Mutators.newFactory()
4445
.createOrThrow(
46+
dummyMutatorRuntime(),
4547
withExtraAnnotations(
4648
new TypeHolder<@NotNull Double>() {}.annotatedType(), range));
4749
assertMutator(mutator, data, seed);
@@ -56,6 +58,7 @@ public void floatMutatorTest(float min, float max, long seed, byte @NotNull [] d
5658
(SerializingMutator<Float>)
5759
Mutators.newFactory()
5860
.createOrThrow(
61+
dummyMutatorRuntime(),
5962
withExtraAnnotations(
6063
new TypeHolder<@NotNull Float>() {}.annotatedType(), range));
6164
assertMutator(mutator, data, seed);

selffuzz/src/test/java/com/code_intelligence/selffuzz/mutation/mutator/lang/StringMutatorFuzzTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.code_intelligence.selffuzz.mutation.mutator.lang;
1818

1919
import static com.code_intelligence.selffuzz.Helpers.assertMutator;
20+
import static com.code_intelligence.selffuzz.Helpers.dummyMutatorRuntime;
2021

2122
import com.code_intelligence.jazzer.junit.FuzzTest;
2223
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.NotNull;
@@ -31,7 +32,8 @@ class StringMutatorFuzzTest {
3132
void stringMutatorTest(long seed, byte @NotNull [] data) throws IOException {
3233
SerializingMutator<String> mutator =
3334
(SerializingMutator<String>)
34-
Mutators.newFactory().createOrThrow(new TypeHolder<String>() {}.annotatedType());
35+
Mutators.newFactory()
36+
.createOrThrow(dummyMutatorRuntime(), new TypeHolder<String>() {}.annotatedType());
3537
assertMutator(mutator, data, seed);
3638
}
3739
}

selffuzz/src/test/java/com/code_intelligence/selffuzz/mutation/mutator/proto/ProtobufMutatorFuzzTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.code_intelligence.selffuzz.mutation.mutator.proto;
1818

1919
import static com.code_intelligence.selffuzz.Helpers.assertMutator;
20+
import static com.code_intelligence.selffuzz.Helpers.dummyMutatorRuntime;
2021

2122
import com.code_intelligence.jazzer.junit.FuzzTest;
2223
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.NotNull;
@@ -63,6 +64,7 @@ void protobufMutatorTest(long seed, @NotNull DescriptorProto messageType, byte @
6364
(SerializingMutator<DynamicMessage>)
6465
Mutators.newFactory()
6566
.createOrThrow(
67+
dummyMutatorRuntime(),
6668
new TypeHolder<
6769
@WithDefaultInstance(
6870
"com.code_intelligence.selffuzz.mutation.mutator.proto.ProtobufMutatorFuzzTest#getDefaultInstance")

src/main/java/com/code_intelligence/jazzer/mutation/ArgumentsMutator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.code_intelligence.jazzer.mutation.combinator.MutatorCombinators;
3131
import com.code_intelligence.jazzer.mutation.engine.SeededPseudoRandom;
3232
import com.code_intelligence.jazzer.mutation.mutator.Mutators;
33+
import com.code_intelligence.jazzer.mutation.runtime.MutatorRuntime;
3334
import com.code_intelligence.jazzer.mutation.support.Preconditions;
3435
import com.code_intelligence.jazzer.utils.Log;
3536
import java.io.ByteArrayInputStream;
@@ -97,11 +98,13 @@ public static Optional<ArgumentsMutator> forMethod(
9798
Log.error(validationError.getMessage());
9899
throw validationError;
99100
}
101+
MutatorRuntime runtime = MutatorRuntime.forFuzzTestMethod(method);
100102
return toArrayOrEmpty(
101103
stream(method.getAnnotatedParameterTypes())
102104
.map(
103105
type -> {
104-
Optional<SerializingMutator<?>> mutator = mutatorFactory.tryCreate(type);
106+
Optional<SerializingMutator<?>> mutator =
107+
mutatorFactory.tryCreate(runtime, type);
105108
if (!mutator.isPresent()) {
106109
Log.error(
107110
String.format(

src/main/java/com/code_intelligence/jazzer/mutation/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ java_library(
1111
"//src/main/java/com/code_intelligence/jazzer/mutation/combinator",
1212
"//src/main/java/com/code_intelligence/jazzer/mutation/engine",
1313
"//src/main/java/com/code_intelligence/jazzer/mutation/mutator",
14+
"//src/main/java/com/code_intelligence/jazzer/mutation/runtime",
1415
"//src/main/java/com/code_intelligence/jazzer/mutation/support",
1516
"//src/main/java/com/code_intelligence/jazzer/utils:log",
1617
],

src/main/java/com/code_intelligence/jazzer/mutation/api/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ java_library(
33
srcs = glob(["*.java"]),
44
visibility = ["//visibility:public"],
55
deps = [
6+
"//src/main/java/com/code_intelligence/jazzer/mutation/runtime",
67
"//src/main/java/com/code_intelligence/jazzer/mutation/support",
78
"@maven//:com_google_errorprone_error_prone_annotations",
89
],

src/main/java/com/code_intelligence/jazzer/mutation/api/ExtendedMutatorFactory.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static com.code_intelligence.jazzer.mutation.support.Preconditions.require;
2020
import static java.lang.String.format;
2121

22+
import com.code_intelligence.jazzer.mutation.runtime.MutatorRuntime;
2223
import com.google.errorprone.annotations.CheckReturnValue;
2324
import java.lang.reflect.AnnotatedType;
2425
import java.util.Optional;
@@ -35,14 +36,15 @@ public Cache getCache() {
3536
return cache;
3637
}
3738

38-
public final SerializingMutator<?> createOrThrow(AnnotatedType type) {
39-
Optional<SerializingMutator<?>> maybeMutator = tryCreate(type);
39+
public final SerializingMutator<?> createOrThrow(MutatorRuntime runtime, AnnotatedType type) {
40+
Optional<SerializingMutator<?>> maybeMutator = tryCreate(runtime, type);
4041
require(maybeMutator.isPresent(), "Failed to create mutator for " + type);
4142
return maybeMutator.get();
4243
}
4344

44-
public final SerializingInPlaceMutator<?> createInPlaceOrThrow(AnnotatedType type) {
45-
Optional<SerializingInPlaceMutator<?>> maybeMutator = tryCreateInPlace(type);
45+
public final SerializingInPlaceMutator<?> createInPlaceOrThrow(
46+
MutatorRuntime runtime, AnnotatedType type) {
47+
Optional<SerializingInPlaceMutator<?>> maybeMutator = tryCreateInPlace(runtime, type);
4648
require(maybeMutator.isPresent(), "Failed to create mutator for " + type);
4749
return maybeMutator.get();
4850
}
@@ -51,8 +53,9 @@ public final SerializingInPlaceMutator<?> createInPlaceOrThrow(AnnotatedType typ
5153
* Tries to create a mutator for {@code type} and, if successful, asserts that it is an instance
5254
* of {@link SerializingInPlaceMutator}.
5355
*/
54-
public final Optional<SerializingInPlaceMutator<?>> tryCreateInPlace(AnnotatedType type) {
55-
return tryCreate(type)
56+
public final Optional<SerializingInPlaceMutator<?>> tryCreateInPlace(
57+
MutatorRuntime runtime, AnnotatedType type) {
58+
return tryCreate(runtime, type)
5659
.map(
5760
mutator -> {
5861
require(
@@ -63,8 +66,9 @@ public final Optional<SerializingInPlaceMutator<?>> tryCreateInPlace(AnnotatedTy
6366
}
6467

6568
@CheckReturnValue
66-
public final Optional<SerializingMutator<?>> tryCreate(AnnotatedType type) {
67-
return tryCreate(type, this);
69+
public final Optional<SerializingMutator<?>> tryCreate(
70+
MutatorRuntime runtime, AnnotatedType type) {
71+
return tryCreate(runtime, type, this);
6872
}
6973

7074
public abstract void internMutator(SerializingMutator<?> mutator);

src/main/java/com/code_intelligence/jazzer/mutation/api/MutatorFactory.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.code_intelligence.jazzer.mutation.api;
1818

19+
import com.code_intelligence.jazzer.mutation.runtime.MutatorRuntime;
1920
import com.google.errorprone.annotations.CheckReturnValue;
2021
import java.lang.reflect.AnnotatedType;
2122
import java.util.Optional;
@@ -35,14 +36,15 @@ public interface MutatorFactory {
3536
* this factory can't create such mutators
3637
*/
3738
@CheckReturnValue
38-
Optional<SerializingMutator<?>> tryCreate(AnnotatedType type, ExtendedMutatorFactory factory);
39+
Optional<SerializingMutator<?>> tryCreate(
40+
MutatorRuntime runtime, AnnotatedType type, ExtendedMutatorFactory factory);
3941

4042
/**
4143
* This exception can be thrown in mutator constructors to indicate that they failed to construct
4244
* a child mutator. This should be treated by callers as the equivalent of returning {@link
43-
* Optional#empty()} from {@link #tryCreate(AnnotatedType, ExtendedMutatorFactory)}, which may not
44-
* be possible in mutator factories for recursive structures that need to create child mutators in
45-
* a mutators constructor.
45+
* Optional#empty()} from {@link #tryCreate(MutatorRuntime, AnnotatedType,
46+
* ExtendedMutatorFactory)}, which may not be possible in mutator factories for recursive
47+
* structures that need to create child mutators in a mutators constructor.
4648
*/
4749
final class FailedToConstructChildMutatorException extends RuntimeException {
4850
public FailedToConstructChildMutatorException() {

src/main/java/com/code_intelligence/jazzer/mutation/engine/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ java_library(
1010
"//src/main/java/com/code_intelligence/jazzer/mutation/annotation",
1111
"//src/main/java/com/code_intelligence/jazzer/mutation/api",
1212
"//src/main/java/com/code_intelligence/jazzer/mutation/combinator",
13+
"//src/main/java/com/code_intelligence/jazzer/mutation/runtime",
1314
"//src/main/java/com/code_intelligence/jazzer/mutation/support",
1415
"//src/main/java/com/code_intelligence/jazzer/utils:log",
1516
"@maven//:com_google_errorprone_error_prone_annotations",

0 commit comments

Comments
 (0)