bpo-38631: Add _Py_NO_RETURN to functions calling Py_FatalError() (GH-18278)
Add _Py_NO_RETURN to functions calling Py_FatalError(): * _PyObject_AssertFailed() * dummy_dealloc() * faulthandler_fatal_error_thread() * none_dealloc() * notimplemented_dealloc()
This commit is contained in:
parent
17c68b8107
commit
2a4903fcce
|
@ -443,7 +443,7 @@ _PyObject_DebugTypeStats(FILE *out);
|
||||||
NDEBUG against a Python built with NDEBUG defined.
|
NDEBUG against a Python built with NDEBUG defined.
|
||||||
|
|
||||||
msg, expr and function can be NULL. */
|
msg, expr and function can be NULL. */
|
||||||
PyAPI_FUNC(void) _PyObject_AssertFailed(
|
PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed(
|
||||||
PyObject *obj,
|
PyObject *obj,
|
||||||
const char *expr,
|
const char *expr,
|
||||||
const char *msg,
|
const char *msg,
|
||||||
|
|
|
@ -1065,24 +1065,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args)
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _Py_NO_RETURN
|
||||||
faulthandler_fatal_error_thread(void *plock)
|
faulthandler_fatal_error_thread(void *plock)
|
||||||
{
|
{
|
||||||
#ifndef __clang__
|
|
||||||
PyThread_type_lock *lock = (PyThread_type_lock *)plock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Py_FatalError("in new thread");
|
Py_FatalError("in new thread");
|
||||||
|
|
||||||
#ifndef __clang__
|
|
||||||
/* Issue #28152: Py_FatalError() is declared with
|
|
||||||
__attribute__((__noreturn__)). GCC emits a warning without
|
|
||||||
"PyThread_release_lock()" (compiler bug?), but Clang is smarter and
|
|
||||||
emits a warning on the return. */
|
|
||||||
|
|
||||||
/* notify the caller that we are done */
|
|
||||||
PyThread_release_lock(lock);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
|
@ -1646,7 +1646,7 @@ none_repr(PyObject *op)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ARGUSED */
|
/* ARGUSED */
|
||||||
static void
|
static void _Py_NO_RETURN
|
||||||
none_dealloc(PyObject* ignore)
|
none_dealloc(PyObject* ignore)
|
||||||
{
|
{
|
||||||
/* This should never get called, but we also don't want to SEGV if
|
/* This should never get called, but we also don't want to SEGV if
|
||||||
|
@ -1784,7 +1784,7 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
|
||||||
Py_RETURN_NOTIMPLEMENTED;
|
Py_RETURN_NOTIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _Py_NO_RETURN
|
||||||
notimplemented_dealloc(PyObject* ignore)
|
notimplemented_dealloc(PyObject* ignore)
|
||||||
{
|
{
|
||||||
/* This should never get called, but we also don't want to SEGV if
|
/* This should never get called, but we also don't want to SEGV if
|
||||||
|
@ -2225,7 +2225,7 @@ _PyTrash_thread_destroy_chain(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void _Py_NO_RETURN
|
||||||
_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
|
_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
|
||||||
const char *file, int line, const char *function)
|
const char *file, int line, const char *function)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2529,7 +2529,7 @@ dummy_repr(PyObject *op)
|
||||||
return PyUnicode_FromString("<dummy key>");
|
return PyUnicode_FromString("<dummy key>");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _Py_NO_RETURN
|
||||||
dummy_dealloc(PyObject* ignore)
|
dummy_dealloc(PyObject* ignore)
|
||||||
{
|
{
|
||||||
Py_FatalError("deallocating <dummy key>");
|
Py_FatalError("deallocating <dummy key>");
|
||||||
|
|
Loading…
Reference in New Issue