This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [google] Check if the nonnull attribute is applied to 'this' (issue4446070)


On Fri, Apr 29, 2011 at 5:08 PM, Diego Novillo <dnovillo@google.com> wrote:
> This patch from Le-Chun Wu adds support to check whether a nonnull
> attribute is applied to 'this' pointer for non-static methods.
>
> OK for trunk? ?Applied to google/main
>
> 2011-04-27 ?Le-Chun Wu ?<lcwu@google.com>
>
> ? ? ? ?Google ref 45339.
>
> ? ? ? ?* c-common.c (handle_nonnull_attribute): Check whether the nonnull
> ? ? ? ?attribute is applied to the 'this' pointer for non-static methods.
>
> testsuite/ChangeLog.google-main
> 2011-04-27 ?Le-Chun Wu ?<lcwu@google.com>
>
> ? ? ? ?* g++.dg/warn/nonnull2.C: New.
>
> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
> index c6dc649..a1702f8 100644
> --- a/gcc/c-family/c-common.c
> +++ b/gcc/c-family/c-common.c
> @@ -7434,7 +7434,7 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
>
> ? /* Argument list specified. ?Verify that each argument number references
> ? ? ?a pointer argument. ?*/
> - ?for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
> + ?for (attr_arg_num = 1; args; args = TREE_CHAIN (args), attr_arg_num++)
> ? ? {
> ? ? ? tree argument;
> ? ? ? unsigned HOST_WIDE_INT arg_num = 0, ck_num;
> @@ -7466,6 +7466,7 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
> ? ? ? ? ? ? ?return NULL_TREE;
> ? ? ? ? ? ?}
>
> +

spurious white-space change.

> ? ? ? ? ?if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
> ? ? ? ? ? ?{
> ? ? ? ? ? ? ?error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)",
> @@ -7473,6 +7474,11 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
> ? ? ? ? ? ? ?*no_add_attrs = true;
> ? ? ? ? ? ? ?return NULL_TREE;
> ? ? ? ? ? ?}
> +
> + ? ? ? ? ?if (TREE_CODE (type) == METHOD_TYPE && arg_num == 1)
> + ? ? ? ? ? ?warning (OPT_Wattributes,
> + ? ? ? ? ? ? ? ? ? ? "nonnull argument references 'this' pointer (argument %lu, operand %lu)",
> + ? ? ? ? ? ? ? ? ? ? (unsigned long) attr_arg_num, (unsigned long) arg_num);
> ? ? ? ?}
> ? ? }
>
> diff --git a/gcc/testsuite/g++.dg/warn/nonnull2.C b/gcc/testsuite/g++.dg/warn/nonnull2.C
> new file mode 100644
> index 0000000..03006b1
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/warn/nonnull2.C
> @@ -0,0 +1,14 @@
> +// Test that "nonnull" attribute should not be applied to 'this' pointer.
> +// { dg-do compile }
> +
> +#define NULL 0
> +
> +class Foo {
> + public:
> + ?void method1(const int *ptr) __attribute__((nonnull(1, 2))); // { dg-warning "nonnull argument references 'this' pointer" }
> + ?void method2(int *ptr1, int a, int *ptr2) __attribute__((nonnull(2, 3, 4))); // { dg-error "nonnull argument references non-pointer operand" }
> + ?static void func3(int *ptr) __attribute__((nonnull(1))); // should not warn
> + ?Foo(char *str) __attribute__((nonnull())) {}
> +};
> +
> +int func4(int *ptr1, int a) __attribute__((nonnull(1))); // should not warn
> --
> 1.7.3.1
>
>
> --
> This patch is available for review at http://codereview.appspot.com/4446070
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]