From 7b3b68462e039d540ad029d94c3b8fb876887472 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Tue, 18 Oct 2016 13:49:24 +0200 Subject: [PATCH] Fix memory leak in box and listview widget, add coverage make target. (ggcov and lcov) --- Makefile.am | 9 +++++++++ include/widgets/textbox.h | 20 ++++++++++---------- include/widgets/widget.h | 2 +- source/dialogs/drun.c | 2 +- source/dialogs/ssh.c | 2 +- source/helper.c | 4 ++-- source/rofi.c | 2 +- source/widgets/box.c | 6 ++++-- source/widgets/listview.c | 12 +++++++++--- source/widgets/widget.c | 6 +++--- source/xrmoptions.c | 2 +- test/widget-test.c | 4 ++++ 12 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Makefile.am b/Makefile.am index 42957f9d..0b40d647 100644 --- a/Makefile.am +++ b/Makefile.am @@ -348,5 +348,14 @@ $(top_builddir)/gitconfig.h: .FORCE $(rofi_SOURCES): $(top_builddir)/gitconfig.h +.PHONY: coverage +coverage: coverage/index.html + +coverage.info: $(top_builddir)/test/*.gcda $(top_builddir)/source/*.gcda $(top_builddir)/source/**/*.gcda + lcov --capture --directory ./ --output-file coverage.info + +coverage/index.html: coverage.info + genhtml $^ --output-directory coverage/ + .PHONY: .FORCE .FORCE: diff --git a/include/widgets/textbox.h b/include/widgets/textbox.h index f467ea6c..15de87dc 100644 --- a/include/widgets/textbox.h +++ b/include/widgets/textbox.h @@ -46,16 +46,16 @@ typedef struct */ typedef enum { - TB_AUTOHEIGHT = 1 << 0, - TB_AUTOWIDTH = 1 << 1, - TB_LEFT = 1 << 16, - TB_RIGHT = 1 << 17, - TB_CENTER = 1 << 18, - TB_EDITABLE = 1 << 19, - TB_MARKUP = 1 << 20, - TB_WRAP = 1 << 21, - TB_PASSWORD = 1 << 22, - TB_INDICATOR = 1 << 23, + TB_AUTOHEIGHT = 1 << 0, + TB_AUTOWIDTH = 1 << 1, + TB_LEFT = 1 << 16, + TB_RIGHT = 1 << 17, + TB_CENTER = 1 << 18, + TB_EDITABLE = 1 << 19, + TB_MARKUP = 1 << 20, + TB_WRAP = 1 << 21, + TB_PASSWORD = 1 << 22, + TB_INDICATOR = 1 << 23, } TextboxFlags; /** * Flags indicating current state of the textbox. diff --git a/include/widgets/widget.h b/include/widgets/widget.h index 2b871ec1..2dd11aa4 100644 --- a/include/widgets/widget.h +++ b/include/widgets/widget.h @@ -28,7 +28,7 @@ typedef struct _widget widget; typedef gboolean ( *widget_clicked_cb )( widget *, xcb_button_press_event_t *, void * ); /** Macro to get widget from an implementation (e.g. textbox/scrollbar) */ -#define WIDGET( a ) ( ( a ) != NULL ? (widget *) ( a ) : NULL ) +#define WIDGET( a ) ( (widget *) ( a ) ) /** * @param widget The widget to check diff --git a/source/dialogs/drun.c b/source/dialogs/drun.c index e9dd16cd..da0c3c26 100644 --- a/source/dialogs/drun.c +++ b/source/dialogs/drun.c @@ -366,7 +366,7 @@ static void walk_dir ( DRunModePrivateData *pd, const char *root, const char *di } // Skip files not ending on .desktop. if ( file->d_type != DT_DIR && !g_str_has_suffix ( file->d_name, ".desktop" ) ) { - g_free(filename); + g_free ( filename ); continue; } diff --git a/source/dialogs/ssh.c b/source/dialogs/ssh.c index f11ba3a1..397893dc 100644 --- a/source/dialogs/ssh.c +++ b/source/dialogs/ssh.c @@ -198,7 +198,7 @@ static char **read_hosts_file ( char ** retv, unsigned int *length ) // Reading one line per time. while ( getline ( &buffer, &buffer_length, fd ) > 0 ) { // Evaluate one line. - unsigned int index = 0, ti = 0; + unsigned int index = 0, ti = 0; char *token = buffer; // Tokenize it. diff --git a/source/helper.c b/source/helper.c index 773c8fc3..7fabbcea 100644 --- a/source/helper.c +++ b/source/helper.c @@ -194,7 +194,7 @@ static GRegex * create_regex ( const char *input, int case_sensitive ) { #define R( s ) g_regex_new ( s, G_REGEX_OPTIMIZE | ( ( case_sensitive ) ? 0 : G_REGEX_CASELESS ), 0, NULL ) GRegex * retv = NULL; - gchar *r; + gchar *r; switch ( config.matching_method ) { case MM_GLOB: @@ -234,7 +234,7 @@ GRegex **tokenize ( const char *input, int case_sensitive ) } char *saveptr = NULL, *token; - GRegex **retv = NULL; + GRegex **retv = NULL; if ( !config.tokenize ) { retv = g_malloc0 ( sizeof ( GRegex* ) * 2 ); retv[0] = (GRegex *) create_regex ( input, case_sensitive ); diff --git a/source/rofi.c b/source/rofi.c index 46b81ae7..391d8f21 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -344,7 +344,7 @@ static int add_mode ( const char * token ) } else #endif // WINDOW_MODE - // SSh dialog + // SSh dialog if ( strcasecmp ( token, "ssh" ) == 0 ) { modi[num_modi] = &ssh_mode; num_modi++; diff --git a/source/widgets/box.c b/source/widgets/box.c index 6f5b12de..bb36f292 100644 --- a/source/widgets/box.c +++ b/source/widgets/box.c @@ -202,13 +202,15 @@ static void box_free ( widget *wid ) widget * child = (widget *) iter->data; widget_free ( child ); } - + g_list_free ( b->children ); g_free ( b ); } void box_add ( box *box, widget *child, gboolean expand, gboolean end ) { - if ( box == NULL ) return; + if ( box == NULL ) { + return; + } child->expand = expand; child->end = end; child->parent = WIDGET ( box ); diff --git a/source/widgets/listview.c b/source/widgets/listview.c index 055be2f6..ce6072e0 100644 --- a/source/widgets/listview.c +++ b/source/widgets/listview.c @@ -71,9 +71,15 @@ struct _listview void *mouse_activated_data; }; -static void listview_free ( widget *widget ) +static void listview_free ( widget *wid ) { - listview *lv = (listview *) widget; + listview *lv = (listview *) wid; + for ( unsigned int i = 0; i < lv->cur_elements; i++ ) { + widget_free ( WIDGET ( lv->boxes [i] ) ); + } + g_free ( lv->boxes ); + + widget_free ( WIDGET ( lv->scrollbar ) ); g_free ( lv ); } static unsigned int scroll_per_page ( listview * lv ) @@ -237,7 +243,7 @@ static void listview_resize ( widget *wid, short w, short h ) lv->max_rows = ( lv->padding + lv->widget.h ) / ( lv->element_height + lv->padding ); lv->max_elements = lv->max_rows * lv->menu_columns; - widget_move ( WIDGET ( lv->scrollbar ), lv->widget.w - widget_get_width ( WIDGET (lv->scrollbar ) ), 0 ); + widget_move ( WIDGET ( lv->scrollbar ), lv->widget.w - widget_get_width ( WIDGET ( lv->scrollbar ) ), 0 ); widget_resize ( WIDGET ( lv->scrollbar ), widget_get_width ( WIDGET ( lv->scrollbar ) ), h ); listview_recompute_elements ( lv ); diff --git a/source/widgets/widget.c b/source/widgets/widget.c index 48642cb7..0aee2e70 100644 --- a/source/widgets/widget.c +++ b/source/widgets/widget.c @@ -66,10 +66,10 @@ void widget_draw ( widget *widget, cairo_t *d ) widget->need_redraw = FALSE; } } -void widget_free ( widget *widget ) +void widget_free ( widget *wid ) { - if ( widget && widget->free ) { - widget->free ( widget ); + if ( wid && wid->free ) { + wid->free ( wid ); } } diff --git a/source/xrmoptions.c b/source/xrmoptions.c index 0217833e..6d69e1d9 100644 --- a/source/xrmoptions.c +++ b/source/xrmoptions.c @@ -197,7 +197,7 @@ static XrmOption xrmOptions[] = { }; /** Dynamic array of extra options */ -XrmOption *extra_options = NULL; +XrmOption *extra_options = NULL; /** Number of entries in extra options array */ unsigned int num_extra_options = 0; diff --git a/test/widget-test.c b/test/widget-test.c index 16c51c78..109197cb 100644 --- a/test/widget-test.c +++ b/test/widget-test.c @@ -20,6 +20,10 @@ int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv ) widget *wid= (widget*)g_malloc0(sizeof(widget)); widget_resize ( wid, 20, 40); widget_move ( wid, 10, 10); + // Getter, setter x pos + // + TASSERT( widget_get_x_pos ( wid ) == 10 ); + TASSERT( widget_get_y_pos ( wid ) == 10 ); // Left of box TASSERT ( widget_intersect ( wid, 0, 0) == 0 );