mirror of
https://github.com/python/cpython.git
synced 2025-09-18 22:50:26 +00:00
bpo-44363: Get test_capi passing with address sanitizer (GH-26639)
This commit is contained in:
parent
54cb63863f
commit
31aa0dbff4
3 changed files with 17 additions and 1 deletions
|
@ -63,13 +63,22 @@
|
||||||
#include "pyport.h"
|
#include "pyport.h"
|
||||||
#include "pymacro.h"
|
#include "pymacro.h"
|
||||||
|
|
||||||
/* A convenient way for code to know if clang's memory sanitizer is enabled. */
|
/* A convenient way for code to know if sanitizers are enabled. */
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
# if __has_feature(memory_sanitizer)
|
# if __has_feature(memory_sanitizer)
|
||||||
# if !defined(_Py_MEMORY_SANITIZER)
|
# if !defined(_Py_MEMORY_SANITIZER)
|
||||||
# define _Py_MEMORY_SANITIZER
|
# define _Py_MEMORY_SANITIZER
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
# if __has_feature(address_sanitizer)
|
||||||
|
# if !defined(_Py_ADDRESS_SANITIZER)
|
||||||
|
# define _Py_ADDRESS_SANITIZER
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
# if defined(__SANITIZE_ADDRESS__)
|
||||||
|
# define _Py_ADDRESS_SANITIZER
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "pymath.h"
|
#include "pymath.h"
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Account for address sanitizer in test_capi. test_capi now passes when run
|
||||||
|
GCC address sanitizer.
|
|
@ -4784,6 +4784,10 @@ check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args
|
||||||
static PyObject*
|
static PyObject*
|
||||||
check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
|
check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
|
||||||
{
|
{
|
||||||
|
/* This test would fail if run with the address sanitizer */
|
||||||
|
#ifdef _Py_ADDRESS_SANITIZER
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
#else
|
||||||
PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
|
PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
|
||||||
if (op == NULL) {
|
if (op == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -4793,6 +4797,7 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
|
||||||
Py_SET_REFCNT(op, 1);
|
Py_SET_REFCNT(op, 1);
|
||||||
/* object memory is freed! */
|
/* object memory is freed! */
|
||||||
return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
|
return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue