Bug report
Bug description:
For a non-gcc/clang compiler, _Py_TYPEOF is not defined.
|
// The macro is only defined if GCC or clang compiler is used. |
|
#if defined(__GNUC__) || defined(__clang__) |
|
# define _Py_TYPEOF(expr) __typeof__(expr) |
|
#endif |
Which leads to
Py_CLEAR() fallback to an implementation with
memcpy() call.
|
#else |
|
#define Py_CLEAR(op) \ |
|
do { \ |
|
PyObject **_tmp_op_ptr = _Py_CAST(PyObject**, &(op)); \ |
|
PyObject *_tmp_old_op = (*_tmp_op_ptr); \ |
|
if (_tmp_old_op != NULL) { \ |
|
PyObject *_null_ptr = _Py_NULL; \ |
|
memcpy(_tmp_op_ptr, &_null_ptr, sizeof(PyObject*)); \ |
|
Py_DECREF(_tmp_old_op); \ |
|
} \ |
|
} while (0) |
|
#endif |
Py_CLEAR() is used in
./Modules/pwdmodule.c
|
static int pwdmodule_clear(PyObject *m) { |
|
Py_CLEAR(get_pwd_state(m)->StructPwdType); |
|
return 0; |
|
} |
without including
string.h
|
|
|
#include <errno.h> // ERANGE |
|
#include <pwd.h> // getpwuid() |
|
#include <unistd.h> // sysconf() |
|
|
For a non-gcc/clang compiler, this may fail due to missing memcpy() declaration.
./Include/object.h:1017: #define Py_CLEAR(op) do { PyObject **_tmp_op_ptr = _Py_CAST(PyObject**, &(op)); PyObject *_tmp_old_op = (*_tmp_op_ptr); if (_tmp_old_op != NULL) { PyObject *_null_ptr = _Py_NULL; memcpy(_tmp_op_ptr, &_null_ptr, sizeof(PyObject*)); Py_DECREF(_tmp_old_op); } } while (0)
^ implicit declaration of a function
./Modules/pwdmodule.c:356: Py_CLEAR(get_pwd_state(m)->StructPwdType);
^ in expansion of macro
On a side note, typeof is widely implemented among alternative C compilers like TinyCC and cproc, kefir, chibicc, and is standardized in C23. It could be beneficial to enable typeof usage through configure option or probing, instead of hard-coded off on non-gcc/clang compilers.
CPython versions tested on:
3.13
Operating systems tested on:
Linux
Linked PRs
Bug report
Bug description:
For a non-
gcc/clangcompiler,_Py_TYPEOFis not defined.cpython/Include/pyport.h
Lines 548 to 551 in c08a302
Which leads to
Py_CLEAR()fallback to an implementation withmemcpy()call.cpython/Include/object.h
Lines 1016 to 1027 in c08a302
Py_CLEAR()is used in./Modules/pwdmodule.ccpython/Modules/pwdmodule.c
Lines 355 to 358 in c08a302
without including
string.hcpython/Modules/pwdmodule.c
Lines 12 to 16 in c08a302
For a non-
gcc/clangcompiler, this may fail due to missingmemcpy()declaration.On a side note,
typeofis widely implemented among alternative C compilers like TinyCC and cproc, kefir, chibicc, and is standardized in C23. It could be beneficial to enabletypeofusage throughconfigureoption or probing, instead of hard-coded off on non-gcc/clangcompilers.CPython versions tested on:
3.13
Operating systems tested on:
Linux
Linked PRs