Skip to content

Commit

Permalink
test/on_exit: use static variables for on_exit hooks
Browse files Browse the repository at this point in the history
before this change, we allocate memory chunks using malloc(), but
we never free them. and LeakSanitizer points this out

```
Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x5588bfe532de in malloc (/home/jenkins-build/build/workspace/ceph-pull-requests/build/bin/unittest_on_exit+0xa52de) (BuildId: 7c7a92bf5719592938c5307214bcd9b080bd847f)
    #1 0x5588bfe911d7 in func_scope() /home/jenkins-build/build/workspace/ceph-pull-requests/src/test/on_exit.cc:33:22
    #2 0x5588bfe90804 in main /home/jenkins-build/build/workspace/ceph-pull-requests/src/test/on_exit.cc:64:3
    ceph#3 0x7f23081c1d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x5588bfe532de in malloc (/home/jenkins-build/build/workspace/ceph-pull-requests/build/bin/unittest_on_exit+0xa52de) (BuildId: 7c7a92bf5719592938c5307214bcd9b080bd847f)
    #1 0x5588bfe91160 in func_scope() /home/jenkins-build/build/workspace/ceph-pull-requests/src/test/on_exit.cc:29:22
    #2 0x5588bfe90804 in main /home/jenkins-build/build/workspace/ceph-pull-requests/src/test/on_exit.cc:64:3
    ceph#3 0x7f23081c1d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
```

in this change, instead of allocating the variables using `malloc()`,
we keep them in static variables, so that they can be accessed by
`OnExitManager` even if it is a static variable.
with this change, the memory leak reports for this source file go away.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
  • Loading branch information
tchaikov committed Mar 31, 2024
1 parent d6c8171 commit 42db62c
Showing 1 changed file with 8 additions and 12 deletions.
20 changes: 8 additions & 12 deletions src/test/on_exit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,11 @@ static void func_scope(void)
{
OnExitManager mgr;

int *inc_1 = (int*)malloc(sizeof(*inc_1));
*inc_1 = 5;
mgr.add_callback(add, inc_1);
static int inc_1 = 5;
mgr.add_callback(add, &inc_1);

int *inc_2 = (int*)malloc(sizeof(*inc_2));
*inc_2 = 3;
mgr.add_callback(add, inc_2);
static int inc_2 = 3;
mgr.add_callback(add, &inc_2);
}

// shared between processes
Expand Down Expand Up @@ -84,9 +82,8 @@ int main(int argc, char **argv)
// exits by returning from main. The parent checks the value after the
// child exits via the memory map.
ceph_assert(*shared_val == 0);
int *new_val = (int*)malloc(sizeof(*new_val));
*new_val = MAIN_SCOPE_VAL;
main_scope_mgr.add_callback(main_scope_cb, new_val);
static int new_val = MAIN_SCOPE_VAL;
main_scope_mgr.add_callback(main_scope_cb, &new_val);
return 0;
}

Expand All @@ -104,9 +101,8 @@ int main(int argc, char **argv)
// child adds a callback to the static scope callback manager and then
// exits via exit().
ceph_assert(*shared_val == 0);
int *new_val = (int*)malloc(sizeof(*new_val));
*new_val = EXIT_FUNC_VAL;
exit_func_mgr.add_callback(exit_func_cb, new_val);
static int new_val = EXIT_FUNC_VAL;
exit_func_mgr.add_callback(exit_func_cb, &new_val);
call_exit();
ceph_abort();
}
Expand Down

0 comments on commit 42db62c

Please sign in to comment.