https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118095

            Bug ID: 118095
           Summary: nonstring attribute cannot be applied to array of char
                    arrays
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kees at outflux dot net
  Target Milestone: ---

While this is legal:

  char tag[4] __attribute__((nonstring));

this is not:

  char tags[10][4] __attribute__((nonstring));

Given both existing checks for passing nonstrings to str functions and the
coming fixes for -Wunterminated-string-initialization (see bug #117178), there
needs to be a way to apply nonstring to these constructs.

This patch makes it possible to apply:


diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 7fd480e6d41b..42a52bcd48da 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -5089,7 +5089,7 @@ handle_nonstring_attribute (tree *node, tree name, tree
ARG_UNUSED (args),
        {
          /* Accept the attribute on arrays and pointers to all three
             narrow character types.  */
-         tree eltype = TREE_TYPE (type);
+         tree eltype = strip_array_types (type);
          eltype = TYPE_MAIN_VARIANT (eltype);
          if (eltype == char_type_node
              || eltype == signed_char_type_node


But it seems to apply to the top of the multidimensional array, not the
individual char arrays within it:

struct foo {
  char tag[4] __attribute__((nonstring));
  char tags[10][4] __attribute__((nonstring));
  int a;
};

int len(struct foo *p)
{
    return strlen(p->tag) +
           strlen(p->tags[2]);
}

The above only warns for "tag", not for the character array at "tags[2]".

Forcing it to use the first char array through the top-level object name does
see the attribute, though:

           strlen((char *)p->tags);


I'm not sure the correct way to mark the lower char arrays with nonstring
through handle_nonstring_attribute().

Reply via email to