load("@fmeum_rules_jni//jni:defs.bzl", "cc_jni_library") load("//bazel:compat.bzl", "SKIP_ON_WINDOWS") cc_library( name = "jazzer_main", srcs = ["jazzer_main.cpp"], deps = [ ":jvm_tooling_lib", "@com_google_absl//absl/strings", "@fmeum_rules_jni//jni:libjvm", "@jazzer_com_github_gflags_gflags//:gflags", ], ) cc_library( name = "jvm_tooling_lib", srcs = ["jvm_tooling.cpp"], hdrs = ["jvm_tooling.h"], tags = [ # Should be built through the cc_17_library driver_lib. "manual", ], deps = [ "@bazel_tools//tools/cpp/runfiles", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@fmeum_rules_jni//jni", "@jazzer_com_github_gflags_gflags//:gflags", ], ) DYNAMIC_SYMBOLS_TO_EXPORT = [ "__sanitizer_cov_8bit_counters_init", "__sanitizer_cov_pcs_init", "__sanitizer_cov_trace_cmp1", "__sanitizer_cov_trace_cmp4", "__sanitizer_cov_trace_cmp4", "__sanitizer_cov_trace_cmp8", "__sanitizer_cov_trace_const_cmp1", "__sanitizer_cov_trace_const_cmp4", "__sanitizer_cov_trace_const_cmp4", "__sanitizer_cov_trace_const_cmp8", "__sanitizer_cov_trace_div4", "__sanitizer_cov_trace_div8", "__sanitizer_cov_trace_gep", "__sanitizer_cov_trace_pc_indir", "__sanitizer_cov_trace_switch", "__sanitizer_weak_hook_memcmp", "__sanitizer_weak_hook_memmem", "__sanitizer_weak_hook_strcasecmp", "__sanitizer_weak_hook_strcasestr", "__sanitizer_weak_hook_strcmp", "__sanitizer_weak_hook_strncasecmp", "__sanitizer_weak_hook_strncmp", "__sanitizer_weak_hook_strstr", "bcmp", "jazzer_initialize_native_hooks", "memcmp", "memmem", "strcasecmp", "strcasestr", "strcmp", "strncasecmp", "strncmp", "strstr", ] cc_library( name = "native_fuzzer_hooks", srcs = ["native_fuzzer_hooks.c"], linkopts = select({ "@platforms//os:linux": [ "-Wl,--export-dynamic-symbol=" + symbol for symbol in DYNAMIC_SYMBOLS_TO_EXPORT ] + [ "-ldl", ], "@platforms//os:macos": [ "-rdynamic", "-ldl", ], "//conditions:default": [], }), target_compatible_with = SKIP_ON_WINDOWS, deps = ["//driver/src/main/native/com/code_intelligence/jazzer/driver:sanitizer_hooks_with_pc"], alwayslink = True, ) cc_binary( name = "jazzer_driver", data = [ "//agent:jazzer_agent_deploy", ], linkopts = select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [":jazzer_main"], ) 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", ], 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", ], }) + select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [":jazzer_main"] + 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_llvm//:macos_asan_dynamic"], "//conditions:default": [], }) + select({ "@platforms//os:windows": [], "//conditions:default": [":native_fuzzer_hooks"], }), ) cc_binary( name = "jazzer_driver_ubsan", data = [ "//agent:jazzer_agent_deploy", ], 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", ], }) + select({ "//:clang_on_linux": ["-fuse-ld=lld"], "//conditions:default": [], }), linkstatic = True, visibility = ["//visibility:public"], deps = [ ":jazzer_main", ] + select({ "@platforms//os:windows": [], "//conditions:default": [":native_fuzzer_hooks"], }), ) cc_test( name = "jvm_tooling_test", size = "small", srcs = ["jvm_tooling_test.cpp"], args = [ "--cp=jazzer/$(rootpath //driver/testdata:fuzz_target_mocks_deploy.jar)", ], data = [ "//agent:jazzer_agent_deploy", "//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_test( name = "fuzzed_data_provider_test", size = "medium", srcs = ["fuzzed_data_provider_test.cpp"], args = [ "--cp=jazzer/$(rootpath //driver/testdata:fuzz_target_mocks_deploy.jar)", ], copts = select({ "@platforms//os:windows": ["/std:c++17"], "//conditions:default": ["-std=c++17"], }), data = [ "//agent:jazzer_agent_deploy", "//driver/testdata:fuzz_target_mocks_deploy.jar", ], includes = ["."], deps = [ ":jvm_tooling_lib", ":test_main", "//driver/src/main/native/com/code_intelligence/jazzer/driver:fuzzed_data_provider", "@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 = [ "@fmeum_rules_jni//jni:libjvm", "@googletest//:gtest", "@jazzer_com_github_gflags_gflags//:gflags", ], )