bpo-46913: Fix test_faulthandler.test_sigfpe() on UBSAN (GH-31662)

Disable undefined behavior sanitizer (UBSAN) on
faulthandler_sigfpe().
This commit is contained in:
Victor Stinner 2022-03-03 21:45:01 +01:00 committed by GitHub
parent 127797f572
commit 4173d677a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 2 deletions

View File

@ -0,0 +1,3 @@
Fix test_faulthandler.test_sigfpe() if Python is built with undefined
behavior sanitizer (UBSAN): disable UBSAN on the faulthandler_sigfpe()
function. Patch by Victor Stinner.

View File

@ -1102,17 +1102,35 @@ faulthandler_fatal_error_c_thread(PyObject *self, PyObject *args)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
static PyObject * // clang uses __attribute__((no_sanitize("undefined")))
// GCC 4.9+ uses __attribute__((no_sanitize_undefined))
#if defined(__has_feature) // Clang
# if __has_feature(undefined_behavior_sanitizer)
# define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
# endif
#endif
#if defined(__GNUC__) \
&& ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9))
# define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined))
#endif
#ifndef _Py_NO_SANITIZE_UNDEFINED
# define _Py_NO_SANITIZE_UNDEFINED
#endif
static PyObject* _Py_NO_SANITIZE_UNDEFINED
faulthandler_sigfpe(PyObject *self, PyObject *args) faulthandler_sigfpe(PyObject *self, PyObject *args)
{ {
faulthandler_suppress_crash_report();
/* Do an integer division by zero: raise a SIGFPE on Intel CPU, but not on /* Do an integer division by zero: raise a SIGFPE on Intel CPU, but not on
PowerPC. Use volatile to disable compile-time optimizations. */ PowerPC. Use volatile to disable compile-time optimizations. */
volatile int x = 1, y = 0, z; volatile int x = 1, y = 0, z;
faulthandler_suppress_crash_report();
z = x / y; z = x / y;
/* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC), /* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC),
raise it manually. */ raise it manually. */
raise(SIGFPE); raise(SIGFPE);
/* This line is never reached, but we pretend to make something with z /* This line is never reached, but we pretend to make something with z
to silence a compiler warning. */ to silence a compiler warning. */
return PyLong_FromLong(z); return PyLong_FromLong(z);