aaron.ballman added inline comments.
================ Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:8217 + err_typecheck_convert_incompatible_function_pointer.Text>, + InGroup<DiagGroup<"incompatible-function-pointer-types-strict">>, DefaultIgnore; def ext_typecheck_convert_discards_qualifiers : ExtWarn< ---------------- nathanchance wrote: > nathanchance wrote: > > aaron.ballman wrote: > > > aaron.ballman wrote: > > > > samitolvanen wrote: > > > > > nathanchance wrote: > > > > > > aaron.ballman wrote: > > > > > > > samitolvanen wrote: > > > > > > > > aaron.ballman wrote: > > > > > > > > > We don't typically add new off-by-default warnings because we > > > > > > > > > have evidence that users don't enable them enough to be worth > > > > > > > > > adding them. Is there a way we can enable this warning by > > > > > > > > > default for CFI compilation units (or when the cfi sanitizer > > > > > > > > > is enabled) so that it's only off by default for non-CFI > > > > > > > > > users? I don't think we have any examples of doing this in > > > > > > > > > the code base, so I believe this would be breaking new ground > > > > > > > > > (and thus is worth thinking about more, perhaps it's a bad > > > > > > > > > idea for some reason). > > > > > > > > > Is there a way we can enable this warning by default for CFI > > > > > > > > > compilation units (or when the cfi sanitizer is enabled) so > > > > > > > > > that it's only off by default for non-CFI users? > > > > > > > > > > > > > > > > I can look into it, but I'm not sure if there's a convenient > > > > > > > > way to do that. An alternative to this could be to enable the > > > > > > > > warning by default, but only actually perform the check if CFI > > > > > > > > is enabled. This way non-CFI users would never see the warning > > > > > > > > because this really isn't a concern for them, but CFI users > > > > > > > > would still get the warning without explicitly enabling it. Or > > > > > > > > do you think this behavior would be confusing? > > > > > > > Heh, sorry for not being clear, that's actually somewhat along > > > > > > > the lines of how I envisioned you'd implement it (we don't have a > > > > > > > way in tablegen to tie `DefaultIgnore` to some language options > > > > > > > or a target). > > > > > > > > > > > > > > I was thinking the diagnostic would be left as `DefaultIgnore` in > > > > > > > the .td file, but we'd take note in the driver that CFI was > > > > > > > enabled and pass `-Wincompatible-function-pointer-types-strict` > > > > > > > to the `-cc1` invocation. If the user wrote > > > > > > > `-Wno-incompatible-function-pointer-types-strict` at the driver > > > > > > > level, that would come *after* the automatically generated flag > > > > > > > for cc1 and would still disable the diagnostic in the cc1 > > > > > > > invocation (because the last flag wins). WDYT? > > > > > > I do not think that is unreasonable behavior in the generic case > > > > > > but specifically for the Linux kernel, kCFI is disabled by default > > > > > > (`CONFIG_CFI_CLANG` has to be specifically enabled) but we want to > > > > > > see this warning regardless of the value of that configuration so > > > > > > that driver authors who test with clang and automated testers are > > > > > > more likely to find them. As a result, if the warning is not going > > > > > > to be default on, we would still need to specifically enable it in > > > > > > our CFLAGS. I suppose your suggestion would help out folks using > > > > > > CFI in production though so maybe it is still worth considering > > > > > > doing? > > > > > > I was thinking the diagnostic would be left as `DefaultIgnore` in > > > > > > the .td file, but we'd take note in the driver that CFI was enabled > > > > > > and pass `-Wincompatible-function-pointer-types-strict` to the > > > > > > `-cc1` invocation. > > > > > > > > > > Thanks for clarifying, that sounds reasonable. Of course, enabling it > > > > > by default with CFI would still mean that we'll have to either > > > > > explicitly disable this in the kernel (or fix all the existing > > > > > warnings) before submitting the Clang change. > > > > > As a result, if the warning is not going to be default on, we would > > > > > still need to specifically enable it in our CFLAGS. I suppose your > > > > > suggestion would help out folks using CFI in production though so > > > > > maybe it is still worth considering doing? > > > > > > > > It sounds like either approach will require you to specifically enable > > > > it in your CFLAGS, right? Either it's off-by-default for everyone, or > > > > it's only on-by-default for CFI enabled builds (which the Linux kernel > > > > disables by default). > > > > Thanks for clarifying, that sounds reasonable. Of course, enabling it > > > > by default with CFI would still mean that we'll have to either > > > > explicitly disable this in the kernel (or fix all the existing > > > > warnings) before submitting the Clang change. > > > > > > Er, is there a chicken and egg problem here? I was imagining that you > > > could land the changes in Clang and disable the flag in the Linux kernel > > > around roughly the same time (we can time when we land things to make > > > life easier for you) so it wouldn't be particularly disruptive. > > > > > > If it would be disruptive, another approach would be to leave it off by > > > default everywhere, get the Linux kernel CFI warning free, then enable it > > > for CFI builds by default. But that seems riskier to me (we are more > > > likely to forget to come turn the warning on by default later). > > > It sounds like either approach will require you to specifically enable it > > > in your CFLAGS, right? Either it's off-by-default for everyone, or it's > > > only on-by-default for CFI enabled builds (which the Linux kernel > > > disables by default). > > > > Right, I was only mentioning our use case will necessitate it being always > > enabled so conditionally enabling it would be extra work that wouldn't > > benefit us but obviously, the world does not revolve around our one project > > :) > > Er, is there a chicken and egg problem here? I was imagining that you could > > land the changes in Clang and disable the flag in the Linux kernel around > > roughly the same time (we can time when we land things to make life easier > > for you) so it wouldn't be particularly disruptive. > > Yes, we do not have as much freedom with pushing changes into Linux mainline, > as they first have to soak in the -next tree, so that will require at least a > week. I assume @kees can help us out with getting that patch to Linus in a > timely manner though so that is probably not as much of a concern. > > > If it would be disruptive, another approach would be to leave it off by > > default everywhere, get the Linux kernel CFI warning free, then enable it > > for CFI builds by default. But that seems riskier to me (we are more likely > > to forget to come turn the warning on by default later). > > I have sent patches to fix all the instances of this that I see in the Linux > kernel as of this morning: > > https://github.com/ClangBuiltLinux/linux/issues/1750#issuecomment-1300972689 > > I have to track all of those so I know when it is possible to enable this > warning in `KBUILD_CFLAGS` so I could remind Sami to enable it for CFI builds > by default once that is done? >>It sounds like either approach will require you to specifically enable it in >>your CFLAGS, right? Either it's off-by-default for everyone, or it's only >>on-by-default for CFI enabled builds (which the Linux kernel disables by >>default). > Right, I was only mentioning our use case will necessitate it being always > enabled so conditionally enabling it would be extra work that wouldn't > benefit us but obviously, the world does not revolve around our one project :) Phew, I'm glad I wasn't missing something subtle. :-D ================ Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:8217 + err_typecheck_convert_incompatible_function_pointer.Text>, + InGroup<DiagGroup<"incompatible-function-pointer-types-strict">>, DefaultIgnore; def ext_typecheck_convert_discards_qualifiers : ExtWarn< ---------------- aaron.ballman wrote: > nathanchance wrote: > > nathanchance wrote: > > > aaron.ballman wrote: > > > > aaron.ballman wrote: > > > > > samitolvanen wrote: > > > > > > nathanchance wrote: > > > > > > > aaron.ballman wrote: > > > > > > > > samitolvanen wrote: > > > > > > > > > aaron.ballman wrote: > > > > > > > > > > We don't typically add new off-by-default warnings because > > > > > > > > > > we have evidence that users don't enable them enough to be > > > > > > > > > > worth adding them. Is there a way we can enable this > > > > > > > > > > warning by default for CFI compilation units (or when the > > > > > > > > > > cfi sanitizer is enabled) so that it's only off by default > > > > > > > > > > for non-CFI users? I don't think we have any examples of > > > > > > > > > > doing this in the code base, so I believe this would be > > > > > > > > > > breaking new ground (and thus is worth thinking about more, > > > > > > > > > > perhaps it's a bad idea for some reason). > > > > > > > > > > Is there a way we can enable this warning by default for > > > > > > > > > > CFI compilation units (or when the cfi sanitizer is > > > > > > > > > > enabled) so that it's only off by default for non-CFI users? > > > > > > > > > > > > > > > > > > I can look into it, but I'm not sure if there's a convenient > > > > > > > > > way to do that. An alternative to this could be to enable the > > > > > > > > > warning by default, but only actually perform the check if > > > > > > > > > CFI is enabled. This way non-CFI users would never see the > > > > > > > > > warning because this really isn't a concern for them, but CFI > > > > > > > > > users would still get the warning without explicitly enabling > > > > > > > > > it. Or do you think this behavior would be confusing? > > > > > > > > Heh, sorry for not being clear, that's actually somewhat along > > > > > > > > the lines of how I envisioned you'd implement it (we don't have > > > > > > > > a way in tablegen to tie `DefaultIgnore` to some language > > > > > > > > options or a target). > > > > > > > > > > > > > > > > I was thinking the diagnostic would be left as `DefaultIgnore` > > > > > > > > in the .td file, but we'd take note in the driver that CFI was > > > > > > > > enabled and pass `-Wincompatible-function-pointer-types-strict` > > > > > > > > to the `-cc1` invocation. If the user wrote > > > > > > > > `-Wno-incompatible-function-pointer-types-strict` at the driver > > > > > > > > level, that would come *after* the automatically generated flag > > > > > > > > for cc1 and would still disable the diagnostic in the cc1 > > > > > > > > invocation (because the last flag wins). WDYT? > > > > > > > I do not think that is unreasonable behavior in the generic case > > > > > > > but specifically for the Linux kernel, kCFI is disabled by > > > > > > > default (`CONFIG_CFI_CLANG` has to be specifically enabled) but > > > > > > > we want to see this warning regardless of the value of that > > > > > > > configuration so that driver authors who test with clang and > > > > > > > automated testers are more likely to find them. As a result, if > > > > > > > the warning is not going to be default on, we would still need to > > > > > > > specifically enable it in our CFLAGS. I suppose your suggestion > > > > > > > would help out folks using CFI in production though so maybe it > > > > > > > is still worth considering doing? > > > > > > > I was thinking the diagnostic would be left as `DefaultIgnore` in > > > > > > > the .td file, but we'd take note in the driver that CFI was > > > > > > > enabled and pass `-Wincompatible-function-pointer-types-strict` > > > > > > > to the `-cc1` invocation. > > > > > > > > > > > > Thanks for clarifying, that sounds reasonable. Of course, enabling > > > > > > it by default with CFI would still mean that we'll have to either > > > > > > explicitly disable this in the kernel (or fix all the existing > > > > > > warnings) before submitting the Clang change. > > > > > > As a result, if the warning is not going to be default on, we would > > > > > > still need to specifically enable it in our CFLAGS. I suppose your > > > > > > suggestion would help out folks using CFI in production though so > > > > > > maybe it is still worth considering doing? > > > > > > > > > > It sounds like either approach will require you to specifically > > > > > enable it in your CFLAGS, right? Either it's off-by-default for > > > > > everyone, or it's only on-by-default for CFI enabled builds (which > > > > > the Linux kernel disables by default). > > > > > Thanks for clarifying, that sounds reasonable. Of course, enabling it > > > > > by default with CFI would still mean that we'll have to either > > > > > explicitly disable this in the kernel (or fix all the existing > > > > > warnings) before submitting the Clang change. > > > > > > > > Er, is there a chicken and egg problem here? I was imagining that you > > > > could land the changes in Clang and disable the flag in the Linux > > > > kernel around roughly the same time (we can time when we land things to > > > > make life easier for you) so it wouldn't be particularly disruptive. > > > > > > > > If it would be disruptive, another approach would be to leave it off by > > > > default everywhere, get the Linux kernel CFI warning free, then enable > > > > it for CFI builds by default. But that seems riskier to me (we are more > > > > likely to forget to come turn the warning on by default later). > > > > It sounds like either approach will require you to specifically enable > > > > it in your CFLAGS, right? Either it's off-by-default for everyone, or > > > > it's only on-by-default for CFI enabled builds (which the Linux kernel > > > > disables by default). > > > > > > Right, I was only mentioning our use case will necessitate it being > > > always enabled so conditionally enabling it would be extra work that > > > wouldn't benefit us but obviously, the world does not revolve around our > > > one project :) > > > Er, is there a chicken and egg problem here? I was imagining that you > > > could land the changes in Clang and disable the flag in the Linux kernel > > > around roughly the same time (we can time when we land things to make > > > life easier for you) so it wouldn't be particularly disruptive. > > > > Yes, we do not have as much freedom with pushing changes into Linux > > mainline, as they first have to soak in the -next tree, so that will > > require at least a week. I assume @kees can help us out with getting that > > patch to Linus in a timely manner though so that is probably not as much of > > a concern. > > > > > If it would be disruptive, another approach would be to leave it off by > > > default everywhere, get the Linux kernel CFI warning free, then enable it > > > for CFI builds by default. But that seems riskier to me (we are more > > > likely to forget to come turn the warning on by default later). > > > > I have sent patches to fix all the instances of this that I see in the > > Linux kernel as of this morning: > > > > https://github.com/ClangBuiltLinux/linux/issues/1750#issuecomment-1300972689 > > > > I have to track all of those so I know when it is possible to enable this > > warning in `KBUILD_CFLAGS` so I could remind Sami to enable it for CFI > > builds by default once that is done? > >>It sounds like either approach will require you to specifically enable it > >>in your CFLAGS, right? Either it's off-by-default for everyone, or it's > >>only on-by-default for CFI enabled builds (which the Linux kernel disables > >>by default). > > Right, I was only mentioning our use case will necessitate it being always > > enabled so conditionally enabling it would be extra work that wouldn't > > benefit us but obviously, the world does not revolve around our one project > > :) > > Phew, I'm glad I wasn't missing something subtle. :-D > I have to track all of those so I know when it is possible to enable this > warning in KBUILD_CFLAGS so I could remind Sami to enable it for CFI builds > by default once that is done? Okay, that seems reasonable enough to me (assuming @samitolvanen agrees, of course). If that's the route we're going, then I think this patch is basically ready to go as-is (the diagnostic is already off-by-default here) and the only thing left is the release note. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D136790/new/ https://reviews.llvm.org/D136790 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits