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

            Bug ID: 119066
           Summary: Warn when address of local variable is passed to
                    on_exit
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: enhancement
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
            Blocks: 87403
  Target Milestone: ---

A user wanted to report this as a bug:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char *ptr;
} sMem;

void call_on_exit(int sts, void *data) {
    sMem *m = data;

    (void)sts;
    printf("In  Mem addr: %p, ptr: %p\n", (void *)m, (void *)m->ptr);
}

int main() {
    sMem Mem = {.ptr = (char *)0x123456}; /* recognizable value */

    on_exit(call_on_exit, &Mem);
    printf("Out Mem addr: %p, ptr: %p\n", (void *)&Mem, (void *)Mem.ptr);
    return(0);    /* substitute 'return' with 'exit' */
}


If the exit handler is invoked because main returned, then the pointer &Mem is
invalid. If the exit handler is invoked because main called exit() explicitly,
then the pointer is valid. The linux man page for on_exit(3) warns about this:

       By the time function is executed, stack (auto) variables may
       already have gone out of scope.  Therefore, arg should not be a
       pointer to a stack variable; it may however be a pointer to a heap
       variable or a global variable.

GCC could warn when an exit handler is registered on_exit using the address of
an automatic variable, except when a noreturn function is executed before
returning from the function.

On the other hand, it's probably not worth adding special case handling for
this niche misuse of a non-standard SunOS API.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87403
[Bug 87403] [Meta-bug] Issues that suggest a new warning

Reply via email to