On Fri, 30 Jul 2021, Tom de Vries wrote: > On 7/30/21 6:17 PM, Martin Sebor wrote: > > On 7/28/21 9:20 AM, Tom de Vries wrote: > >> Hi, > >> > >> Improve nonnull attribute documentation in a number of ways: > >> > >> Reorganize discussion of effects into: > >> - effects for calls to functions with nonnull-marked parameters, and > >> - effects for function definitions with nonnull-marked parameters. > >> This makes it clear that -fno-delete-null-pointer-checks has no effect > >> for > >> optimizations based on nonnull-marked parameters in function definitions > >> (see PR100404). > > > > This resolves half of PR 101665 that I raised the other day (i.e., > > updates the docs). Thank you! > > You're welcome :) > > > Since PR 100404 was resolved as > > invalid, > > Yeah, I can also live with reopening that one as documentation PR. > > > can you please reference the other PR in the changelog? > > Done. > > > The other half (warning when attribute nonnull is specified along > > with attribute optimize "-fno-delete-null-pointer-checks") remains. > > I plan to look into it unless someone beats me to it or unless some > > other solution emerges. > > > > FWIW, In my reply to Richi here ( > https://gcc.gnu.org/pipermail/gcc-patches/2021-July/576415.html ) I > proposed to split the existing nonnull attribute functionality into > assume_nonnull/verify_nonnull attributes. I'm curious what you think of > that proposal. > > > A few comments on the documentation changes below. > > > >> > >> Mention -Wnonnull-compare. > >> > >> Mention workaround from PR100404 comment 7. > >> > >> The workaround can be used for this scenario. Say we have a test.c: > >> ... > >> #include <stdlib.h> > >> > >> extern int isnull (char *ptr) __attribute__ ((nonnull)); > >> int isnull (char *ptr) > >> { > >> if (ptr == 0) > >> return 1; > >> return 0; > >> } > >> > >> int > >> main (void) > >> { > >> char *ptr = NULL; > >> if (isnull (ptr)) __builtin_abort (); > >> return 0; > >> } > >> ... > >> > >> The test-case contains a mistake: ptr == NULL, and we want to detect the > >> mistake using an abort: > >> ... > >> $ gcc test.c > >> $ ./a.out > >> Aborted (core dumped) > >> ... > >> > >> At -O2 however, the mistake is not detected: > >> ... > >> $ gcc test.c -O2 > >> $ ./a.out > >> ... > >> which is what -Wnonnull-compare (not show here) warns about. > >> > >> The easiest way to fix this is by dropping the nonnull attribute. But > >> that > >> also disables -Wnonnull, which would detect something like: > >> ... > >> if (isnull (NULL)) __builtin_abort (); > >> ... > >> at compile time. > >> > >> Using this workaround: > >> ... > >> int isnull (char *ptr) > >> { > >> + asm ("" : "+r"(ptr)); > >> if (ptr == 0) > >> return 1; > >> return 0; > >> } > >> ... > >> we still manage to detect the problem at runtime with -O2: > >> ... > >> $ ~/gcc_versions/devel/install/bin/gcc test.c -O2 > >> $ ./a.out > >> Aborted (core dumped) > >> ... > >> while keeping the possibility to detect "isnull (NULL)" at compile time. > >> > >> OK for trunk? > >> > >> Thanks, > >> - Tom > >> > >> [gcc/doc] Improve nonnull attribute documentation > >> > >> gcc/ChangeLog: > >> > >> 2021-07-28 Tom de Vries <tdevr...@suse.de> > >> > >> * doc/extend.texi (nonnull attribute): Improve documentation. > >> > >> --- > >> gcc/doc/extend.texi | 51 > >> ++++++++++++++++++++++++++++++++++++++++----------- > >> 1 file changed, 40 insertions(+), 11 deletions(-) > >> > >> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > >> index b83cd4919bb..3389effd70c 100644 > >> --- a/gcc/doc/extend.texi > >> +++ b/gcc/doc/extend.texi > >> @@ -3488,17 +3488,46 @@ my_memcpy (void *dest, const void *src, size_t > >> len) > >> @end smallexample > >> @noindent > >> -causes the compiler to check that, in calls to @code{my_memcpy}, > >> -arguments @var{dest} and @var{src} are non-null. If the compiler > >> -determines that a null pointer is passed in an argument slot marked > >> -as non-null, and the @option{-Wnonnull} option is enabled, a warning > >> -is issued. @xref{Warning Options}. Unless disabled by > >> -the @option{-fno-delete-null-pointer-checks} option the compiler may > >> -also perform optimizations based on the knowledge that certain function > >> -arguments cannot be null. In addition, > >> -the @option{-fisolate-erroneous-paths-attribute} option can be specified > >> -to have GCC transform calls with null arguments to non-null functions > >> -into traps. @xref{Optimize Options}. > >> +informs the compiler that, in calls to @code{my_memcpy}, arguments > >> +@var{dest} and @var{src} must be non-null. > >> + > >> +The attribute has effect both for functions calls and function > >> definitions. > > > > Missing article: has <ins>an </ins> effect. Also, an effect on > > (rather than for) might be more appropriate. > > > > Done. > > >> + > >> +For function calls: > >> +@itemize @bullet > >> +@item If the compiler determines that a null pointer is > >> +passed in an argument slot marked as non-null, and the > >> +@option{-Wnonnull} option is enabled, a warning is issued. > >> +@xref{Warning Options}. > >> +@item The @option{-fisolate-erroneous-paths-attribute} option can be > >> +specified to have GCC transform calls with null arguments to non-null > >> +functions into traps. @xref{Optimize Options}. > >> +@item The compiler may also perform optimizations based on the > >> +knowledge that certain function arguments cannot be null. These > >> +optimizations can be disabled by the > >> +@option{-fno-delete-null-pointer-checks} option. @xref{Optimize > >> Options}. > >> +@end itemize > >> + > >> +For function definitions: > >> +@itemize @bullet > >> +@item If the compiler determines that a function parameter that is > >> +marked with non-null > > > > Either no "with" or no hyphen in nonnull (when it names the attribute). > > > > Done. > > >> is compared with null, and > >> +@option{-Wnonnull-compare} option is enabled, a warning is issued. > >> +@xref{Warning Options}. > >> +@item The compiler may also perform optimizations based on the > >> +knowledge that certain function parameters cannot be null. > > > > "certain function parameters" makes me think it might include others > > besides those marked nonnull. Unless that's the case, to avoid any > > doubt I'd suggest to rephrase that: say "based on the knowledge that > > @code{nonnul} parameters cannot be null." > > > > Done. > > >> This can > >> +be disabled by hiding the nonnullness using an inline assembly > >> statement: > > > > This is a clever trick but it feels more like a workaround than > > a solution to recommend. I think I would find it preferable to > > accept and gracefully handle the combination of attribute nonnull > > and optimize ("-fno-delete-null-pointer-checks"). But that has > > the downside of disabling the removal of all such checks, not > > just those of the argument, and so doesn't seem like an optimal > > solution either. So it seems like some other mechanism might be > > needed here. > > Yeah, I hope the assume_nonnull / verify_nonnull is an acceptable way > forward. > > Anyway, dropped the workaround from this version.
This version is OK. Thanks, Richard.