diff options
author | Fabian Meumertzheim <fabian@meumertzhe.im> | 2021-10-08 15:41:08 +0200 |
---|---|---|
committer | Fabian Meumertzheim <fabian@meumertzhe.im> | 2021-10-17 10:37:34 +0200 |
commit | 27b15be5fd30af5f3b64ab6451fb26c417681221 (patch) | |
tree | 285c944b7669e73952fb276c694ac2560acd83ac /bazel/FuzzTargetTestWrapper.java | |
parent | c470f962424801a4020cf7215dc27422949f34fd (diff) | |
download | jazzer-api-27b15be5fd30af5f3b64ab6451fb26c417681221.tar.gz |
Use rules_jni
This simplifies the libjvm location logic as well as native library
packaging. Incidentally, this fixes the libjpeg_turbo build.
In anticipation of Windows support and because it simplifies further
improvements to the fuzz target test setup, the wrapper is rewritten in
Java.
Diffstat (limited to 'bazel/FuzzTargetTestWrapper.java')
-rw-r--r-- | bazel/FuzzTargetTestWrapper.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/bazel/FuzzTargetTestWrapper.java b/bazel/FuzzTargetTestWrapper.java new file mode 100644 index 00000000..ef22ea0e --- /dev/null +++ b/bazel/FuzzTargetTestWrapper.java @@ -0,0 +1,78 @@ +// Copyright 2021 Code Intelligence GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.devtools.build.runfiles.Runfiles; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FuzzTargetTestWrapper { + public static void main(String[] args) { + String driverActualPath; + String jarActualPath; + Runfiles runfiles; + try { + runfiles = Runfiles.create(); + driverActualPath = runfiles.rlocation(args[0]); + jarActualPath = runfiles.rlocation(args[1]); + } catch (IOException | ArrayIndexOutOfBoundsException e) { + e.printStackTrace(); + System.exit(1); + return; + } + + ProcessBuilder processBuilder = new ProcessBuilder(); + Map<String, String> environment = processBuilder.environment(); + // Ensure that Jazzer can find its runfiles. + environment.putAll(runfiles.getEnvVars()); + + // Crashes will be available as test outputs. These are cleared on the next run, + // so this is only useful for examples. + String outputDir = System.getenv("TEST_UNDECLARED_OUTPUTS_DIR"); + List<String> command = + Stream + .concat(Stream.of(driverActualPath, String.format("-artifact_prefix=%s/", outputDir), + String.format("--reproducer_path=%s", outputDir), "-seed=2735196724", + String.format("--cp=%s", jarActualPath)), + Arrays.stream(args).skip(2)) + .collect(Collectors.toList()); + processBuilder.inheritIO(); + processBuilder.command(command); + + try { + int exitCode = processBuilder.start().waitFor(); + // Assert that we either found a crash in Java (exit code 77) or a sanitizer crash (exit code + // 76). + if (exitCode != 76 && exitCode != 77) { + System.exit(3); + } + String[] outputFiles = new File(outputDir).list(); + if (outputFiles == null) { + System.exit(4); + } + // Verify that libFuzzer dumped a crashing input. + if (Arrays.stream(outputFiles).noneMatch(name -> name.startsWith("crash-"))) { + System.exit(5); + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + System.exit(2); + } + System.exit(0); + } +} |