aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Meumertzheim <fabian@meumertzhe.im>2022-08-16 22:12:51 +0200
committerFabian Meumertzheim <fabian@meumertzhe.im>2022-08-19 17:14:53 +0200
commit87088298d3256bcea8210a6345369cd4b42ba31d (patch)
treee88f75ab913da9e6c6e1c71015de4ffcc7995ffa
parent8958f6b4daa5dcc23490e05c4252090d07486ac6 (diff)
downloadjazzer-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.
-rw-r--r--agent/src/main/java/com/code_intelligence/jazzer/runtime/FuzzedDataProviderImpl.java71
-rw-r--r--driver/src/main/native/com/code_intelligence/jazzer/driver/BUILD.bazel1
-rw-r--r--driver/src/main/native/com/code_intelligence/jazzer/driver/fuzzed_data_provider.cpp31
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},