]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: Synthesize nonnull attribute for parameters declared with static [PR110815]
authorMartin Uecker <uecker@tugraz.at>
Thu, 27 Jul 2023 11:41:33 +0000 (13:41 +0200)
committerMartin Uecker <uecker@tugraz.at>
Sat, 11 Nov 2023 09:37:46 +0000 (10:37 +0100)
Parameters declared with `static` are nonnull. We synthesize
an artifical nonnull attribute for such parameters to get the
same warnings and optimizations.

Bootstrapped and regression tested on x86.

PR c/110815
PR c/112428

gcc/c-family:
* c-attribs.cc (build_attr_access_from_parms): Synthesize
nonnull attribute for parameters declared with `static`.

gcc:
* gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes):
remove warning for parameters declared with `static`.

gcc/testsuite:
* gcc.dg/Wnonnull-8.c: Adapt test.
* gcc.dg/Wnonnull-9.c: New test.

gcc/c-family/c-attribs.cc
gcc/gimple-ssa-warn-access.cc
gcc/testsuite/gcc.dg/Wnonnull-8.c
gcc/testsuite/gcc.dg/Wnonnull-9.c [new file with mode: 0644]

index 754cdab2ae8593a9ef1c9bb74c6a40e91a74e66c..461732f60f7c4031cc6692000fbdddb9f726a035 100644 (file)
@@ -5349,6 +5349,7 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
        arg2pos.put (arg, argpos);
     }
 
+  tree nnlist = NULL_TREE;
   argpos = 0;
   for (tree arg = parms; arg; arg = TREE_CHAIN (arg), ++argpos)
     {
@@ -5382,6 +5383,11 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
       tree str = TREE_VALUE (argspec);
       const char *s = TREE_STRING_POINTER (str);
 
+      /* Collect the list of nonnull arguments which use "[static ..]".  */
+      if (s != NULL && s[0] == '[' && s[1] == 's')
+       nnlist = tree_cons (NULL_TREE, build_int_cst (integer_type_node,
+                                                     argpos + 1), nnlist);
+
       /* Create the attribute access string from the arg spec string,
         optionally followed by position of the VLA bound argument if
         it is one.  */
@@ -5449,6 +5455,10 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
   if (!spec.length ())
     return NULL_TREE;
 
+  /* If we have nonnull arguments, synthesize an attribute.  */
+  if (nnlist != NULL_TREE)
+    nnlist = build_tree_list (get_identifier ("nonnull"), nnlist);
+
   /* Attribute access takes a two or three arguments.  Wrap VBLIST in
      another list in case it has more nodes than would otherwise fit.  */
   vblist = build_tree_list (NULL_TREE, vblist);
@@ -5459,7 +5469,7 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
   tree str = build_string (spec.length (), spec.c_str ());
   tree attrargs = tree_cons (NULL_TREE, str, vblist);
   tree name = get_identifier ("access");
-  return build_tree_list (name, attrargs);
+  return tree_cons (name, attrargs, nnlist);
 }
 
 /* Handle a "nothrow" attribute; arguments as in
index 8b734295f09d310e43edf1a6347d8e37ce97ed82..da2e3fe3a0dc0a2dbc46449be1ec68480762a474 100644 (file)
@@ -3491,16 +3491,6 @@ pass_waccess::maybe_check_access_sizes (rdwr_map *rwm, tree fndecl, tree fntype,
                                   ptridx + 1, sizidx + 1, sizstr))
                arg_warned = OPT_Wnonnull;
            }
-         else if (access_size && access.second.static_p)
-           {
-             /* Warn about null pointers for [static N] array arguments
-                but do not warn for ordinary (i.e., nonstatic) arrays.  */
-             if (warning_at (loc, OPT_Wnonnull,
-                             "argument %i to %<%T[static %E]%> "
-                             "is null where non-null expected",
-                             ptridx + 1, argtype, access_nelts))
-               arg_warned = OPT_Wnonnull;
-           }
 
          if (arg_warned != no_warning)
            {
index 02871a76689665741c22014476769f3aa7e5acca..b24fd67cebc43dc344817a3c238691ef2073bb76 100644 (file)
@@ -10,5 +10,5 @@ foo (int a[static 7])
 int
 main ()
 {
-  foo ((int *) 0);     /* { dg-warning "argument 1 to 'int\\\[static 7\\\]' is null where non-null expected" } */
+  foo ((int *) 0);     /* { dg-warning "argument 1 null where non-null expected" } */
 }
diff --git a/gcc/testsuite/gcc.dg/Wnonnull-9.c b/gcc/testsuite/gcc.dg/Wnonnull-9.c
new file mode 100644 (file)
index 0000000..1c57eef
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+
+void
+foo (int a[static 1])
+{
+  if ((void*)0 == a)   /* { dg-warning "argument" "compared to NULL" } */
+    return;
+}
+
+int
+main ()
+{
+  foo ((void*)0);      /* { dg-warning "argument 1 null where non-null expected" } */
+}
+