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: >-
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
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
@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
@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("""
@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("""
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) {