blob: cc34fb782dc19dbce70212bf2ac5a0c70322cef4 [file] [log] [blame]
Matt Johnstonabe9b372024-11-11 17:17:44 +08001#!/usr/bin/env python3
2# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
3
4# Builds fuzzing variants. Run this from the toplevel directory.
5# Beware this will wipe build directories.
6
7# Requires honggfuzz and afl++ installed
8
9# Builds are:
10# * AFL (normal, asan, cmplog)
11# * honggfuzz
12# * -O0, with coverage
13
14import os
15import subprocess
16
17# reduce warning level since tests since gtest is noisy
18BASE_MESONFLAGS = "-Dwarning_level=2 -Ddefault_library=static --wipe".split()
19FUZZ_PROGRAMS = ["tests/fuzz/fd-fuzz"]
20
21
22def build(
23 build_dir: str,
24 cc: str = None,
25 cxx: str = None,
26 cflags="",
27 cxxflags="",
28 opt="3",
29 env={},
30 mesonflags=[],
31):
32 env = os.environ | env
33 env["CFLAGS"] = cflags
34 env["CXXFLAGS"] = cxxflags
35
36 # Meson sets CC="ccache cc" by default, but ccache removes -fprofile-arcs
37 # so coverage breaks (ccache #1531). Prevent that by setting CC/CXX.
38 env["CC"] = cc if cc else "cc"
39 env["CXX"] = cxx if cxx else "c++"
40
41 meson_cmd = ["meson"] + BASE_MESONFLAGS + mesonflags
42 meson_cmd += [f"-Doptimization={opt}"]
43 meson_cmd += [build_dir]
44 subprocess.run(meson_cmd, env=env, check=True)
45
46 ninja_cmd = ["ninja", "-C", build_dir] + FUZZ_PROGRAMS
47 subprocess.run(ninja_cmd, env=env, check=True)
48
49
50def build_afl():
51 env = {
52 # seems to be required for afl-clang-lto?
53 "AFL_REAL_LD": "ld.lld",
54 }
55 cc = "afl-clang-lto"
56 cxx = "afl-clang-lto++"
57
58 # normal
59 build("bfuzz", cc=cc, cxx=cxx, env=env)
60 # ASAN
61 build(
62 "bfuzzasan",
63 cc=cc,
64 cxx=cxx,
65 mesonflags=["-Db_sanitize=address"],
66 env=env,
67 )
68 # cmplog
69 build("bcmplog", cc=cc, cxx=cxx, env={"AFL_LLVM_CMPLOG": "1"} | env)
70
71
72def main():
73 # No profiling, has coverage
74 build(
75 "bnoopt",
76 cflags="-fprofile-abs-path",
77 cxxflags="-fprofile-abs-path",
78 opt="0",
79 mesonflags=["-Db_coverage=true"],
80 )
81
82 # AFL
83 build_afl()
84
85 # Honggfuzz
86 build("bhf", cc="hfuzz-clang", cxx="hfuzz-clang++")
87
88
89if __name__ == "__main__":
90 main()