-
-
Notifications
You must be signed in to change notification settings - Fork 32k
Meta: Clean up various issues in C internals #84124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
This is a meta-ticket for a number of small PRs that clean up some internals. Issues will include:
|
What is the rationale for adding const? For example, does the PR 19185 fix any compiler warning or any bug? While PR 19185 is correct, I am not sure that we should modify the 607K lines of C code of CPython to add const everywhere. I'm fine with using const for new code, but I'm not sure that it's worth it to modify exiting code. |
It doesn't quiet any compiler warnings given the default compiler warnings that ./configure sets. However, it does quiet the -Wcast-qual compiler warning that could be a helpful addition some time in the future. I think it would be great, for example, if it were made impossible to send a pointer that points at a string literal into a function that would modify its contents. Consting pointers also helps static analyzers like splint by letting it know the intent of the API. It makes it possible for the analyzer to detect uninitialized buffers, for example. All of the 20 or so patches that I've submitted, like bpo-39770 that you merged, have come about from my cranking up the warning options on both GCC and clang and sifting through the warnings. My hope is that by making more things const, we can detect existing bugs and prevent new ones. You say "I'm not sure that it's worth it to modify exiting code." Is your concern the amount of work it would take to find the problems? If so, it's not that much work when you let the compiler find the problems, which I've done. I've already spent the time digging and validating. |
Aha, that's intesting. It helps me if I can see that your change fix a compiler warning that I can reproduce. If I build Objects/obmalloc.c with -Wcast-qual using GCC 9.2.1 (on Fedora 31), I get: Objects/obmalloc.c:2455:66: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] But I get no warning for pymemallocator_eq(). About the (void *) cast, it was added by Zackery Spytz in bpo-36594: commit 1a2252e
(...)
Extract of the issue: """ ptr.c: In function ‘main’: We should check that GCC doesn't emit warning with -pedantic nor -Wcast-qual, and when both flags are combined :-) |
Casting tail to (void *)tail was the correct thing to do. The problem is that casting to void* casts away the constness of tail. The even more correct thing to do is what my patch does, which is cast it to (const void *)tail. There is no functional difference between sending a const void * and a void * to fprintf. However, it's one more bit of noise for -Wcast-qual to gripe about. My hope is to clear up the noise to find the real problems. For example, if you had this very bad code: const char *msg = "literal";
strcpy(msg, "another string"); then the compiler would complain you're passing a non-const char * to the first arg of strcpy that wants a const char *. That's a good thing. However, you could naively change that to:
and that would compile just fine, but the code would still be a big problem. It would require -Wcast-qual to warn you that you're casting away the constness of a pointer. ... For pymemallocator_eq, changing the arguments to const doesn't quiet any warnings in this case with this one function. However, it's good to make them const because the arguments are not getting modified. They're getting passed to memcmp(), which properly takes const void *. |
Not sure if it's related to changes made recently on this issue, but I started to notice these compiler warnings on Windows: D:\a\cpython\cpython\Modules\sre_lib.h(822,21): warning C4090: 'function': different 'const' qualifiers [D:\a\cpython\cpython\PCbuild\pythoncore.vcxproj] |
Yes, it is a consequence of PR 19345. But it looks like a compiler bug. It complains about implicit conversion from |
I remember coming across a similar error from GCC about casting from a const double pointer to a single pointer void and it said (I believe) something about having to have each cast having to be valid. I think it was implying something like that if you have const void **p you have to cast that as (void *)(const void *)p I will see if I can find that message and/or I can find out more about this cast problem in the Windows compiler. |
I'm assuming that you're getting this sre_lib.h error when compiling Modules/_sre.c. |
Is it possible to add an explicit cast to make the compiler warnings quiet? |
For sre.c, this is definitely a bug in MSVC, see:
I'm trying to get rid of MSVC warnings to unblock #18532 so I'll make a pull request that adds explicit casts for this. |
If someone is interested, there is a one remaining compiler warning in frameobject.c which is likely easy to fix: D:\a\cpython\cpython\Objects\frameobject.c(400,1): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data [D:\a\cpython\cpython\PCbuild\pythoncore.vcxproj] See https://bugs.python.org/issue40228#msg368383 --- Moreover, the following change introduced a warning in pythonrun.c: D:\a\cpython\cpython\Python\pythonrun.c(579,21): warning C4244: '=': conversion from 'Py_ssize_t' to 'int', possible loss of data [D:\a\cpython\cpython\PCbuild\pythoncore.vcxproj] commit 15bc9ab
|
Both pythonrun.c:579 and frameobject:400 (of the referenced version) were edited by now and the compiler warning is not relevant to the current versions. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: