Merge pull request #23000 from mrc0mmand/coverage__exit

macro: call __gcov_dump() before _exit() w/ coverage enabled
This commit is contained in:
Frantisek Sumsal 2022-04-07 13:08:55 +00:00 committed by GitHub
commit 673d1f4ab9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 2 deletions

View file

@ -47,6 +47,9 @@ fuzzer_build = want_ossfuzz or want_libfuzzer
# More items are added later after they have been detected.
summary({'build mode' : get_option('mode')})
# GCOV doesn't define any macro when compiled with, so let's define it ourselves
conf.set10('BUILT_WITH_COVERAGE', get_option('b_coverage'))
#####################################################################
# Try to install the git pre-commit hook

View file

@ -29,6 +29,19 @@
#define _alignptr_ __attribute__((__aligned__(sizeof(void*))))
#define _warn_unused_result_ __attribute__((__warn_unused_result__))
#if defined(BUILT_WITH_COVERAGE) && BUILT_WITH_COVERAGE
/* We need to explicitly call __gcov_dump() in places where we use _exit(), since
* _exit() skips at-exit hooks resulting in lost coverage */
# include <unistd.h>
extern void __gcov_dump(void);
_noreturn_ static inline void _coverage__exit(int status) {
__gcov_dump();
_exit(status);
}
# define _exit(x) _coverage__exit(x)
#endif
#if !defined(HAS_FEATURE_MEMORY_SANITIZER)
# if defined(__has_feature)
# if __has_feature(memory_sanitizer)

View file

@ -4,6 +4,10 @@ set -e
TEST_DESCRIPTION="Run unit tests under containers"
RUN_IN_UNPRIVILEGED_CONTAINER=yes
# Some tests make collecting coverage impossible (like test-mount-util, which
# remounts the whole / as read-only), so let's ignore the gcov errors in such
# case
IGNORE_MISSING_COVERAGE=yes
# embed some newlines in the kernel command line to stress our test suite
KERNEL_APPEND="

View file

@ -1406,8 +1406,8 @@ check_coverage_reports() {
# usually due to the sandbox being too restrictive (e.g. ProtectSystem=yes,
# ProtectHome=yes) or the $BUILD_DIR being inaccessible to non-root users - see
# `setfacl` stuff in install_compiled_systemd().
if "${JOURNALCTL:?}" -q --no-pager -D "${root:?}/var/log/journal" --grep "profiling:.+?gcda:[Cc]annot open"; then
if ! get_bool "${IGNORE_MISSING_COVERAGE:=}" && \
"${JOURNALCTL:?}" -q --no-pager -D "${root:?}/var/log/journal" --grep "profiling:.+?gcda:[Cc]annot open"; then
derror "Detected possibly missing coverage, check the journal"
return 1
fi