Re: More C type errors by default for GCC 14
Richard Biener <[email protected]> Tue, 9 May 2023 17:16:19 +0200
| Newsgroups | dev.linux.lists.c-std-porting |
|---|---|
| Message-ID | <[email protected]> |
> Am 09.05.2023 um 14:16 schrieb Florian Weimer via Gcc <[email protected]>: >=20 > =EF=BB=BFTL;DR: This message is about turning implicit-int, > implicit-function-declaration, and possibly int-conversion into errors > for GCC 14. I suppose the goal is to not need to rely on altering CFLAGS but change the d= efault behavior with still being able to undo this using -Wno-error=3D or -W= no-? I think instead of hard-coding a set of changes would it be possible to alte= r the default setting of diagnostic options during GCC configuration? And m= aybe even note that when diagnosing? Thanks, Richard=20 > A few of you might remember that I've been looking into turning some > type errors from warnings into errors by default. Mainly I've been > looking at implicit function declarations because in too many cases, the > synthesized declaration does not match the prototype used at function > definition and can cause subtle ABI issues. >=20 > To recap, the main challenge is that GCC has to serve disparate groups > of users: some use GCC for writing programs themselves, but others just > need GCC to build sources that they have obtained from somewhere. The > first group benefits from more type errors because they catch errors > earlier during development (experience shows that compiler warnings are > easy to miss in a long build log). The second group might find these > errors challenging because the sources they have no longer build. >=20 > To see how large the impact is on that second group, we've mostly > removed implicit function declarations and implicit ints from Fedora: >=20 > <https://fedoraproject.org/wiki/Changes/PortingToModernC> > <https://fedoraproject.org/wiki/Toolchain/PortingToModernC> >=20 > Roughly 870 packages out of ~14,500 that have GCC present during the > build needed fixing (or flagging that they can't be built with the > additional errors), so 6%. Most of the changes are mechanical in > nature, like adding additional headers to configure checks. For about > ~150 packages, automated patching could be used to rewrite problematic > built-in checks generated by long-obsolete autoconf versions. >=20 > Some of these changes prevent the compiler behavior for altering the > build results silently because the new errors changed the outcome of > autoconf checks. (We had one of those in libstdc++, changing the ABI on > GNU/Linux because futex support oculd no longer be detected.) > Unfortunately, I did not record numbers about them, but think those were > quite rare; most autoconf problems were also accompanied with other > problems, or the incorrect results from autoconf led to build failures > later. So it seems to me that the risk that the second group mentioned > above would silently get unexpected build results is fairly low. >=20 > Where possible, we tried to upstream patches, to simplify sharing across > distributions and to help those who compile upstream sources directly. > We also benefited from other distributions upstreaming changes along > similar lines (notably Gentoo for their Clang 16 project, but also from > Homebrew to a lesser extent). >=20 > An area we started exploring only recently for Fedora is implicit > conversions between integers and pointers (covered by -Wint-conversion). > These add another ~170 packages, but some of those are false positives > (due to our instrumented compiler approach) that do not change the build > outcome at all. I'm still negotiating whether we have the capacity to > develop fixes for these packages proactively. >=20 > I brought up the matter with distributions, and the feedback was neutral > (not overly negative, as in =E2=80=9Cthis would be the end of the world fo= r > us=E2=80=9D). >=20 > <https://discourse.nixos.org/t/rfc-more-c-errors-by-default-in-gcc-14/273= 90> > <https://lists.debian.org/debian-gcc/2023/04/msg00015.html> > <https://lists.opensuse.org/archives/list/[email protected]/thre= ad/5OL76NH5AX75WOTZ43O3ZF2JOS3ABBXL/#QZLCA5YPN5CWSS7BCC6TNBC6N7RFTW7J> >=20 > (I tried to contact Arch, but my message didn't make it past the > moderators, it seems.) >=20 > All in all, the whole situation is not great, but it still seems > manageable to me. >=20 > Anyway, thanks for reading this far. >=20 > I would like to suggest to turn implicit-int, > implicit-function-declaration, and possibly int-conversion from warnings > into errors for GCC 14. This would give upstream projects roughly > another year to make new releases with compatibility fixes that have > been contributed so far. I do not think waiting longer, until GCC 15, > would make a meaningful difference because any upstream project that > does not release within the next 12 months is not likely to release in > the next 24 months, either. >=20 > Regarding mechanics of the necessary opt out facility, Clang used > -Werror=3D=E2=80=A6 by default, but that seems a bit hackish to me. Prese= ntly, we > cannot use -std=3Dgnu89 etc. to opt out because there are packages which > require both C89-only language features and C99-style inlining, which is > currently not a combination supported by GCC (but maybe that could be > changed). Some build systems do not treat CFLAGS and CXXFLAGS as fully > separate, and a flag approach that works for C and C++ without > introducing any new warnings would be most convenient. So maybe we > could use -fpermissive for C as well. >=20 > One fairly big GCC-internal task is to clear up the C test suite so that > it passes with the new compiler defaults. I already have an offer of > help for that, so I think we can complete this work in a reasonable time > frame. >=20 > I have no data how big the compatibility impact of turning > incompatible-pointer-types into errors will be. For now, int-conversion > has higher priority. However, it looks like another change that could > benefit developers (the first group). >=20 > I do not plan to work specifically on C2X compatibility fixes for now > (to support bool-as-keyword, for example), but I could imagine a similar > project a few years from now, fewer than 25 hopefully, that would enable > GCC to make the switch to C2X by default. >=20 > Thanks, > Florian >=20