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

[PATCH v2 1/8] Support coverage testing with GCC/gcov

From
Thomas Rast <trast@student.ethz.ch>
Date
Feb 19, 2009, 11:13 UTC
Message-ID
<fe8993f99f8459f74f704a488cdffbd4cf10b0fd.1235041345.git.trast@student.ethz.ch>
In-Reply-To
<cover.1235041345.git.trast@student.ethz.ch>

With gcc's --coverage option, we can perform automatic coverage data collection for the test suite.

Add a new Makefile target 'coverage' that scraps all previous coverage results, recompiles git with the required compiler/linker flags (in addition to any flags you specify manually), then runs the test suite and compiles a report.

The compilation must be done with all optimizations disabled, since inlined functions (and for line-by-line coverage, also optimized branches/loops) break coverage tracking.

The tests are run serially (with -j1). The coverage code should theoretically allow concurrent access to its data files, but the author saw random test failures. Obviously this could be improved.

The report currently consists of a list of functions that were never executed during the tests, which is written to 'coverage-untested-functions'. Once this list becomes reasonably short, we would also want to look at branches that were never taken.

Currently only toplevel *.c files are considered. It would be nice to at least include xdiff, but --coverage did not save data to subdirectories on the system used to write this (gcc 4.3.2).

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---

Let the 'all' sub-build of 'coverage' run with the caller's -j setting so that it can parallelize.

Interdiff:
   --- a/Makefile
   +++ b/Makefile
  @@ -21,8 +21,9 @@
   +COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
   +
   +coverage-build: coverage-clean
  ++      $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
   +      $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
  -+              -j1 all test
  ++              -j1 test
   +
   +coverage-report:
   +      gcov -b *.c
 Makefile |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
index b040a96..c32881b 100644
--- a/Makefile
+++ b/Makefile
@@ -1640,3 +1640,27 @@ check-docs::
 check-builtins::
 	./check-builtins.sh

+### Test suite coverage testing
+#
+.PHONY: coverage coverage-clean coverage-build coverage-report
+
+coverage:
+	$(MAKE) coverage-build
+	$(MAKE) coverage-report
+
+coverage-clean:
+	rm -f *.gcda *.gcno
+
+COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
+COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
+
+coverage-build: coverage-clean
+	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
+	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
+		-j1 test
+
+coverage-report:
+	gcov -b *.c
+	grep '^function.*called 0 ' *.c.gcov \
+		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
+		| tee coverage-untested-functions
--
1.6.2.rc1.266.gce6c4
Previous: Thomas RastNext: Thomas Rast
Message 3 of 19 in “What's cooking in git.git (Feb 2009, #06; Wed, 18)”
  1. Junio C HamanoFeb 19, 2009
  2. 0/8 Support coverage testing with GCC/gcovThomas Rast, Feb 19, 2009
  3. 1/8 Support coverage testing with GCC/gcovThomas Rast, Feb 19, 2009
  4. 2/8 Test that diff can read from stdinThomas Rast, Feb 19, 2009
  5. 3/8 Test diff --dirstat functionalityThomas Rast, Feb 19, 2009
  6. 4/8 Test log --graphThomas Rast, Feb 19, 2009
  7. 5/8 Test fsck a bit harderThomas Rast, Feb 19, 2009
  8. Test fsck a bit harderThomas Rast, Feb 20, 2009
  9. Johannes SixtFeb 20, 2009
  10. Test fsck a bit harderThomas Rast, Feb 21, 2009
  11. Johannes SixtFeb 21, 2009
  12. Test fsck a bit harderThomas Rast, Mar 1, 2009
  13. Junio C HamanoMar 3, 2009
  14. 6/8 Test log --decorateThomas Rast, Feb 19, 2009
  15. 7/8 Test rev-list --parents/--childrenThomas Rast, Feb 19, 2009
  16. 8/8 Test git-patch-idThomas Rast, Feb 19, 2009
  17. Johannes SchindelinFeb 19, 2009
  18. Thomas RastFeb 19, 2009
  19. Sverre RabbelierFeb 19, 2009

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.