diff options
author | Victor Stinner <vstinner@python.org> | 2022-03-04 00:12:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-04 00:12:06 (GMT) |
commit | 7b5b429adab4fe0fe81858fe3831f06adc2e2141 (patch) | |
tree | bc9db05408a18ddf2552c9ca66cef862ccd8ba87 /Modules | |
parent | 9d9dc59d07d51d73e5af7dd506d0da63aa336995 (diff) | |
download | cpython-7b5b429adab4fe0fe81858fe3831f06adc2e2141.zip cpython-7b5b429adab4fe0fe81858fe3831f06adc2e2141.tar.gz cpython-7b5b429adab4fe0fe81858fe3831f06adc2e2141.tar.bz2 |
[3.10] bpo-46913: Fix test_ctypes, test_hashlib, test_faulthandler on UBSan (GH-31675)
* bpo-46913: Fix test_faulthandler.test_sigfpe() on UBSAN (GH-31662)
Disable undefined behavior sanitizer (UBSAN) on
faulthandler_sigfpe().
(cherry picked from commit 4173d677a1d7c72bb32d292fbff1b4cf073d615c)
* bpo-46913: Fix test_faulthandler.test_read_null() on UBSan (GH31672)
Disable undefined behavior sanitizer (UBSan) on
faulthandler._read_null().
(cherry picked from commit 65b92ccdec2ee4a99e54aaf7ae2d9bbc2ebfe549)
* bpo-46913: test_hashlib skips _sha3 tests on UBSan (GH-31673)
If Python is built with UBSan, test_hashlib skips tests on the _sha3
extension which currently has undefined behaviors.
This change allows to run test_hashlib to check for new UBSan regression,
but the known _sha3 undefined behavior must be fixed.
(cherry picked from commit 6d0d7d2b8c1e04fd51c6cb29cc09a41b60b97b7b)
* bpo-46913: Skip test_ctypes.test_shorts() on UBSan (GH-31674)
If Python is built with UBSan, test_ctypes now skips test_shorts().
This change allows to run test_ctypes to check for new UBSan regression,
but the known test_shorts() undefined behavior must be fixed.
(cherry picked from commit ad1b04451d3aca2c6fa6dbe2891676a4e0baac49)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/faulthandler.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 350f4cf..e03f6d9 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -29,6 +29,23 @@ #define PUTS(fd, str) _Py_write_noraise(fd, str, strlen(str)) + +// 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 + + _Py_IDENTIFIER(enable); _Py_IDENTIFIER(fileno); _Py_IDENTIFIER(flush); @@ -1014,7 +1031,7 @@ faulthandler_suppress_crash_report(void) #endif } -static PyObject * +static PyObject* _Py_NO_SANITIZE_UNDEFINED faulthandler_read_null(PyObject *self, PyObject *args) { volatile int *x; @@ -1103,17 +1120,20 @@ faulthandler_fatal_error_c_thread(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static PyObject * +static PyObject* _Py_NO_SANITIZE_UNDEFINED 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 PowerPC. Use volatile to disable compile-time optimizations. */ volatile int x = 1, y = 0, z; - faulthandler_suppress_crash_report(); z = x / y; + /* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC), raise it manually. */ raise(SIGFPE); + /* This line is never reached, but we pretend to make something with z to silence a compiler warning. */ return PyLong_FromLong(z); |