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

            Bug ID: 96505
           Summary: attribute access effect lost after inlining
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

Prompted by the discussion at
https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551526.html, the
following test case shows that the effect of attribute access is lost after a
function declared with it has been inlined.  This makes the attribute next to
useless in code like libstdc++ that makes heavy use of inlining and/or
templates.

See also pr96502 and pr96503 for similar problems involving other function
attributes.  I've raised these as separate issues because I expect each to need
a different solution.

$ cat x.c && gcc -O2 -S -Wall -Wextra x.c
void f (void*, int);

__attribute__ ((access (write_only, 1, 2), noinline)) void
 f0 (void *p, int n) { f (p, n); }

void h0 (void)
{
  char a[3];
  f0 (a, 5);       // warning (good)
}

__attribute__ ((access (write_only, 1, 2))) void
f1 (void *p, int n) { f (p, n); }

void h1 (void)
{
  char a[3];
  f1 (a, 5);       // missing warning
}
x.c: In function ‘h0’:
x.c:9:3: warning: ‘f0’ writing 5 bytes into a region of size 3 overflows the
destination [-Wstringop-overflow=]
    9 |   f0 (a, 5);       // warning (good)
      |   ^~~~~~~~~
x.c:4:2: note: in a call to function ‘f0’ declared with attribute ‘write_only
(1, 2)’
    4 |  f0 (void *p, int n) { f (p, n); }
      |  ^~

Reply via email to