diff options
author | Fabian Meumertzheim <fabian@meumertzhe.im> | 2022-08-16 22:12:51 +0200 |
---|---|---|
committer | Fabian Meumertzheim <fabian@meumertzhe.im> | 2022-08-19 17:14:53 +0200 |
commit | 87088298d3256bcea8210a6345369cd4b42ba31d (patch) | |
tree | e88f75ab913da9e6c6e1c71015de4ffcc7995ffa | |
parent | 8958f6b4daa5dcc23490e05c4252090d07486ac6 (diff) | |
download | jazzer-api-87088298d3256bcea8210a6345369cd4b42ba31d.tar.gz |
driver: Remove dependency on Abseil StrFormat
Checking the bounds in Java allows for better error messages and we
reduce the binary size of the driver JNI library by almost 200 kiB.
3 files changed, 71 insertions, 32 deletions
diff --git a/agent/src/main/java/com/code_intelligence/jazzer/runtime/FuzzedDataProviderImpl.java b/agent/src/main/java/com/code_intelligence/jazzer/runtime/FuzzedDataProviderImpl.java index 567b02d3..8d70ce10 100644 --- a/agent/src/main/java/com/code_intelligence/jazzer/runtime/FuzzedDataProviderImpl.java +++ b/agent/src/main/java/com/code_intelligence/jazzer/runtime/FuzzedDataProviderImpl.java @@ -45,23 +45,51 @@ public class FuzzedDataProviderImpl implements FuzzedDataProvider { @Override public native byte consumeByte(); - @Override public native byte consumeByte(byte min, byte max); + @Override + public byte consumeByte(byte min, byte max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %d, max: %d)", min, max)); + } + return consumeByteUnchecked(min, max); + } @Override public native short consumeShort(); - @Override public native short consumeShort(short min, short max); + @Override + public short consumeShort(short min, short max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %d, max: %d)", min, max)); + } + return consumeShortUnchecked(min, max); + } @Override public native short[] consumeShorts(int maxLength); @Override public native int consumeInt(); - @Override public native int consumeInt(int min, int max); + @Override + public int consumeInt(int min, int max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %d, max: %d)", min, max)); + } + return consumeIntUnchecked(min, max); + } @Override public native int[] consumeInts(int maxLength); @Override public native long consumeLong(); - @Override public native long consumeLong(long min, long max); + @Override + public long consumeLong(long min, long max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %d, max: %d)", min, max)); + } + return consumeLongUnchecked(min, max); + } @Override public native long[] consumeLongs(int maxLength); @@ -69,13 +97,27 @@ public class FuzzedDataProviderImpl implements FuzzedDataProvider { @Override public native float consumeRegularFloat(); - @Override public native float consumeRegularFloat(float min, float max); + @Override + public float consumeRegularFloat(float min, float max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %f, max: %f)", min, max)); + } + return consumeRegularFloatUnchecked(min, max); + } @Override public native float consumeProbabilityFloat(); @Override public native double consumeDouble(); - @Override public native double consumeRegularDouble(double min, double max); + @Override + public double consumeRegularDouble(double min, double max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %f, max: %f)", min, max)); + } + return consumeRegularDoubleUnchecked(min, max); + } @Override public native double consumeRegularDouble(); @@ -83,7 +125,14 @@ public class FuzzedDataProviderImpl implements FuzzedDataProvider { @Override public native char consumeChar(); - @Override public native char consumeChar(char min, char max); + @Override + public char consumeChar(char min, char max) { + if (min > max) { + throw new IllegalArgumentException( + String.format("min must be <= max (got min: %c, max: %c)", min, max)); + } + return consumeCharUnchecked(min, max); + } @Override public native char consumeCharNoSurrogates(); @@ -100,4 +149,12 @@ public class FuzzedDataProviderImpl implements FuzzedDataProvider { @Override public native byte[] consumeRemainingAsBytes(); @Override public native int remainingBytes(); + + private native byte consumeByteUnchecked(byte min, byte max); + private native short consumeShortUnchecked(short min, short max); + private native char consumeCharUnchecked(char min, char max); + private native int consumeIntUnchecked(int min, int max); + private native long consumeLongUnchecked(long min, long max); + private native float consumeRegularFloatUnchecked(float min, float max); + private native double consumeRegularDoubleUnchecked(double min, double max); } diff --git a/driver/src/main/native/com/code_intelligence/jazzer/driver/BUILD.bazel b/driver/src/main/native/com/code_intelligence/jazzer/driver/BUILD.bazel index 2e846414..845023c8 100644 --- a/driver/src/main/native/com/code_intelligence/jazzer/driver/BUILD.bazel +++ b/driver/src/main/native/com/code_intelligence/jazzer/driver/BUILD.bazel @@ -66,7 +66,6 @@ cc_library( ], deps = [ "//agent/src/main/java/com/code_intelligence/jazzer/runtime:fuzzed_data_provider.hdrs", - "@com_google_absl//absl/strings:str_format", ], # Symbols may only be referenced dynamically via JNI. alwayslink = True, diff --git a/driver/src/main/native/com/code_intelligence/jazzer/driver/fuzzed_data_provider.cpp b/driver/src/main/native/com/code_intelligence/jazzer/driver/fuzzed_data_provider.cpp index 7c8441bb..129cb21f 100644 --- a/driver/src/main/native/com/code_intelligence/jazzer/driver/fuzzed_data_provider.cpp +++ b/driver/src/main/native/com/code_intelligence/jazzer/driver/fuzzed_data_provider.cpp @@ -53,7 +53,6 @@ #include <type_traits> #include <vector> -#include "absl/strings/str_format.h" #include "com_code_intelligence_jazzer_runtime_FuzzedDataProviderImpl.h" namespace { @@ -130,14 +129,6 @@ jbyteArray JNICALL ConsumeRemainingAsArray(JNIEnv &env, jobject self) { template <typename T> T JNICALL ConsumeIntegralInRange(JNIEnv &env, jobject self, T min, T max) { - if (min > max) { - ThrowIllegalArgumentException( - env, absl::StrFormat( - "Consume*InRange: min must be <= max (got min: %d, max: %d)", - min, max)); - return 0; - } - uint64_t range = static_cast<uint64_t>(max) - min; uint64_t result = 0; std::size_t offset = 0; @@ -205,14 +196,6 @@ T JNICALL ConsumeProbability(JNIEnv &env, jobject self) { template <typename T> T JNICALL ConsumeFloatInRange(JNIEnv &env, jobject self, T min, T max) { - if (min > max) { - ThrowIllegalArgumentException( - env, absl::StrFormat( - "Consume*InRange: min must be <= max (got min: %f, max: %f)", - min, max)); - return 0.0; - } - T range; T result = min; @@ -646,33 +629,33 @@ std::size_t RemainingBytes(JNIEnv &env, jobject self) { const JNINativeMethod kFuzzedDataMethods[]{ {(char *)"consumeBoolean", (char *)"()Z", (void *)&ConsumeBool}, {(char *)"consumeByte", (char *)"()B", (void *)&ConsumeIntegral<jbyte>}, - {(char *)"consumeByte", (char *)"(BB)B", + {(char *)"consumeByteUnchecked", (char *)"(BB)B", (void *)&ConsumeIntegralInRange<jbyte>}, {(char *)"consumeShort", (char *)"()S", (void *)&ConsumeIntegral<jshort>}, - {(char *)"consumeShort", (char *)"(SS)S", + {(char *)"consumeShortUnchecked", (char *)"(SS)S", (void *)&ConsumeIntegralInRange<jshort>}, {(char *)"consumeInt", (char *)"()I", (void *)&ConsumeIntegral<jint>}, - {(char *)"consumeInt", (char *)"(II)I", + {(char *)"consumeIntUnchecked", (char *)"(II)I", (void *)&ConsumeIntegralInRange<jint>}, {(char *)"consumeLong", (char *)"()J", (void *)&ConsumeIntegral<jlong>}, - {(char *)"consumeLong", (char *)"(JJ)J", + {(char *)"consumeLongUnchecked", (char *)"(JJ)J", (void *)&ConsumeIntegralInRange<jlong>}, {(char *)"consumeFloat", (char *)"()F", (void *)&ConsumeFloat<jfloat>}, {(char *)"consumeRegularFloat", (char *)"()F", (void *)&ConsumeRegularFloat<jfloat>}, - {(char *)"consumeRegularFloat", (char *)"(FF)F", + {(char *)"consumeRegularFloatUnchecked", (char *)"(FF)F", (void *)&ConsumeFloatInRange<jfloat>}, {(char *)"consumeProbabilityFloat", (char *)"()F", (void *)&ConsumeProbability<jfloat>}, {(char *)"consumeDouble", (char *)"()D", (void *)&ConsumeFloat<jdouble>}, {(char *)"consumeRegularDouble", (char *)"()D", (void *)&ConsumeRegularFloat<jdouble>}, - {(char *)"consumeRegularDouble", (char *)"(DD)D", + {(char *)"consumeRegularDoubleUnchecked", (char *)"(DD)D", (void *)&ConsumeFloatInRange<jdouble>}, {(char *)"consumeProbabilityDouble", (char *)"()D", (void *)&ConsumeProbability<jdouble>}, {(char *)"consumeChar", (char *)"()C", (void *)&ConsumeChar}, - {(char *)"consumeChar", (char *)"(CC)C", + {(char *)"consumeCharUnchecked", (char *)"(CC)C", (void *)&ConsumeIntegralInRange<jchar>}, {(char *)"consumeCharNoSurrogates", (char *)"()C", (void *)&ConsumeCharNoSurrogates}, |