[Bug c/83369] New: Missing diagnostics during inlining

bugzilla@poradnik-webmastera.com gcc-bugzilla@gcc.gnu.org
Mon Dec 11 15:06:00 GMT 2017


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

            Bug ID: 83369
           Summary: Missing diagnostics during inlining
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugzilla@poradnik-webmastera.com
  Target Milestone: ---

When code below is compiled, gcc prints warnings that null is passed to
function with nonnull attribute. However gcc does not point that error is
caused by inlining of my_strcpy at line 32 of test.cc.

Code was compiled using gcc (GCC) 8.0.0 20171210 (experimental).

[code]
#include <string.h>

char buf[100];

struct Test
{
    const char* s1;
    const char* s2;
};

__attribute((nonnull(1, 2)))
inline char* my_strcpy(char* __restrict__ dst, const char* __restrict__ src,
size_t size)
{
    size_t len = strlen(src);
    if (len < size)
        memcpy(dst, src, len + 1);
    else
    {
        memcpy(dst, src, size - 1);
        dst[size - 1] = '\0';
    }
    return dst;
}

void test(Test* test)
{
    if (test->s1)
        my_strcpy(buf, test->s1, sizeof(buf));
    else if (test->s2)
        my_strcpy(buf, test->s2, sizeof(buf));
    else
        my_strcpy(buf, test->s2, sizeof(buf)); // error, line 32
}
[/code]

[out]
$ g++ -c -o test.o test.cc -O2 -Wall
test.cc: In function ‘void test(Test*)’:
test.cc:14:24: warning: argument 1 null where non-null expected [-Wnonnull]
     size_t len = strlen(src);
                  ~~~~~~^~~~~
In file included from test.cc:1:
/usr/include/string.h:395:15: note: in a call to function ‘size_t strlen(const
char*)’ declared here
 extern size_t strlen (const char *__s)
               ^~~~~~
test.cc:16:15: warning: argument 2 null where non-null expected [-Wnonnull]
         memcpy(dst, src, len + 1);
         ~~~~~~^~~~~~~~~~~~~~~~~~~
In file included from test.cc:1:
/usr/include/string.h:42:14: note: in a call to function ‘void* memcpy(void*,
const void*, size_t)’ declared here
 extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
              ^~~~~~
test.cc:19:15: warning: argument 2 null where non-null expected [-Wnonnull]
         memcpy(dst, src, size - 1);
         ~~~~~~^~~~~~~~~~~~~~~~~~~~
In file included from test.cc:1:
/usr/include/string.h:42:14: note: in a call to function ‘void* memcpy(void*,
const void*, size_t)’ declared here
 extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
              ^~~~~~
[/out]


More information about the Gcc-bugs mailing list