From 0c7a26ebd508399886338b33c239cca6e25da18e Mon Sep 17 00:00:00 2001 From: guping Date: Thu, 13 Nov 2025 10:34:19 +0800 Subject: [PATCH] iotests: Run iotests with sanitizers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 2cc4d1c5eab1 ("tests/check-block: Skip iotests when sanitizers are enabled") changed iotests to skip when sanitizers are enabled. The rationale is that AddressSanitizer emits warnings and reports leaks, which results in test breakage. Later, sanitizers that are enabled for production environments (safe-stack and cfi-icall) were exempted. However, this approach has a few problems. - It requires rebuild to disable sanitizers if the existing build has them enabled. - It disables other useful non-production sanitizers. - The exemption of safe-stack and cfi-icall is not correctly implemented, so qemu-iotests are incorrectly enabled whenever either safe-stack or cfi-icall is enabled *and*, even if there is another sanitizer like AddressSanitizer. To solve these problems, direct AddressSanitizer warnings to separate files to avoid changing the test results, and selectively disable leak detection at runtime instead of requiring to disable all sanitizers at buildtime. Signed-off-by: Akihiko Odaki Message-ID: <20251023-iotests-v1-2-fab143ca4c2f@rsg.ci.i.u-tokyo.ac.jp> Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf Signed-off-by: guping --- tests/qemu-iotests/meson.build | 8 -------- tests/qemu-iotests/testrunner.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build index 53847cb98f..3054e4b792 100644 --- a/tests/qemu-iotests/meson.build +++ b/tests/qemu-iotests/meson.build @@ -2,14 +2,6 @@ if not have_tools or targetos == 'windows' subdir_done() endif -foreach cflag: qemu_ldflags - if cflag.startswith('-fsanitize') and \ - not cflag.contains('safe-stack') and not cflag.contains('cfi-icall') - message('Sanitizers are enabled ==> Disabled the qemu-iotests.') - subdir_done() - endif -endforeach - bash = find_program('bash', required: false, version: '>= 4.0') if not bash.found() message('bash >= v4.0 not available ==> Disabled the qemu-iotests.') diff --git a/tests/qemu-iotests/testrunner.py b/tests/qemu-iotests/testrunner.py index 7b322272e9..8fffb6b652 100644 --- a/tests/qemu-iotests/testrunner.py +++ b/tests/qemu-iotests/testrunner.py @@ -265,10 +265,21 @@ def do_run_test(self, test: str) -> TestResult: Path(env[d]).mkdir(parents=True, exist_ok=True) test_dir = env['TEST_DIR'] + f_asan = Path(test_dir, f_test.name + '.out.asan') f_bad = Path(test_dir, f_test.name + '.out.bad') f_notrun = Path(test_dir, f_test.name + '.notrun') f_casenotrun = Path(test_dir, f_test.name + '.casenotrun') + env['ASAN_OPTIONS'] = f'detect_leaks=0:log_path={f_asan}' + + def unlink_asan(): + with os.scandir(test_dir) as it: + for entry in it: + if entry.name.startswith(f_asan.name): + os.unlink(entry) + + unlink_asan() + for p in (f_notrun, f_casenotrun): silent_unlink(p) @@ -314,6 +325,7 @@ def do_run_test(self, test: str) -> TestResult: description=f'output mismatch (see {f_bad})', diff=diff, casenotrun=casenotrun) else: + unlink_asan() f_bad.unlink() return TestResult(status='pass', elapsed=elapsed, casenotrun=casenotrun) -- Gitee