On 11/21/19 10:11 AM, Martin Sebor wrote:
> Attached is another revision of this enhancement, this one
> incorporating Richard's request for a more efficient encoding
> of the attributes to enable faster parsing. There is just one
> attribute called access, with the rest being arguments. This
> is transformed to access (mode-string) where the mode-string
> is a STRING_CST describing the access mode (read/write/both)
> and the two positional arguments for the function type.
>
> I have also removed the attributes from the built-in functions
> since they're not used for anything yet, and added more argument
> validation.
>
> To test this a little more extensively, I annotated a few Glibc
> <unistd.h> functions with the new attribute and rebuilt it and
> its test suite. That exposed a problem with function pointers
> not being handled correctly so I fixed that by letting
> the access attribute apply to function pointers (and function
> pointer types in general).
>
> When this is finalized, if there's time I'm still hoping to get
> back to the parts of the patch that make use of the attribute
> for -Wunused and -Wuninitialized that I removed on Jeff's request
> for smaller, independent changes.
>
> In GCC 11 I'd like to look into tying this attribute in with
> _FORTIFY_SOURCE.
>
> Martin
>
> gcc-83859.diff
>
> PR middle-end/83859 - attributes to associate pointer arguments and sizes
>
> gcc/ChangeLog:
>
> PR middle-end/83859
> * attribs.h (struct attr_access): New.
> * attribs.c (decl_attributes): Add an informational note.
> * builtins.c (check_access): Make extern. Consistently set no-warning
> after issuing a warning. Handle calls through function pointers. Set
> no-warning.
> * builtins.h (check_access): Declare.
> * calls.c (rdwr_access_hash): New type.
> (rdwr_map): Same.
> (init_attr_rdwr_indices): New function.
> (maybe_warn_rdwr_sizes): Same.
> (initialize_argument_information): Call init_attr_rdwr_indices.
> Call maybe_warn_rdwr_sizes.
> * doc/extend.texi (attribute access): Document new attribute.
>
> gcc/c-family/ChangeLog:
>
> PR middle-end/83859
> * c-attribs.c (handle_access_attribute): New function.
> (c_common_attribute_table): Add new attribute.
> (get_argument_type): New function.
> (append_access_attrs): New function.
> (get_nonnull_operand): Rename...
> (get_attribute_operand): ...to this.
> * c-common.c (get_nonnull_operand): Rename...
> (get_attribute_operand): ...to this.
>
> gcc/testsuite/ChangeLog:
>
> PR middle-end/83859
> * c-c++-common/attr-nonstring-8.c: Adjust text of expected warning.
> * gcc.dg/Wstringop-overflow-22.c: New test.
> * gcc.dg/Wstringop-overflow-23.c: New test.
> * gcc.dg/attr-access-read-only.c: New test.
> * gcc.dg/attr-access-read-write.c: New test.
> * gcc.dg/attr-access-read-write-2.c: New test.
> * gcc.dg/attr-access-write-only.c: New test.
>
> diff --git a/gcc/calls.c b/gcc/calls.c
> index 62921351b11..15627abbd0d 100644
> --- a/gcc/calls.c
> +++ b/gcc/calls.c
> @@ -52,6 +52,8 @@ along with GCC; see the file COPYING3. If not see
> #include "tree-ssa-strlen.h"
> #include "intl.h"
> #include "stringpool.h"
> +#include "hash-map.h"
> +#include "hash-traits.h"
> #include "attribs.h"
> #include "builtins.h"
> #include "gimple-fold.h"
> @@ -1258,6 +1260,9 @@ alloc_max_size (void)
> bool
> get_size_range (tree exp, tree range[2], bool allow_zero /* = false */)
> {
> + if (!exp)
> + return false;
> +
> if (tree_fits_uhwi_p (exp))
> {
> /* EXP is a constant. */
This change isn't mentioned anywhere in the ChangeLog. If its
intentional, please mention it in the ChangeLog. If it's not
intentional, then drop it :-)
> diff --git a/gcc/gimple.h b/gcc/gimple.h
> index 5a190b1714d..10223386d04 100644
> --- a/gcc/gimple.h
> +++ b/gcc/gimple.h
> @@ -24,6 +24,8 @@ along with GCC; see the file COPYING3. If not see
>
> #include "tree-ssa-alias.h"
> #include "gimple-expr.h"
> +#include "function.h"
> +#include "basic-block.h"
I thought I asked before, can these be moved into the .c files where
they're actually needed?
Otherwise it looks OK to me.
jeff