load("//bazel:cc.bzl", "cc_17_library") cc_library( name = "sanitizer_hooks_with_pc", srcs = ["sanitizer_hooks_with_pc.cpp"], hdrs = ["sanitizer_hooks_with_pc.h"], linkstatic = True, ) cc_test( name = "sanitizer_hooks_with_pc_test", size = "small", srcs = ["sanitizer_hooks_with_pc_test.cpp"], deps = [ ":sanitizer_hooks_with_pc", "@googletest//:gtest", "@googletest//:gtest_main", ], ) cc_library( name = "fuzzed_data_provider", srcs = [ "fuzzed_data_provider.cpp", ], hdrs = [ "fuzzed_data_provider.h", ], visibility = [ "//agent/src/main/native/com/code_intelligence/jazzer/replay:__pkg__", ], deps = [ "@com_google_absl//absl/strings:str_format", "@fmeum_rules_jni//jni", ], ) cc_library( name = "jvm_tooling_lib", srcs = [ "coverage_tracker.cpp", "fuzz_target_runner.cpp", "java_reproducer.cpp", "java_reproducer.h", "java_reproducer_templates.h", "jvm_tooling.cpp", "libfuzzer_callbacks.cpp", "libfuzzer_callbacks.h", "libfuzzer_driver.cpp", "signal_handler.cpp", "signal_handler.h", "utils.cpp", "utils.h", ], hdrs = [ "coverage_tracker.h", "fuzz_target_runner.h", "fuzzed_data_provider.h", "jvm_tooling.h", "libfuzzer_driver.h", ], linkopts = select({ "@platforms//os:windows": [], "//conditions:default": ["-ldl"], }), # Needs to be linked statically for JNI_OnLoad_jazzer_initialize to be found # by the JVM. linkstatic = True, local_defines = select({ # Windows does not have SIGUSR1, which triggers a graceful exit of # libFuzzer. Instead, trigger a hard exit. "@platforms//os:windows": ["SIGUSR1=SIGTERM"], "//conditions:default": [], }), tags = [ # Should be built through the cc_17_library driver_lib. "manual", ], visibility = ["//visibility:public"], deps = [ ":fuzzed_data_provider", ":sanitizer_hooks_with_pc", "@bazel_tools//tools/cpp/runfiles", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@com_google_glog//:glog", "@fmeum_rules_jni//jni:libjvm", "@jazzer_com_github_gflags_gflags//:gflags", ], ) cc_17_library( name = "driver_lib", srcs = [ "libfuzzer_fuzz_target.cpp", ], linkstatic = True, deps = [ ":jvm_tooling_lib", "@jazzer_libfuzzer//:libFuzzer", ], alwayslink = True, ) cc_binary( name = "jazzer_driver", srcs = [ # Defines symbols otherwise defined by sanitizers to prevent linker # errors and print JVM stack traces. # Windows-compatible replacement for __attribute__((weak)). "sanitizer_symbols.cpp", ], data = [ "//agent:jazzer_agent_deploy.jar", ], linkopts = select({ "@platforms//os:windows": [], "//conditions:default": [ "-rdynamic", ], }) + select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [":driver_lib"], ) alias( name = "using_toolchain_on_osx", actual = select({ "//third_party:uses_toolchain": "@platforms//os:osx", # In order to achieve AND semantics, reference a setting that is known # not to apply. "//conditions:default": "//third_party:uses_toolchain", }), ) cc_binary( name = "jazzer_driver_asan", data = [ "//agent:jazzer_agent_deploy.jar", ], linkopts = [ ] + select({ "@platforms//os:windows": [ # Sanitizer runtimes have to be linked manually on Windows: # https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/ "/wholearchive:clang_rt.asan-x86_64.lib", "/wholearchive:clang_rt.asan_cxx-x86_64.lib", ], "//conditions:default": [ "-fsanitize=address", "-static-libsan", "-rdynamic", ], }) + select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [":driver_lib"] + select({ # There is no static ASan runtime on macOS, so link to the dynamic # runtime library if on macOS and using the toolchain. ":using_toolchain_on_osx": ["@llvm_toolchain//:macos_asan_dynamic"], "//conditions:default": [], }), ) cc_binary( name = "jazzer_driver_ubsan", data = [ "//agent:jazzer_agent_deploy.jar", ], linkopts = [ ] + select({ "@platforms//os:windows": [ # Sanitizer runtimes have to be linked manually on Windows: # https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/ "/wholearchive:clang_rt.ubsan_standalone-x86_64.lib", "/wholearchive:clang_rt.ubsan_standalone_cxx-x86_64.lib", ], "//conditions:default": [ "-fsanitize=undefined", # Link UBSan statically, even on macOS. "-static-libsan", "-fsanitize-link-c++-runtime", "-rdynamic", ], }) + select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [":driver_lib"], ) cc_test( name = "jvm_tooling_test", size = "small", srcs = [ "jvm_tooling_test.cpp", "sanitizer_symbols_for_tests.cpp", ], args = [ "--cp=jazzer/$(rootpath //driver/testdata:fuzz_target_mocks_deploy.jar)", ], data = [ "//agent:jazzer_agent_deploy.jar", "//driver/testdata:fuzz_target_mocks_deploy.jar", ], includes = ["."], linkopts = select({ "@platforms//os:windows": [], "//conditions:default": [ # Needs to export symbols dynamically for JNI_OnLoad_jazzer_initialize # to be found by the JVM. "-rdynamic", ], }), deps = [ ":jvm_tooling_lib", ":test_main", "@bazel_tools//tools/cpp/runfiles", "@googletest//:gtest", "@jazzer_com_github_gflags_gflags//:gflags", ], ) cc_test( name = "fuzzed_data_provider_test", size = "medium", srcs = [ "fuzzed_data_provider_test.cpp", "sanitizer_symbols_for_tests.cpp", ], args = [ "--cp=jazzer/$(rootpath //driver/testdata:fuzz_target_mocks_deploy.jar)", ], data = [ "//agent:jazzer_agent_deploy.jar", "//driver/testdata:fuzz_target_mocks_deploy.jar", ], includes = ["."], deps = [ ":jvm_tooling_lib", ":test_main", "@bazel_tools//tools/cpp/runfiles", "@googletest//:gtest", "@jazzer_com_github_gflags_gflags//:gflags", ], ) cc_library( name = "test_main", srcs = ["test_main.cpp"], linkstatic = True, deps = [ "@googletest//:gtest", "@jazzer_com_github_gflags_gflags//:gflags", ], )