Repository navigation
Closed
Labels
type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
For a non-gcc/clang compiler, _Py_TYPEOF is not defined.
Lines 548 to 551 in c08a302
| // 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.Lines 1016 to 1027 in c08a302
| #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.cLines 355 to 358 in c08a302
| static int pwdmodule_clear(PyObject *m) { | |
| Py_CLEAR(get_pwd_state(m)->StructPwdType); | |
| return 0; | |
| } |
without including
string.hLines 12 to 16 in c08a302
| #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
- gh-121617: Include string.h in pwdmodule.c if _Py_TYPEOF is undefined #121643
- gh-121617: Include <string.h> for Py_CLEAR() macro #144666
- gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL #157067
- [3.15] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (GH-157067) #157186
- [3.14] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (#157067) #157187
- gh-121617: Fix Py_CLEAR() memcpy in C++: replace NULL with _Py_NULL #157188
- [3.13] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (#157067) #157189
Metadata
Metadata
Assignees
Labels
type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
- StatusShow more project fieldsDone
Activity
pythongh-121617: Include <string.h> for Py_CLEAR() macro (python#144666)
pythongh-121617: Include <string.h> for Py_CLEAR() macro (python#144666)
pythongh-121617: Include <string.h> for Py_CLEAR() macro (python#144666)
gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (#157067)
pythongh-121617: Fix Py_CLEAR() memcpy in C++: replace NULL with _Py_…
pythongh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (p…
[3.14] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (#…
[3.13] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (#…
gh-121617: Fix Py_CLEAR() memcpy in C++: replace NULL with _Py_NULL (#…
Merge branch 'main' into tachyon-native-callable
pythongh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (p…
pythongh-121617: Fix Py_CLEAR() memcpy in C++: replace NULL with _Py_…
pythongh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (p…
pythongh-121617: Fix Py_CLEAR() memcpy in C++: replace NULL with _Py_…
[3.15] gh-121617: Fix Py_CLEAR() in C++: replace NULL with _Py_NULL (G…