git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/2] fuzz: link fuzz programs with `make all` on Linux

From
Josh Steadmon <steadmon@google.com>
Date
Mar 5, 2024, 21:12 UTC
Message-ID
<eef15e3d3da3ca6953fa8bf3ade190da8e68bf46.1709673020.git.steadmon@google.com>
In-Reply-To
<cover.1709673020.git.steadmon@google.com>

Since 5e47215080 (fuzz: add basic fuzz testing target., 2018-10-12), we have compiled object files for the fuzz tests as part of the default 'make all' target. This helps prevent bit-rot in lesser-used parts of the codebase, by making sure that incompatible changes are caught at build time.

However, since we never linked the fuzzer executables, this did not protect us from link-time errors. As of 8b9a42bf48 (fuzz: fix fuzz test build rules, 2024-01-19), it's now possible to link the fuzzer executables without using a fuzzing engine and a variety of compiler-specific (and compiler-version-specific) flags, at least on Linux. So let's add a platform-specific option in config.mak.uname to link the executables as part of the default `make all` target.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Makefile         | 14 +++++++++++---
 config.mak.uname |  1 +
 2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
index 4e255c81f2..f74e96d7c2 100644
--- a/Makefile
+++ b/Makefile
@@ -409,6 +409,9 @@ include shared.mak
 # to the "<name>" of the corresponding `compat/fsmonitor/fsm-settings-<name>.c`
 # that implements the `fsm_os_settings__*()` routines.
 #
+# Define LINK_FUZZ_PROGRAMS if you want `make all` to also build the fuzz test
+# programs in oss-fuzz/.
+#
 # === Optional library: libintl ===
 #
 # Define NO_GETTEXT if you don't want Git output to be translated.
@@ -763,9 +766,6 @@ FUZZ_OBJS += oss-fuzz/fuzz-pack-idx.o
 .PHONY: fuzz-objs
 fuzz-objs: $(FUZZ_OBJS)
 
-# Always build fuzz objects even if not testing, to prevent bit-rot.
-all:: $(FUZZ_OBJS)
-
 FUZZ_PROGRAMS += $(patsubst %.o,%,$(filter-out %dummy-cmd-main.o,$(FUZZ_OBJS)))
 
 # Empty...
@@ -2368,6 +2368,14 @@ ifndef NO_TCLTK
 endif
 	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
 
+# Build fuzz programs if possible, or at least compile the object files; even
+# without the necessary fuzzing support, this prevents bit-rot.
+ifdef LINK_FUZZ_PROGRAMS
+all:: $(FUZZ_PROGRAMS)
+else
+all:: $(FUZZ_OBJS)
+endif
+
 please_set_SHELL_PATH_to_a_more_modern_shell:
 	@$$(:)
 
diff --git a/config.mak.uname b/config.mak.uname
index dacc95172d..6579c36a99 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -68,6 +68,7 @@ ifeq ($(uname_S),Linux)
 	ifneq ($(findstring .el7.,$(uname_R)),)
 		BASIC_CFLAGS += -std=c99
 	endif
+	LINK_FUZZ_PROGRAMS = YesPlease
 endif
 ifeq ($(uname_S),GNU/kFreeBSD)
 	HAVE_ALLOCA_H = YesPlease
-- 
2.44.0.278.ge034bb2e1d-goog
Previous: Josh SteadmonNext: Junio C Hamano
Message 8 of 23 in “fuzz: build fuzzers by default on Linux”
  1. 0/2 fuzz: build fuzzers by default on LinuxJosh Steadmon, Mar 5, 2024
  2. 1/2 ci: also define CXX environment variableJosh Steadmon, Mar 5, 2024
  3. Junio C HamanoMar 5, 2024
  4. Josh SteadmonApr 9, 2024
  5. Jeff KingMar 6, 2024
  6. Jeff KingMar 6, 2024
  7. Josh SteadmonApr 10, 2024
  8. 2/2 fuzz: link fuzz programs with `make all` on LinuxJosh Steadmon, Mar 5, 2024
  9. Junio C HamanoMar 5, 2024
  10. Josh SteadmonApr 9, 2024
  11. Josh SteadmonApr 10, 2024
  12. Junio C HamanoApr 10, 2024
  13. Jeff KingApr 10, 2024
  14. Junio C HamanoMar 26, 2024
  15. Josh SteadmonApr 9, 2024
  16. 0/2 fuzz: build fuzzers by default on LinuxJosh Steadmon, Apr 11, 2024
  17. 1/2 ci: also define CXX environment variableJosh Steadmon, Apr 11, 2024
  18. Jeff KingApr 12, 2024
  19. Josh SteadmonApr 24, 2024
  20. 2/2 fuzz: link fuzz programs with `make all` on LinuxJosh Steadmon, Apr 11, 2024
  21. Junio C HamanoApr 11, 2024
  22. fuzz: link fuzz programs with `make all` on LinuxJosh Steadmon, Apr 24, 2024
  23. Junio C HamanoApr 24, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.