mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-46913: Fix test_ctypes, test_hashlib, test_faulthandler on UBSan (GH-31675) (GH-31676)
* bpo-46913: Fix test_faulthandler.test_sigfpe() on UBSAN (GH-31662) Disable undefined behavior sanitizer (UBSAN) on faulthandler_sigfpe(). (cherry picked from commit4173d677a1) * bpo-46913: Fix test_faulthandler.test_read_null() on UBSan (GH31672) Disable undefined behavior sanitizer (UBSan) on faulthandler._read_null(). (cherry picked from commit65b92ccdec) * 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 commit6d0d7d2b8c) * 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 commitad1b04451d) (cherry picked from commit7b5b429ada)
This commit is contained in:
parent
09819863a3
commit
6a14330318
4 changed files with 43 additions and 12 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
from ctypes import *
|
from ctypes import *
|
||||||
from ctypes.test import need_symbol
|
from ctypes.test import need_symbol
|
||||||
|
from test import support
|
||||||
import unittest
|
import unittest
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
@ -39,6 +40,8 @@ def test_ints(self):
|
||||||
setattr(b, name, i)
|
setattr(b, name, i)
|
||||||
self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii')))
|
self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii')))
|
||||||
|
|
||||||
|
# bpo-46913: _ctypes/cfield.c h_get() has an undefined behavior
|
||||||
|
@support.skip_if_sanitizer(ub=True)
|
||||||
def test_shorts(self):
|
def test_shorts(self):
|
||||||
b = BITS()
|
b = BITS()
|
||||||
name = "M"
|
name = "M"
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,9 @@ def get_fips_mode():
|
||||||
except ImportError:
|
except ImportError:
|
||||||
_sha3 = None
|
_sha3 = None
|
||||||
|
|
||||||
requires_sha3 = unittest.skipUnless(_sha3, 'requires _sha3')
|
# bpo-46913: Don't test the _sha3 extension on a Python UBSAN build
|
||||||
|
SKIP_SHA3 = support.check_sanitizer(ub=True)
|
||||||
|
requires_sha3 = unittest.skipUnless(not SKIP_SHA3 and _sha3, 'requires _sha3')
|
||||||
|
|
||||||
|
|
||||||
def hexstr(s):
|
def hexstr(s):
|
||||||
|
|
@ -129,6 +131,8 @@ def __init__(self, *args, **kwargs):
|
||||||
|
|
||||||
self.constructors_to_test = {}
|
self.constructors_to_test = {}
|
||||||
for algorithm in algorithms:
|
for algorithm in algorithms:
|
||||||
|
if SKIP_SHA3 and algorithm.startswith('sha3_'):
|
||||||
|
continue
|
||||||
self.constructors_to_test[algorithm] = set()
|
self.constructors_to_test[algorithm] = set()
|
||||||
|
|
||||||
# For each algorithm, test the direct constructor and the use
|
# For each algorithm, test the direct constructor and the use
|
||||||
|
|
@ -181,6 +185,7 @@ def add_builtin_constructor(name):
|
||||||
add_builtin_constructor('blake2s')
|
add_builtin_constructor('blake2s')
|
||||||
add_builtin_constructor('blake2b')
|
add_builtin_constructor('blake2b')
|
||||||
|
|
||||||
|
if not SKIP_SHA3:
|
||||||
_sha3 = self._conditional_import_module('_sha3')
|
_sha3 = self._conditional_import_module('_sha3')
|
||||||
if _sha3:
|
if _sha3:
|
||||||
add_builtin_constructor('sha3_224')
|
add_builtin_constructor('sha3_224')
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -27,6 +27,23 @@
|
||||||
|
|
||||||
#define PUTS(fd, str) _Py_write_noraise(fd, str, strlen(str))
|
#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(enable);
|
||||||
_Py_IDENTIFIER(fileno);
|
_Py_IDENTIFIER(fileno);
|
||||||
_Py_IDENTIFIER(flush);
|
_Py_IDENTIFIER(flush);
|
||||||
|
|
@ -1010,7 +1027,7 @@ faulthandler_suppress_crash_report(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject* _Py_NO_SANITIZE_UNDEFINED
|
||||||
faulthandler_read_null(PyObject *self, PyObject *args)
|
faulthandler_read_null(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
volatile int *x;
|
volatile int *x;
|
||||||
|
|
@ -1099,17 +1116,20 @@ faulthandler_fatal_error_c_thread(PyObject *self, PyObject *args)
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
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…
Add table
Add a link
Reference in a new issue