From 150b331189026ff1462a92cb7b13a3344fb75241 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 23 Jan 2025 13:52:19 -0800 Subject: [PATCH] analyzer lint for win/curses/*.c There is still an issue in cursmesg.c. The last diff band (curses_putch) isn't related to static analysis. --- win/curses/cursdial.c | 16 +++++++--------- win/curses/cursmesg.c | 2 ++ win/curses/cursstat.c | 1 + win/curses/curswins.c | 15 +++++++++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/win/curses/cursdial.c b/win/curses/cursdial.c index dddfd400e..dc34805b7 100644 --- a/win/curses/cursdial.c +++ b/win/curses/cursdial.c @@ -449,7 +449,6 @@ curses_ext_cmd(void) letter = pgetchar(); /* pgetchar(cmd.c) implements do-again */ curs_set(0); prompt_width = (int) strlen(cur_choice); - matches = 0; if (letter == '\033' || letter == ERR) { ret = -1; @@ -667,7 +666,7 @@ curs_pad_menu( boolean do_pad UNUSED) { nhmenu_item *menu_item_ptr; - int numpages = current_menu->num_pages; + int numpages; /* caller has already called menu_win_size() */ menu_determine_pages(current_menu); /* sets 'menu->num_pages' */ @@ -942,7 +941,7 @@ menu_is_multipage(nhmenu *menu, int width, int height) int curline = 0, accel_per_page = 0; nhmenu_item *menu_item_ptr = menu->entries; - if (*menu->prompt) { + if (menu->prompt && *menu->prompt) { curline += curses_num_lines(menu->prompt, width) + 1; } @@ -978,13 +977,12 @@ menu_determine_pages(nhmenu *menu) int tmpline, num_lines, accel_per_page; int curline = 0; int page_num = 1; - nhmenu_item *menu_item_ptr = menu->entries; + nhmenu_item *menu_item_ptr; int width = menu->width; int height = menu->height; int page_end = height; - - if (*menu->prompt) { + if (menu->prompt && *menu->prompt) { curline += curses_num_lines(menu->prompt, width) + 1; } tmpline = curline; @@ -1032,6 +1030,7 @@ menu_win_size(nhmenu *menu) int maxheaderwidth = menu->prompt ? (int) strlen(menu->prompt) : 0; nhmenu_item *menu_item_ptr, *last_item_ptr = NULL; +#if 0 /* maxwidth is set below, so the value calculated here isn't used */ if (program_state.gameover) { /* for final inventory disclosure, use full width */ maxwidth = term_cols - 2; /* +2: borders assumed */ @@ -1046,6 +1045,7 @@ menu_win_size(nhmenu *menu) if ((term_cols / 2) > maxwidth) maxwidth = (term_cols / 2); /* Half the screen */ } +#endif maxheight = menu_max_height(); /* First, determine the width of the longest menu entry */ @@ -1475,8 +1475,6 @@ curs_nonselect_menu_action( } menu_item_ptr = menu_item_ptr->next_item; } - - menu_item_ptr = menu->entries; break; } /* case MENU_SEARCH */ default: @@ -1500,7 +1498,7 @@ menu_get_selections(WINDOW *win, nhmenu *menu, int how) int num_selected = 0; boolean dismiss = FALSE; char selectors[256], groupaccels[256]; - nhmenu_item *menu_item_ptr = menu->entries; + nhmenu_item *menu_item_ptr; activemenu = win; menu_display_page(win, menu, curpage, selectors, groupaccels); diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 6a30c159c..9d9eceb1f 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -932,6 +932,8 @@ mesg_add_line(const char *mline) } else { /* instead of discarding list element being forced out, reuse it */ current_mesg = first_mesg; + assert(current_mesg != NULL); + assert(current_mesg->str != NULL); /* whenever new 'mline' is shorter, extra allocation size of the original element will be frittered away, until eventually we'll discard this 'str' and dupstr() a replacement; we could easily diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index 90a9d93c9..67691bb59 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -173,6 +173,7 @@ curses_status_update( /* decode once instead of every time it's displayed */ status_vals[BL_GOLD][0] = ' '; text = decode_mixed(&status_vals[BL_GOLD][1], text); + nhUse(text); } else if ((fldidx == BL_HUNGER || fldidx == BL_CAP) && (!*text || !strcmp(text, " "))) { /* fieldfmt[] is " %s"; avoid lone space when empty */ diff --git a/win/curses/curswins.c b/win/curses/curswins.c index 19c6c380a..f7f9e1d96 100644 --- a/win/curses/curswins.c +++ b/win/curses/curswins.c @@ -508,20 +508,27 @@ curs_destroy_all_wins(void) { curses_count_window((char *) 0); /* clean up orphan */ +#if 0 /* this works but confuses the static analyzer (from llvm-19, + * which reports "warning: Use of memory after it is freed") */ while (nhwids) curses_del_wid(nhwids->nhwid); +#lse + while (nhwids) { + nethack_wid *tmpptr = nhwids; + + curses_del_wid(tmpptr->nhwid); + } +#endif } /* Print a single character in the given window at the given coordinates */ void -#ifdef ENHANCED_SYMBOLS curses_putch(winid wid, int x, int y, int ch, +#ifdef ENHANCED_SYMBOLS struct unicode_representation *unicode_representation, - int color, int framecolor, int attr) -#else -curses_putch(winid wid, int x, int y, int ch, int color, int framecolor, int attr) #endif + int color, int framecolor, int attr) { static boolean map_initted = FALSE; int sx, sy, ex, ey;