Adding support for building AFLpp

Test: Build AFL fuzzers locally and ran them

Change-Id: Ie4fbd258c87663cf81d7d64d575b3da1d5febc17
This commit is contained in:
Cory Barker
2022-06-07 20:12:06 +00:00
parent 87d74dc54e
commit a1da26fa9b
6 changed files with 358 additions and 72 deletions

View File

@@ -3342,6 +3342,125 @@ func TestErrorsIfAModuleDependsOnDisabled(t *testing.T) {
`)
}
func TestAFLFuzzTarget(t *testing.T) {
ctx := testCc(t, `
cc_afl_fuzz {
name: "test_afl_fuzz_target",
srcs: ["foo.c"],
host_supported: true,
static_libs: [
"afl_fuzz_static_lib",
],
shared_libs: [
"afl_fuzz_shared_lib",
],
}
cc_fuzz {
name: "test_fuzz_target",
srcs: ["foo.c"],
static_libs: [
"afl_fuzz_static_lib",
"libfuzzer_only_static_lib",
],
shared_libs: [
"afl_fuzz_shared_lib",
],
}
cc_library {
name: "afl_fuzz_static_lib",
host_supported: true,
srcs: ["static_file.c"],
}
cc_library {
name: "libfuzzer_only_static_lib",
host_supported: true,
srcs: ["static_file.c"],
}
cc_library {
name: "afl_fuzz_shared_lib",
host_supported: true,
srcs: ["shared_file.c"],
static_libs: [
"second_static_lib",
],
}
cc_library_headers {
name: "libafl_headers",
vendor_available: true,
host_supported: true,
export_include_dirs: [
"include",
"instrumentation",
],
}
cc_object {
name: "afl-compiler-rt",
vendor_available: true,
host_supported: true,
cflags: [
"-fPIC",
],
srcs: [
"instrumentation/afl-compiler-rt.o.c",
],
}
cc_library {
name: "second_static_lib",
host_supported: true,
srcs: ["second_file.c"],
}
filegroup {
name: "aflpp_driver",
srcs: [
"aflpp_driver.c",
],
}`)
checkPcGuardFlag := func(
modName string, variantName string, shouldHave bool) {
cc := ctx.ModuleForTests(modName, variantName).Rule("cc")
cFlags, ok := cc.Args["cFlags"]
if !ok {
t.Errorf("Could not find cFlags for module %s and variant %s",
modName, variantName)
}
if strings.Contains(
cFlags, "-fsanitize-coverage=trace-pc-guard") != shouldHave {
t.Errorf("Flag was found: %t. Expected to find flag: %t. "+
"Test failed for module %s and variant %s",
!shouldHave, shouldHave, modName, variantName)
}
}
for _, vnt := range ctx.ModuleVariantsForTests("libfuzzer_only_static_lib") {
if strings.Contains(vnt, "fuzzer_afl") {
t.Errorf("libfuzzer_only_static_lib has afl variant and should not")
}
}
moduleName := "test_afl_fuzz_target"
variantName := "android_arm64_armv8-a_fuzzer_afl"
checkPcGuardFlag(moduleName, variantName, true)
moduleName = "afl_fuzz_static_lib"
variantName = "android_arm64_armv8-a_static"
checkPcGuardFlag(moduleName, variantName, false)
checkPcGuardFlag(moduleName, variantName+"_fuzzer", false)
checkPcGuardFlag(moduleName, variantName+"_fuzzer_afl", true)
moduleName = "second_static_lib"
checkPcGuardFlag(moduleName, variantName, false)
checkPcGuardFlag(moduleName, variantName+"_fuzzer", false)
checkPcGuardFlag(moduleName, variantName+"_fuzzer_afl", true)
ctx.ModuleForTests("afl_fuzz_shared_lib",
"android_arm64_armv8-a_shared").Rule("cc")
ctx.ModuleForTests("afl_fuzz_shared_lib",
"android_arm64_armv8-a_shared_fuzzer_afl").Rule("cc")
}
// Simple smoke test for the cc_fuzz target that ensures the rule compiles
// correctly.
func TestFuzzTarget(t *testing.T) {