[Python-checkins] Fix test_faulthandler for sanitizers (#108245)

vstinner webhook-mailer at python.org
Mon Aug 21 21:16:15 EDT 2023


https://github.com/python/cpython/commit/58f9c635002673e35a56eeaa122cade7a2b6bae1
commit: 58f9c635002673e35a56eeaa122cade7a2b6bae1
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2023-08-22T01:16:12Z
summary:

Fix test_faulthandler for sanitizers (#108245)

Set environment options to ask sanitizers to not handle SIGSEGV.

This change allows running test_enable_fd() and test_enable_file()
with sanitizers. Previously, they were skipped.

files:
M Lib/test/test_faulthandler.py

diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 2e97de592712c..907c2cda86cba 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -9,7 +9,6 @@
 from test import support
 from test.support import os_helper
 from test.support import script_helper, is_android
-from test.support import skip_if_sanitizer
 import tempfile
 import unittest
 from textwrap import dedent
@@ -64,8 +63,20 @@ def get_output(self, code, filename=None, fd=None):
         pass_fds = []
         if fd is not None:
             pass_fds.append(fd)
+        env = dict(os.environ)
+
+        # Sanitizers must not handle SIGSEGV (ex: for test_enable_fd())
+        option = 'handle_segv=0'
+        for name in ('ASAN_OPTIONS', 'MSAN_OPTIONS', 'UBSAN_OPTIONS'):
+            if name in env:
+                env[name] += f':{option}'
+            else:
+                env[name] = option
+
         with support.SuppressCrashReport():
-            process = script_helper.spawn_python('-c', code, pass_fds=pass_fds)
+            process = script_helper.spawn_python('-c', code,
+                                                 pass_fds=pass_fds,
+                                                 env=env)
             with process:
                 output, stderr = process.communicate()
                 exitcode = process.wait()
@@ -304,8 +315,6 @@ def test_gil_released(self):
             3,
             'Segmentation fault')
 
-    @skip_if_sanitizer(memory=True, ub=True, reason="sanitizer "
-                       "builds change crashing process output.")
     @skip_segfault_on_android
     def test_enable_file(self):
         with temporary_filename() as filename:
@@ -321,8 +330,6 @@ def test_enable_file(self):
 
     @unittest.skipIf(sys.platform == "win32",
                      "subprocess doesn't support pass_fds on Windows")
-    @skip_if_sanitizer(memory=True, ub=True, reason="sanitizer "
-                       "builds change crashing process output.")
     @skip_segfault_on_android
     def test_enable_fd(self):
         with tempfile.TemporaryFile('wb+') as fp:



More information about the Python-checkins mailing list