FRET-LibAFL/scripts/parallellize_cargo_clippy_on_fuzzers.py
Dongjia "toka" Zhang 7a9f46b9fb
Remove nightly from CI. (#3232)
* stable ci

* fixer

* aa

* no -z flag

* doc

* ??

* this one needs

* nightly for some of them ..

* turn off fail fast for now 🥱

* aaa

* afasdfasfas

* mm

* tmate

* linker's fault

* fixer

* f

* dfsafdasfasf
2025-05-16 15:23:44 +02:00

101 lines
3.1 KiB
Python

#!/usr/bin/env python3
import os
import subprocess
import sys
import argparse
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor, as_completed
import multiprocessing
import logging
def main():
# Parse command-line arguments
parser = argparse.ArgumentParser(description="Run Clippy on fuzzers in parallel.")
parser.add_argument(
"--dry-run", action="store_true", help="Show commands without executing."
)
parser.add_argument(
"--pedantic", action="store_true", help="Activate all clippy warnings"
)
args = parser.parse_args()
# Setup logging
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler(sys.stdout)],
)
if args.dry_run:
logging.info("Dry-run mode enabled. Commands will not be executed.")
# Set directories
script_dir = Path(__file__).resolve().parent
libafl_dir = script_dir.parent
os.chdir(libafl_dir)
logging.debug(f"Changed directory to {libafl_dir}")
# Initialize git submodules
cmd = "git submodule update --init"
logging.info(f"Running: {cmd}")
if not args.dry_run:
subprocess.run(cmd, shell=True, check=True)
# Find fuzzer directories
fuzzers = list((libafl_dir / "fuzzers").glob("*/*"))
fuzzers.extend(list((libafl_dir / "fuzzers/baby/backtrace_baby_fuzzers").glob("*")))
fuzzers = [f for f in fuzzers if "nyx_" not in f.name and f.is_dir()]
logging.debug(f"Found {len(fuzzers)} fuzzers.")
# Function to run commands
def run_clippy(fuzzer: Path):
if not (fuzzer / "Cargo.toml").is_file():
logging.info(f"No Cargo.toml for {fuzzer}, skipping…")
return True
options = "-D clippy::pedantic" if args.pedantic else ""
cmd_default = f"cargo clippy -- -D warnings {options}"
for cmd in [cmd_default]:
logging.info(f"[{fuzzer}] Running: {cmd}")
if args.dry_run:
continue
result = subprocess.run(
cmd,
shell=True,
cwd=fuzzer,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
if result.returncode != 0:
logging.error(
f"[{fuzzer}] Command failed: cd {fuzzer}; {cmd}\n{result.stderr}"
)
return False
else:
logging.info(f"[{fuzzer}] Clippy passed.")
return True
# Run Clippy in parallel
with ThreadPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
futures = {executor.submit(run_clippy, fuzzer): fuzzer for fuzzer in fuzzers}
success = True
for future in as_completed(futures):
if not future.result():
success = False
if success:
logging.info("All fuzzers passed Clippy.")
sys.exit(0)
else:
logging.error("Some fuzzers failed Clippy.")
sys.exit(1)
if __name__ == "__main__":
main()