Repository navigation
Python.h doesn't follow C99 standard. #120293
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jun 9, 2024 It's trivial to catch.
$ cat /tmp/foo.c #include <Python.h>$ gcc -std=c99 -Werror=pedantic -I/usr/include/python3.13 -c /tmp/foo.c -o /tmp/foo.o In file included from /usr/include/python3.13/Python.h:92, from /tmp/foo.c:1: /usr/include/python3.13/cpython/code.h:32:10: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic] 32 | }; | ^ /usr/include/python3.13/cpython/code.h:34:6: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic] 34 | }; | ^ /usr/include/python3.13/cpython/code.h:27:9: error: struct has no named members [-Werror=pedantic] 27 | typedef struct { | ^~~~~~ In file included from /usr/include/python3.13/Python.h:128: /usr/include/python3.13/cpython/optimizer.h:60:14: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic] 60 | }; | ^ /usr/include/python3.13/cpython/optimizer.h:62:10: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic] 62 | }; | ^ /usr/include/python3.13/cpython/optimizer.h:63:6: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic] 63 | }; | ^ cc1: some warnings being treated as errorsIf the objective is to continue supporting external users of Python.h that unlike cpython, haven't upgraded to c11 -- then this seems like a useful unittest to add.
- addedbuildThe build process and cross-buildThe build process and cross-build
on Jun 11, 2024 The Python C API doesn't support
-Werror=pedanticcompiler flag. I don't think that it's a flag that we want to support. I suggest closing the issue as "WONT FIX".If I try to build test_cext with that flag, the compiler fails early:
building 'cext' extension gcc -fno-strict-overflow -Wsign-compare -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -Og -Wall -fPIC -I/home/vstinner/python/main/env/include -I/home/vstinner/python/main/Include -I/home/vstinner/python/main -c extension.c -o build/temp.linux-x86_64-cpython-314-pydebug/extension.o -Werror -Werror=pedantic -Werror=declaration-after-statement -DMODULE_NAME=cext extension.c:56:19: error: ISO C forbids conversion of function pointer to object pointer type [-Werror=pedantic] 56 | {Py_mod_exec, (void*)_testcext_exec}, | ^- changed the title
[-]C extension compilation errors with various checks enabled[/-][+]C extension compilation errors with various checks enabled (-Werror=pedantic)[/+]on Jun 11, 2024 Hmm. -pedantic support is not documented in PEP 7. Any pointers for a documentation here?
That being said - the change of title is not right. It was one -pedantic error (with C99 - it does work with C11, thatswhy the question about version compat). However, the first error is related to -Wcast-qual (and definitely seems valid to me).
If I try to build test_cext with that flag, the compiler fails early:
building 'cext' extension gcc -fno-strict-overflow -Wsign-compare -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -Og -Wall -fPIC -I/home/vstinner/python/main/env/include -I/home/vstinner/python/main/Include -I/home/vstinner/python/main -c extension.c -o build/temp.linux-x86_64-cpython-314-pydebug/extension.o -Werror -Werror=pedantic -Werror=declaration-after-statement -DMODULE_NAME=cext extension.c:56:19: error: ISO C forbids conversion of function pointer to object pointer type [-Werror=pedantic] 56 | {Py_mod_exec, (void*)_testcext_exec}, | ^I'd like to add that it's not about compiling my extension, I can deal with that. It's simply about including Python.h.
I'd like to add that it's not about compiling my extension, I can deal with that.
What I mean is that it seems impossible to build any non-trivial C extension with
-Werror=pedantic, since Python requires syntax which is denied by-Werror=pedantic. Like my example.My example comes from Lib/test/test_cext/extension.c which is a trivial C extension which does basically nothing.
IMO, the headers should definitely compile in pedantic mode with
-std=c11, since that checks we actually use the standard we chose.
Possibly with C99 too. IMO, having an anonymous union in the public headers is a regression in 3.13.FWIW, I'm casting the member functions like this and gcc doesn't complain:
#define EXT_CFUNC(func) ((PyCFunction)(void (*) (void))(func)) [...] PyDoc_STRVAR(myfunc__doc__, "myfunc(self)..."); [...] static PyObject * myfunc(mytype_t *self) { ... return someobject; } [...] static PyMethodDef mytype_methods[] = { [...] {"somename", EXT_CFUNC(myfunc), METH_NOARGS, myfunc__doc__}, [...]
I looked into the headers, to verify what I'm doing here and I might have just stolen that from _PyCFunction_CAST (methodobject.h) a long time ago. I don't remember.
And again, to make sure it doesn't get lost in the discussion: I've started off with another error not related to
-pedantic:/usr/include/python3.13/cpython/pyatomic_gcc.h: In function '_Py_atomic_load_ptr': /usr/include/python3.13/cpython/pyatomic_gcc.h:300:34: error: cast discards 'const' qualifier from pointer target type [-Werror=cast-qual] 300 | { return (void *)__atomic_load_n((void **)obj, __ATOMIC_SEQ_CST); } | ^ /usr/include/python3.13/cpython/pyatomic_gcc.h: In function '_Py_atomic_load_ptr_relaxed': /usr/include/python3.13/cpython/pyatomic_gcc.h:359:34: error: cast discards 'const' qualifier from pointer target xt (line 8))Should I open another issue for that one?
Good idea, please open a separated issue for the cast issue in pyatomic_gcc.h.
Good idea, please open a separated issue for the cast issue in pyatomic_gcc.h.
Done.
- changed the title
[-]C extension compilation errors with various checks enabled (-Werror=pedantic)[/-][+]Python.h doesn't follow C99 standard.[/+]on Jun 16, 2024 I've changed the title to reflect the actual issue I was seeing (modulo the const messup).
code.h:32:10: error: ISO C99 doesn't support unnamed structs/unions [-Werror=pedantic]
I fixed this issue with 9e4a81f by moving private PyCode and PyOptimizer types to the internal C API.
Good idea, please open a separated issue for the cast issue in pyatomic_gcc.h.
Done.It's the issue #120593
I fixed this issue with 9e4a81f by moving private PyCode and PyOptimizer types to the internal C API.
I tested manually and I confirm that the "ISO C99 doesn’t support unnamed structs/unions" warnings have been fixed (in code.h). I close the issue.
See the remaining issue #120593 for the const qualifier.
Thank you!
Thanks for your report.
Bug report
Bug description:
Hi,
I'm trying to test my C extensions with Python 3.13. For testing I usually enable as many error checks as possible. I'm seeing a couple of them. Python version is:
Some errors are related to losing const qualifiers:
Some related to C99 compatibility (not sure what the current expected compat version is):
Thanks,
CPython versions tested on:
3.13
Operating systems tested on:
Linux