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:
Victor Stinner 2020-01-30 13:09:11 +01:00 committed by GitHub
parent 17c68b8107
commit 2a4903fcce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 6 additions and 20 deletions

View File

@ -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,

View File

@ -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 *

View File

@ -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)
{ {

View File

@ -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>");