Skip to content

Commit d5b177a

Browse files
committed
feat: add basic mutator runtime
The idea is to extend the runtime class with more information that can be used while mutating. For now it only contains the fuzz test method, that is necessary for @DictionaryProvider annotation that extracts type instances from fuzz test class functions that return Stream<?>.
1 parent e4671c1 commit d5b177a

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)