mirror of
https://github.com/python/cpython.git
synced 2026-06-28 03:41:13 +00:00
[3.15] gh-151278: Fix test_faulthandler on UBSan (GH-151279) (#151281)
gh-151278: Fix test_faulthandler on UBSan (GH-151279)
* Py_FatalError() no longer calls _PyFaulthandler_Fini() if it
doesn't hold the GIL.
* Skip test_faulthandler tests raising signals if run with UBSan.
* Enable test_faulthandler in GitHub Action "Reusable Sanitizer".
(cherry picked from commit e60c42dc3f)
Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
parent
10f616cf39
commit
e8d914fd49
3 changed files with 14 additions and 7 deletions
4
.github/workflows/reusable-san.yml
vendored
4
.github/workflows/reusable-san.yml
vendored
|
|
@ -82,13 +82,13 @@ jobs:
|
|||
run: make -j4
|
||||
- name: Display build info
|
||||
run: make pythoninfo
|
||||
# test_{capi,faulthandler} are skipped under UBSan because
|
||||
# test_capi is skipped under UBSan because
|
||||
# they raise signals that UBSan with halt_on_error=1 intercepts.
|
||||
- name: Tests
|
||||
run: >-
|
||||
./python -m test
|
||||
${{ inputs.sanitizer == 'TSan' && '--tsan' || '' }}
|
||||
${{ inputs.sanitizer == 'UBSan' && '-x test_capi -x test_faulthandler' || '' }}
|
||||
${{ inputs.sanitizer == 'UBSan' && '-x test_capi' || '' }}
|
||||
-j4 -W
|
||||
- name: Parallel tests
|
||||
if: >-
|
||||
|
|
|
|||
|
|
@ -33,6 +33,11 @@
|
|||
CURRENT_THREAD_HEADER = fr'{CURRENT_THREAD_ID} \(most recent call first\):'
|
||||
|
||||
|
||||
def skip_if_sanitizer_signal(signame):
|
||||
return support.skip_if_sanitizer(f"TSAN/UBSan itercepts {signame}",
|
||||
thread=True, ub=True)
|
||||
|
||||
|
||||
def expected_traceback(lineno1, lineno2, header, min_count=1):
|
||||
regex = header
|
||||
regex += ' File "<string>", line %s in func\n' % lineno1
|
||||
|
|
@ -224,7 +229,7 @@ def test_fatal_error_c_thread(self):
|
|||
func='faulthandler_fatal_error_thread',
|
||||
py_fatal_error=True)
|
||||
|
||||
@support.skip_if_sanitizer("TSAN itercepts SIGABRT", thread=True)
|
||||
@skip_if_sanitizer_signal("SIGABRT")
|
||||
def test_sigabrt(self):
|
||||
self.check_fatal_error("""
|
||||
import faulthandler
|
||||
|
|
@ -236,7 +241,7 @@ def test_sigabrt(self):
|
|||
|
||||
@unittest.skipIf(sys.platform == 'win32',
|
||||
"SIGFPE cannot be caught on Windows")
|
||||
@support.skip_if_sanitizer("TSAN itercepts SIGFPE", thread=True)
|
||||
@skip_if_sanitizer_signal("SIGFPE")
|
||||
def test_sigfpe(self):
|
||||
self.check_fatal_error("""
|
||||
import faulthandler
|
||||
|
|
@ -248,7 +253,7 @@ def test_sigfpe(self):
|
|||
|
||||
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
||||
@unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS')
|
||||
@support.skip_if_sanitizer("TSAN itercepts SIGBUS", thread=True)
|
||||
@skip_if_sanitizer_signal("SIGBUS")
|
||||
@skip_segfault_on_android
|
||||
def test_sigbus(self):
|
||||
self.check_fatal_error("""
|
||||
|
|
@ -263,7 +268,7 @@ def test_sigbus(self):
|
|||
|
||||
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
||||
@unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL')
|
||||
@support.skip_if_sanitizer("TSAN itercepts SIGILL", thread=True)
|
||||
@skip_if_sanitizer_signal("SIGILL")
|
||||
@skip_segfault_on_android
|
||||
def test_sigill(self):
|
||||
self.check_fatal_error("""
|
||||
|
|
|
|||
|
|
@ -3724,7 +3724,9 @@ fatal_error(int fd, int header, const char *prefix, const char *msg,
|
|||
This function already did its best to display a traceback.
|
||||
Disable faulthandler to prevent writing a second traceback
|
||||
on abort(). */
|
||||
_PyFaulthandler_Fini();
|
||||
if (has_tstate_and_gil) {
|
||||
_PyFaulthandler_Fini();
|
||||
}
|
||||
|
||||
/* Check if the current Python thread hold the GIL */
|
||||
if (has_tstate_and_gil) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue