From 61c02cc5371395fc919b49b14ce253a151f2fa93 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Fri, 9 Jun 2023 14:06:44 -0400 Subject: rust: Bundle Rust shared dependencies in fuzzers Rust shared library dependencies are not always bundled in cc_fuzz or rust_fuzz modules, which can lead to difficult to debug runtime errors when running these fuzzers. It can also be hard to determine which dependencies need to be explicitly declared. This CL makes sure that we bundle the appropriate transitive dependencies for our fuzzers. Bug: 249551848 Test: Soong tests Test: m # check data/fuzz//lib dir contents Change-Id: I957ca8898079b61e2ff20d750f8c92bf61ac394f --- rust/fuzz_test.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'rust/fuzz_test.go') diff --git a/rust/fuzz_test.go b/rust/fuzz_test.go index 7fa9f5c8f..0aecf617e 100644 --- a/rust/fuzz_test.go +++ b/rust/fuzz_test.go @@ -19,6 +19,7 @@ import ( "testing" "android/soong/android" + "android/soong/cc" ) func TestRustFuzz(t *testing.T) { @@ -59,3 +60,68 @@ func TestRustFuzz(t *testing.T) { t.Errorf("rust_fuzz dependent library does not contain the expected flags (sancov-module, cfg fuzzing).") } } + +func TestRustFuzzDepBundling(t *testing.T) { + ctx := testRust(t, ` + cc_library { + name: "libcc_transitive_dep", + } + cc_library { + name: "libcc_direct_dep", + } + rust_library { + name: "libtest_fuzzing", + crate_name: "test_fuzzing", + srcs: ["foo.rs"], + shared_libs: ["libcc_transitive_dep"], + } + rust_fuzz { + name: "fuzz_libtest", + srcs: ["foo.rs"], + rustlibs: ["libtest_fuzzing"], + shared_libs: ["libcc_direct_dep"], + } + `) + + fuzz_libtest := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module) + + if !strings.Contains(fuzz_libtest.FuzzSharedLibraries().String(), ":libcc_direct_dep.so") { + t.Errorf("rust_fuzz does not contain the expected bundled direct shared libs ('libcc_direct_dep'): %#v", fuzz_libtest.FuzzSharedLibraries().String()) + } + if !strings.Contains(fuzz_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") { + t.Errorf("rust_fuzz does not contain the expected bundled transitive shared libs ('libcc_transitive_dep'): %#v", fuzz_libtest.FuzzSharedLibraries().String()) + } +} + +func TestCCFuzzDepBundling(t *testing.T) { + ctx := testRust(t, ` + cc_library { + name: "libcc_transitive_dep", + } + rust_ffi { + name: "libtest_fuzzing", + crate_name: "test_fuzzing", + srcs: ["foo.rs"], + shared_libs: ["libcc_transitive_dep"], + } + cc_fuzz { + name: "fuzz_shared_libtest", + shared_libs: ["libtest_fuzzing"], + } + cc_fuzz { + name: "fuzz_static_libtest", + static_libs: ["libtest_fuzzing"], + } + + `) + + fuzz_shared_libtest := ctx.ModuleForTests("fuzz_shared_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) + fuzz_static_libtest := ctx.ModuleForTests("fuzz_static_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) + + if !strings.Contains(fuzz_shared_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") { + t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_shared ('libcc_transitive_dep'): %#v", fuzz_shared_libtest.FuzzSharedLibraries().String()) + } + if !strings.Contains(fuzz_static_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") { + t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_static ('libcc_transitive_dep'): %#v", fuzz_static_libtest.FuzzSharedLibraries().String()) + } +} -- cgit v1.2.3-59-g8ed1b