mirror of https://github.com/python/cpython
bpo-46913: Fix test_faulthandler.test_sigfpe() on UBSAN (GH-31662)
Disable undefined behavior sanitizer (UBSAN) on faulthandler_sigfpe().
This commit is contained in:
parent
127797f572
commit
4173d677a1
|
@ -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.
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue