From: Victor Stinner Date: Thu, 30 Jan 2020 12:09:11 +0000 (+0100) Subject: bpo-38631: Add _Py_NO_RETURN to functions calling Py_FatalError() (GH-18278) X-Git-Tag: v3.9.0a4~168 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2a4903fcce54c25807d362dbbbcfb32d0b494f9f;p=thirdparty%2FPython%2Fcpython.git 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() --- diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 75e55995b574..dc8fd6fa8987 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -443,7 +443,7 @@ _PyObject_DebugTypeStats(FILE *out); NDEBUG against a Python built with NDEBUG defined. msg, expr and function can be NULL. */ -PyAPI_FUNC(void) _PyObject_AssertFailed( +PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( PyObject *obj, const char *expr, const char *msg, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index b19401e94d85..555e1afc9f82 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1065,24 +1065,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static void +static void _Py_NO_RETURN faulthandler_fatal_error_thread(void *plock) { -#ifndef __clang__ - PyThread_type_lock *lock = (PyThread_type_lock *)plock; -#endif - 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 * diff --git a/Objects/object.c b/Objects/object.c index c5d28e5f8d75..67a6386e2a51 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1646,7 +1646,7 @@ none_repr(PyObject *op) } /* ARGUSED */ -static void +static void _Py_NO_RETURN none_dealloc(PyObject* ignore) { /* 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; } -static void +static void _Py_NO_RETURN notimplemented_dealloc(PyObject* ignore) { /* 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, const char *file, int line, const char *function) { diff --git a/Objects/setobject.c b/Objects/setobject.c index 924885d7505a..bb7c0b8f0456 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2529,7 +2529,7 @@ dummy_repr(PyObject *op) return PyUnicode_FromString(""); } -static void +static void _Py_NO_RETURN dummy_dealloc(PyObject* ignore) { Py_FatalError("deallocating ");