Clean up memory leak warnings from ASAN and Valgrind

* src/main.c (main): Add "sanitize" to .FEATURES if ASAN is enabled.
* src/expand.c (expand_variable_output): Remember "recursive" setting
in case it's changed by the expansion of the variable.
* src/file.c (rehash_file): If we drop a file from the global 'files'
hash, remember it in rehashed_files.  We can't free it because it's
still being referenced (callers will invoke check_renamed()) but
it will be a leak since it's no longer referenced by 'files'.
* src/remake.c (update_file_1): If we drop a dependency, remember it
in dropped_list.  We can't free it because it's still being referenced
by callers but it will be a leak since it's no longer referenced as
a prerequisite.
* tests/scripts/functions/guile: Don't run Guile tests when ASAN is
enabled.
* tests/scripts/functions/wildcard: Enabling ASAN causes glob(3) to
break!  Don't run this test.
* tests/scripts/features/exec: Valgrind's exec() doesn't support
scripts with no shbang.
* tests/scripts/jobserver: Valgrind fails if TMPDIR is set to an
invalid directory: skip those tests.
* tests/scripts/features/output-sync: Ditto.
* tests/scripts/features/temp_stdin: Ditto.
This commit is contained in:
Paul Smith
2023-03-26 15:35:00 -04:00
parent 23f70b0cb8
commit 9db74434cd
11 changed files with 89 additions and 36 deletions

View File

@@ -15,7 +15,11 @@ my $details = "The various shells that this test uses are the default"
$port_type eq 'UNIX' or return -1;
$^O =~ /cygwin/ and return -1;
my @shbangs = ('', '#!/bin/sh', "#!$perl_name");
my @shbangs = ('#!/bin/sh', "#!$perl_name");
# The exec in Valgrind's VM doesn't allow starting commands without any shbang
$valgrind or push @shbangs, '';
my @shells = ('', 'SHELL=/bin/sh');
# Try whatever shell the user has, as long as it's not a C shell.

View File

@@ -168,7 +168,8 @@ if ($port_type ne 'W32') {
"all 1\nall 2\nrecurse");
}
if (exists $FEATURES{'jobserver-fifo'}) {
# We can't reset TMPDIR to something invalid when using valgrind
if (exists $FEATURES{'jobserver-fifo'} && !$valgrind) {
# sv 62908.
# Test that when mkfifo fails, make switches to pipe and succeeds.
# Force mkfifo to fail by attempting to create a fifo in a non existent

View File

@@ -380,17 +380,23 @@ unlink($fout);
# Create a non-writable temporary directory.
# Run the test twice, because run_make_test cannot match a regex against a
# multiline input.
my $tdir = 'test_tmp_dir';
mkdir($tdir, 0500);
$ENV{'TMPDIR'} = $tdir;
run_make_test(q!
# If we do this Valgrind fails because it cannot write temp files... the docs
# don't describe any way to tell valgrind to use a directory other than TMPDIR.
if (!$valgrind) {
my $tdir = 'test_tmp_dir';
mkdir($tdir, 0500);
$ENV{'TMPDIR'} = $tdir;
run_make_test(q!
all:; $(info hello, world)
!, '-Orecurse', "/suppressing output-sync/");
run_make_test(undef, '-Orecurse', "/#MAKE#: 'all' is up to date./");
run_make_test(undef, '-Orecurse', "/#MAKE#: 'all' is up to date./");
rmdir($tdir);
rmdir($tdir);
}
}
# This tells the test driver that the perl test script executed properly.

View File

@@ -115,16 +115,21 @@ rmdir($tmakedir);
# makefile from stdin to a temporary file.
# Create a non-writable temporary directory.
my $tdir = 'test_tmp_dir';
mkdir($tdir, 0500);
$ENV{'TMPDIR'} = $tdir;
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
# If we do this Valgrind fails because it cannot write temp files... the docs
# don't describe any way to tell valgrind to use a directory other than TMPDIR.
run_make_test(q!
if (!$valgrind) {
my $tdir = 'test_tmp_dir';
mkdir($tdir, 0500);
$ENV{'TMPDIR'} = $tdir;
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
run_make_test(q!
all:; $(info hello, world)
!, '-f-', '/cannot store makefile from stdin to a temporary file. Stop./', 512);
rmdir($tdir);
rmdir($tdir);
}
}
# This close MUST come at the end of the test!!

View File

@@ -21,7 +21,8 @@ $details = 'This only works on systems that support it.';
# If we don't have Guile support, never mind.
exists $FEATURES{guile} or return -1;
# Guile and Valgrind don't play together at all.
# Guile and Valgrind/ASAN don't play together at all.
exists $FEATURES{sanitize} and return -1;
$valgrind and return -1;
# Verify simple data type conversions

View File

@@ -150,8 +150,9 @@ if ($port_type ne 'W32' && eval { symlink("",""); 1 }) {
# Test for dangling symlinks
# This doesn't work with the built-in glob... needs to be updated!
# It also for some obscure reason, will break if we use ASAN!!
if (get_config('USE_SYSTEM_GLOB') eq 'yes') {
if (get_config('USE_SYSTEM_GLOB') eq 'yes' && !exists($FEATURES{sanitize})) {
symlink($dir, $lnk);
run_make_test(qq!all: ; \@echo \$(wildcard $lnk)!, '', "$lnk");