14
14
15
15
"""The implementation of the {cc, java}_fuzz_test rules."""
16
16
17
+ load ("@rules_fuzzing_oss_fuzz//:instrum.bzl" , "native_library_sanitizer" )
17
18
load ("@rules_cc//cc:defs.bzl" , "cc_binary" )
18
19
19
20
# FIXME: Including this leads to a Stardoc error since defs.bzl is not visible. As a workaround, use native.java_binary.
@@ -213,6 +214,15 @@ def cc_fuzz_test(
213
214
test_timeout = timeout ,
214
215
)
215
216
217
+ _ASAN_RUNTIME = Label ("//fuzzing/private/runtime:asan" )
218
+ _UBSAN_RUNTIME = Label ("//fuzzing/private/runtime:ubsan" )
219
+ _RUNTIME_BY_NAME = {
220
+ "asan" : _ASAN_RUNTIME ,
221
+ "ubsan" : _UBSAN_RUNTIME ,
222
+ "none" : None ,
223
+ }
224
+
225
+ # buildifier: disable=list-append
216
226
def java_fuzz_test (
217
227
name ,
218
228
srcs = None ,
@@ -264,6 +274,8 @@ def java_fuzz_test(
264
274
# this target directly. Instead, the binary should be built through the
265
275
# instrumented configuration.
266
276
raw_target_name = name + "_target_"
277
+ metadata_binary_name = name + "_metadata_"
278
+ metadata_deploy_jar_name = metadata_binary_name + "_deploy.jar"
267
279
268
280
# Determine a value for target_class heuristically using the same rules as
269
281
# those used by Bazel internally for main_class.
@@ -277,62 +289,71 @@ def java_fuzz_test(
277
289
name = name ,
278
290
))
279
291
target_class_manifest_line = "Jazzer-Fuzz-Target-Class: %s" % target_class
280
- binary_kwargs .setdefault ("deps" , [])
281
292
282
- # Use += rather than append to allow users to pass in select() expressions for
283
- # deps, which only support concatenation with +.
284
- # Workaround for https://github.com/bazelbuild/bazel/issues/14157.
285
- # buildifier: disable=list-append
286
- binary_kwargs ["deps" ] += [engine ]
287
- binary_kwargs .setdefault ("deploy_manifest_lines" , [])
293
+ native .java_binary (
294
+ name = metadata_binary_name ,
295
+ deploy_manifest_lines = [target_class_manifest_line ],
296
+ tags = ["manual" ],
297
+ )
288
298
289
- # buildifier: disable=list-append
290
- binary_kwargs ["deploy_manifest_lines" ] += [target_class_manifest_line ]
299
+ # use += rather than append to allow users to pass in select() expressions for
300
+ # deps, which only support concatenation with +.
301
+ # workaround for https://github.com/bazelbuild/bazel/issues/14157.
302
+ if srcs :
303
+ binary_kwargs .setdefault ("deps" , [])
304
+ binary_kwargs ["deps" ] += [engine , metadata_deploy_jar_name ]
305
+ else :
306
+ binary_kwargs .setdefault ("runtime_deps" , [])
307
+ binary_kwargs ["runtime_deps" ] += [engine , metadata_deploy_jar_name ]
308
+
309
+ binary_kwargs .setdefault ("jvm_flags" , [])
310
+ binary_kwargs ["jvm_flags" ] = [
311
+ # Ensures that full stack traces are emitted for findings even in highly
312
+ # optimized code.
313
+ "-XX:-OmitStackTraceInFastThrow" ,
314
+ # Optimized for throughput rather than latency.
315
+ "-XX:+UseParallelGC" ,
316
+ # Ignore CriticalJNINatives if not available (JDK 18+).
317
+ "-XX:+IgnoreUnrecognizedVMOptions" ,
318
+ # Improves performance of Jazzer's native compare instrumentation.
319
+ "-XX:+CriticalJNINatives" ,
320
+ ] + binary_kwargs ["jvm_flags" ]
291
321
292
322
# tags is not configurable and can thus use append.
293
323
binary_kwargs .setdefault ("tags" , []).append ("manual" )
294
324
native .java_binary (
295
325
name = raw_target_name ,
296
326
srcs = srcs ,
297
- create_executable = False ,
327
+ main_class = "com.code_intelligence.jazzer.Jazzer" ,
298
328
** binary_kwargs
299
329
)
300
330
301
331
raw_binary_name = name + "_raw_"
302
332
jazzer_fuzz_binary (
303
333
name = raw_binary_name ,
304
- agent = select ({
305
- "@rules_fuzzing//fuzzing/private:use_oss_fuzz" : "@rules_fuzzing_oss_fuzz//:jazzer_agent_deploy.jar" ,
306
- "//conditions:default" : "@jazzer//agent:jazzer_agent_deploy.jar" ,
334
+ sanitizer = select ({
335
+ "@rules_fuzzing//fuzzing/private:is_oss_fuzz" : native_library_sanitizer ,
336
+ "@rules_fuzzing//fuzzing/private:use_asan" : "asan" ,
337
+ "@rules_fuzzing//fuzzing/private:use_ubsan" : "ubsan" ,
338
+ "//conditions:default" : "none" ,
307
339
}),
308
- # Since the choice of sanitizer is explicit for local fuzzing, we also
309
- # let it apply to projects with no native dependencies.
310
- driver_java_only = select ({
311
- "@rules_fuzzing//fuzzing/private:use_oss_fuzz" : "@rules_fuzzing_oss_fuzz//:jazzer_driver" ,
312
- "@rules_fuzzing//fuzzing/private:use_sanitizer_none" : "@jazzer//driver:jazzer_driver" ,
313
- "@rules_fuzzing//fuzzing/private:use_sanitizer_asan" : "@jazzer//driver:jazzer_driver_asan" ,
314
- "@rules_fuzzing//fuzzing/private:use_sanitizer_ubsan" : "@jazzer//driver:jazzer_driver_ubsan" ,
315
- }, no_match_error = "Jazzer only supports the sanitizer settings: \" none\" , \" asan\" , \" ubsan\" " ),
316
- driver_with_native = select ({
317
- "@rules_fuzzing//fuzzing/private:use_oss_fuzz" : "@rules_fuzzing_oss_fuzz//:jazzer_driver_with_sanitizer" ,
318
- "@rules_fuzzing//fuzzing/private:use_sanitizer_none" : "@jazzer//driver:jazzer_driver" ,
319
- "@rules_fuzzing//fuzzing/private:use_sanitizer_asan" : "@jazzer//driver:jazzer_driver_asan" ,
320
- "@rules_fuzzing//fuzzing/private:use_sanitizer_ubsan" : "@jazzer//driver:jazzer_driver_ubsan" ,
321
- }, no_match_error = "Jazzer only supports the sanitizer settings: \" none\" , \" asan\" , \" ubsan\" " ),
322
340
sanitizer_options = select ({
323
- "@rules_fuzzing//fuzzing/private:use_oss_fuzz" : "@rules_fuzzing//fuzzing/private:oss_fuzz_jazzer_sanitizer_options.sh" ,
324
- "//conditions:default" : "@rules_fuzzing//fuzzing/private:local_jazzer_sanitizer_options.sh" ,
341
+ "@rules_fuzzing//fuzzing/private:is_oss_fuzz" : Label ("//fuzzing/private:oss_fuzz_jazzer_sanitizer_options.sh" ),
342
+ "//conditions:default" : Label ("//fuzzing/private:local_jazzer_sanitizer_options.sh" ),
343
+ }),
344
+ sanitizer_runtime = select ({
345
+ "@rules_fuzzing//fuzzing/private:is_oss_fuzz" : _RUNTIME_BY_NAME [native_library_sanitizer ],
346
+ "@rules_fuzzing//fuzzing/private:use_asan" : _ASAN_RUNTIME ,
347
+ "@rules_fuzzing//fuzzing/private:use_ubsan" : _UBSAN_RUNTIME ,
348
+ "//conditions:default" : None ,
325
349
}),
326
- tags = ["manual" ],
327
350
target = raw_target_name ,
328
- target_deploy_jar = raw_target_name + "_deploy.jar" ,
351
+ tags = [ "manual" ] ,
329
352
)
330
353
331
354
fuzzing_decoration (
332
355
name = name ,
333
356
raw_binary = raw_binary_name ,
334
- # jazzer_fuzz_binary already instrumented the native dependencies.
335
- instrument_binary = False ,
336
357
engine = engine ,
337
358
corpus = corpus ,
338
359
dicts = dicts ,
0 commit comments