ASAN: trigger leak before exiting

This disables the default leak-check-on-exit behavior which reports a
bunch of leaks that are only leaks while exiting, at which point they
don’t matter, because the operating system will clean up the memory our
process used.
This commit is contained in:
Michael Stapelberg 2016-01-09 17:18:05 +01:00
parent 5a36d090c7
commit cb3cdb602a
4 changed files with 27 additions and 0 deletions

View File

@ -17,6 +17,9 @@
#include <sys/un.h> #include <sys/un.h>
#include <i3/ipc.h> #include <i3/ipc.h>
#include <ev.h> #include <ev.h>
#ifdef I3_ASAN_ENABLED
#include <sanitizer/lsan_interface.h>
#endif
#include "common.h" #include "common.h"
@ -212,6 +215,9 @@ void got_data(struct ev_loop *loop, ev_io *watcher, int events) {
/* EOF received. Since i3 will restart i3bar instances as appropriate, /* EOF received. Since i3 will restart i3bar instances as appropriate,
* we exit here. */ * we exit here. */
DLOG("EOF received, exiting...\n"); DLOG("EOF received, exiting...\n");
#ifdef I3_ASAN_ENABLED
__lsan_do_leak_check();
#endif
clean_xcb(); clean_xcb();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View File

@ -32,6 +32,10 @@
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
#include <X11/extensions/XKB.h> #include <X11/extensions/XKB.h>
#ifdef I3_ASAN_ENABLED
#include <sanitizer/lsan_interface.h>
#endif
#include "common.h" #include "common.h"
#include "libi3.h" #include "libi3.h"
@ -1070,6 +1074,9 @@ void xcb_chk_cb(struct ev_loop *loop, ev_check *watcher, int revents) {
if (xcb_connection_has_error(xcb_connection)) { if (xcb_connection_has_error(xcb_connection)) {
ELOG("X11 connection was closed unexpectedly - maybe your X server terminated / crashed?\n"); ELOG("X11 connection was closed unexpectedly - maybe your X server terminated / crashed?\n");
#ifdef I3_ASAN_ENABLED
__lsan_do_leak_check();
#endif
exit(1); exit(1);
} }

View File

@ -12,6 +12,10 @@
#include <float.h> #include <float.h>
#include <stdarg.h> #include <stdarg.h>
#ifdef I3_ASAN_ENABLED
#include <sanitizer/lsan_interface.h>
#endif
#include "all.h" #include "all.h"
#include "shmlog.h" #include "shmlog.h"
@ -1658,6 +1662,9 @@ void cmd_layout_toggle(I3_CMD, const char *toggle_mode) {
*/ */
void cmd_exit(I3_CMD) { void cmd_exit(I3_CMD) {
LOG("Exiting due to user command.\n"); LOG("Exiting due to user command.\n");
#ifdef I3_ASAN_ENABLED
__lsan_do_leak_check();
#endif
ipc_shutdown(); ipc_shutdown();
unlink(config.ipc_socket_path); unlink(config.ipc_socket_path);
xcb_disconnect(conn); xcb_disconnect(conn);

View File

@ -13,6 +13,10 @@
*/ */
#include "all.h" #include "all.h"
#ifdef I3_ASAN_ENABLED
#include <sanitizer/lsan_interface.h>
#endif
typedef struct placeholder_state { typedef struct placeholder_state {
/** The X11 placeholder window. */ /** The X11 placeholder window. */
xcb_window_t window; xcb_window_t window;
@ -114,6 +118,9 @@ void restore_connect(void) {
if (restore_conn != NULL) { if (restore_conn != NULL) {
xcb_disconnect(restore_conn); xcb_disconnect(restore_conn);
} }
#ifdef I3_ASAN_ENABLED
__lsan_do_leak_check();
#endif
errx(EXIT_FAILURE, "Cannot open display\n"); errx(EXIT_FAILURE, "Cannot open display\n");
} }