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

            Bug ID: 113984
           Summary: -Wfree-nonheap-object false positive with VLA
                    parameter
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alx at kernel dot org
  Target Milestone: ---

I can reproduce it with both of these:

$ gcc-13 --version | head -n1
gcc-13 (Debian 13.2.0-13) 13.2.0
$ gcc-14 --version | head -n1
gcc-14 (Debian 14-20240201-3) 14.0.1 20240131 (experimental) [master
r14-8680-g2f14c0dbb78]


See a small reproducer:


```c
#include <err.h>
#include <stddef.h>
#include <stdlib.h>


static const char **add_string(size_t *restrict n,
    const char *strings[restrict *n], const char *restrict string);


int
main(int argc, char *argv[argc + 1])
{
        size_t      n = 0;
        const char  **strings = NULL;

        add_string(&n, strings, argv[0]);
}


static const char **
add_string(size_t *restrict n, const char *strings[restrict *n],
    const char *restrict string)
{
        strings = reallocarray(strings, ++*n, sizeof(const char *));
        if (strings == NULL)
                err(EXIT_FAILURE, "reallocarray(3)");

        strings[*n - 1] = string;

        return strings;
}
```


alx@debian:~/tmp$ gcc-13 -Wall nonheap.c 
nonheap.c: In function ‘add_string’:
nonheap.c:24:19: warning: ‘reallocarray’ called on unallocated object ‘strings’
[-Wfree-nonheap-object]
   24 |         strings = reallocarray(strings, ++*n, sizeof(const char *));
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nonheap.c:21:44: note: declared here
   21 | add_string(size_t *restrict n, const char *strings[restrict *n],
      |                                ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
alx@debian:~/tmp$ gcc-14 -Wall nonheap.c 
nonheap.c: In function ‘add_string’:
nonheap.c:24:19: warning: ‘reallocarray’ called on unallocated object ‘strings’
[-Wfree-nonheap-object]
   24 |         strings = reallocarray(strings, ++*n, sizeof(const char *));
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nonheap.c:21:44: note: declared here
   21 | add_string(size_t *restrict n, const char *strings[restrict *n],
      |                                ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~


If I change the function to have the parameter be `const char **restrict
strings`, the warning vanishes.

Reply via email to