diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 70 | ||||
-rw-r--r-- | src/nvim/screen.c | 24 | ||||
-rw-r--r-- | src/nvim/tag.c | 13 | ||||
-rw-r--r-- | src/nvim/window.c | 6 |
4 files changed, 81 insertions, 32 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 498795dc38..1a80198515 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -178,6 +178,8 @@ static char *e_nofunc = N_("E130: Unknown function: %s"); static char *e_illvar = N_("E461: Illegal variable name: %s"); static char *e_float_as_string = N_("E806: using Float as a String"); +static char_u * const empty_string = (char_u *)""; + static dictitem_T globvars_var; /* variable used for g: */ #define globvarht globvardict.dv_hashtab @@ -2272,6 +2274,7 @@ static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv, int copy, ch if (lp->ll_li->li_next == NULL) { /* Need to add an empty item. */ list_append_number(lp->ll_list, 0); + assert(lp->ll_li->li_next); } lp->ll_li = lp->ll_li->li_next; ++lp->ll_n1; @@ -4123,7 +4126,7 @@ eval7 ( * get_func_tv, but it's needed in handle_subscript() to parse * what follows. So set it here. */ if (rettv->v_type == VAR_UNKNOWN && !evaluate && **arg == '(') { - rettv->vval.v_string = (char_u *)""; + rettv->vval.v_string = empty_string; rettv->v_type = VAR_FUNC; } @@ -5733,7 +5736,9 @@ dict_free ( dictitem_T *dictitem_alloc(char_u *key) FUNC_ATTR_NONNULL_RET { dictitem_T *di = xmalloc(sizeof(dictitem_T) + STRLEN(key)); +#ifndef __clang_analyzer__ STRCPY(di->di_key, key); +#endif di->di_flags = 0; return di; } @@ -12518,6 +12523,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; + const int l_provider_call_nesting = provider_call_nesting; if (check_restricted() || check_secure()) { return; @@ -12545,7 +12551,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv) int save_autocmd_fname_full, save_autocmd_bufnr; void *save_funccalp; - if (provider_call_nesting) { + if (l_provider_call_nesting) { // If this is called from a provider function, restore the scope // information of the caller. save_current_SID = current_SID; @@ -12574,7 +12580,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv) args, &err); - if (provider_call_nesting) { + if (l_provider_call_nesting) { current_SID = save_current_SID; sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; @@ -13542,13 +13548,12 @@ static bool item_compare_numeric; static char_u *item_compare_func; static dict_T *item_compare_selfdict; static int item_compare_func_err; -static bool item_compare_keep_zero; #define ITEM_COMPARE_FAIL 999 /* * Compare functions for f_sort() and f_uniq() below. */ -static int item_compare(const void *s1, const void *s2) +static int item_compare(const void *s1, const void *s2, bool keep_zero) { sortItem_T *si1, *si2; char_u *p1, *p2; @@ -13601,7 +13606,7 @@ static int item_compare(const void *s1, const void *s2) // When the result would be zero, compare the item indexes. Makes the // sort stable. - if (res == 0 && !item_compare_keep_zero) { + if (res == 0 && !keep_zero) { res = si1->idx > si2->idx ? 1 : -1; } @@ -13610,7 +13615,17 @@ static int item_compare(const void *s1, const void *s2) return res; } -static int item_compare2(const void *s1, const void *s2) +static int item_compare_keeping_zero(const void *s1, const void *s2) +{ + return item_compare(s1, s2, true); +} + +static int item_compare_not_keeping_zero(const void *s1, const void *s2) +{ + return item_compare(s1, s2, false); +} + +static int item_compare2(const void *s1, const void *s2, bool keep_zero) { sortItem_T *si1, *si2; int res; @@ -13647,13 +13662,23 @@ static int item_compare2(const void *s1, const void *s2) // When the result would be zero, compare the pointers themselves. Makes // the sort stable. - if (res == 0 && !item_compare_keep_zero) { + if (res == 0 && !keep_zero) { res = si1->idx > si2->idx ? 1 : -1; } return res; } +static int item_compare2_keeping_zero(const void *s1, const void *s2) +{ + return item_compare2(s1, s2, true); +} + +static int item_compare2_not_keeping_zero(const void *s1, const void *s2) +{ + return item_compare2(s1, s2, false); +} + /* * "sort({list})" function */ @@ -13734,15 +13759,16 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort) } item_compare_func_err = FALSE; - item_compare_keep_zero = false; // Test the compare function. if (item_compare_func != NULL - && item_compare2(&ptrs[0], &ptrs[1]) == ITEM_COMPARE_FAIL) { + && item_compare2_not_keeping_zero(&ptrs[0], &ptrs[1]) + == ITEM_COMPARE_FAIL) { EMSG(_("E702: Sort compare function failed")); } else { // Sort the array with item pointers. qsort(ptrs, (size_t)len, sizeof (sortItem_T), - item_compare_func == NULL ? item_compare : item_compare2); + item_compare_func == NULL ? item_compare_not_keeping_zero : + item_compare2_not_keeping_zero); if (!item_compare_func_err) { // Clear the list and append the items in the sorted order. @@ -13761,8 +13787,8 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort) // f_uniq(): ptrs will be a stack of items to remove. item_compare_func_err = FALSE; - item_compare_keep_zero = true; - item_compare_func_ptr = item_compare_func ? item_compare2 : item_compare; + item_compare_func_ptr = item_compare_func ? item_compare2_keeping_zero : + item_compare_keeping_zero; for (li = l->lv_first; li != NULL && li->li_next != NULL; li = li->li_next) { if (item_compare_func_ptr(&li, &li->li_next) == 0) { @@ -13776,6 +13802,7 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort) if (!item_compare_func_err) { while (--i >= 0) { + assert(ptrs[i].item->li_next); li = ptrs[i].item->li_next; ptrs[i].item->li_next = li->li_next; if (li->li_next != NULL) { @@ -16111,7 +16138,11 @@ void clear_tv(typval_T *varp) switch (varp->v_type) { case VAR_FUNC: func_unref(varp->vval.v_string); - /*FALLTHROUGH*/ + if (varp->vval.v_string != empty_string) { + free(varp->vval.v_string); + } + varp->vval.v_string = NULL; + break; case VAR_STRING: free(varp->vval.v_string); varp->vval.v_string = NULL; @@ -18250,6 +18281,7 @@ char_u *get_user_func_name(expand_T *xp, int idx) done = 0; hi = func_hashtab.ht_array; } + assert(hi); if (done < func_hashtab.ht_used) { if (done++ > 0) ++hi; @@ -18465,8 +18497,10 @@ call_user_func ( /* Set l:self to "selfdict". Use "name" to avoid a warning from * some compiler that checks the destination size. */ v = &fc->fixvar[fixvar_idx++].var; +#ifndef __clang_analyzer__ name = v->di_key; STRCPY(name, "self"); +#endif v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX; hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); v->di_tv.v_type = VAR_DICT; @@ -18486,8 +18520,10 @@ call_user_func ( /* Use "name" to avoid a warning from some compiler that checks the * destination size. */ v = &fc->fixvar[fixvar_idx++].var; +#ifndef __clang_analyzer__ name = v->di_key; STRCPY(name, "000"); +#endif v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); v->di_tv.v_type = VAR_LIST; @@ -18774,7 +18810,9 @@ free_funccal ( */ static void add_nr_var(dict_T *dp, dictitem_T *v, char *name, varnumber_T nr) { +#ifndef __clang_analyzer__ STRCPY(v->di_key, name); +#endif v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; hash_add(&dp->dv_hashtab, DI2HIKEY(v)); v->di_tv.v_type = VAR_NUMBER; @@ -18864,8 +18902,10 @@ int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv) else { /* When undoing a return in order to make it pending, get the stored * return rettv. */ - if (reanimate) + if (reanimate) { + assert(current_funccal->rettv); rettv = current_funccal->rettv; + } if (rettv != NULL) { /* Store the value of the pending return. */ diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 58faac1ae7..3cbdbdd81f 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -6301,6 +6301,8 @@ void screenalloc(bool doclear) static int entered = FALSE; /* avoid recursiveness */ static int done_outofmem_msg = FALSE; /* did outofmem message */ int retry_count = 0; + const bool l_enc_utf8 = enc_utf8; + const int l_enc_dbcs = enc_dbcs; retry: /* @@ -6311,8 +6313,8 @@ retry: if ((ScreenLines != NULL && Rows == screen_Rows && Columns == screen_Columns - && enc_utf8 == (ScreenLinesUC != NULL) - && (enc_dbcs == DBCS_JPNU) == (ScreenLines2 != NULL) + && l_enc_utf8 == (ScreenLinesUC != NULL) + && (l_enc_dbcs == DBCS_JPNU) == (ScreenLines2 != NULL) && p_mco == Screen_mco ) || Rows == 0 @@ -6358,13 +6360,13 @@ retry: new_ScreenLines = xmalloc((size_t)((Rows + 1) * Columns * sizeof(schar_T))); memset(new_ScreenLinesC, 0, sizeof(u8char_T *) * MAX_MCO); - if (enc_utf8) { + if (l_enc_utf8) { new_ScreenLinesUC = xmalloc( (size_t)((Rows + 1) * Columns * sizeof(u8char_T))); for (i = 0; i < p_mco; ++i) new_ScreenLinesC[i] = xcalloc((Rows + 1) * Columns, sizeof(u8char_T)); } - if (enc_dbcs == DBCS_JPNU) + if (l_enc_dbcs == DBCS_JPNU) new_ScreenLines2 = xmalloc( (size_t)((Rows + 1) * Columns * sizeof(schar_T))); new_ScreenAttrs = xmalloc((size_t)((Rows + 1) * Columns * sizeof(sattr_T))); @@ -6383,8 +6385,8 @@ retry: if (new_ScreenLinesC[i] == NULL) break; if (new_ScreenLines == NULL - || (enc_utf8 && (new_ScreenLinesUC == NULL || i != p_mco)) - || (enc_dbcs == DBCS_JPNU && new_ScreenLines2 == NULL) + || (l_enc_utf8 && (new_ScreenLinesUC == NULL || i != p_mco)) + || (l_enc_dbcs == DBCS_JPNU && new_ScreenLines2 == NULL) || new_ScreenAttrs == NULL || new_LineOffset == NULL || new_LineWraps == NULL @@ -6432,7 +6434,7 @@ retry: if (!doclear) { (void)memset(new_ScreenLines + new_row * Columns, ' ', (size_t)Columns * sizeof(schar_T)); - if (enc_utf8) { + if (l_enc_utf8) { (void)memset(new_ScreenLinesUC + new_row * Columns, 0, (size_t)Columns * sizeof(u8char_T)); for (i = 0; i < p_mco; ++i) @@ -6440,7 +6442,7 @@ retry: + new_row * Columns, 0, (size_t)Columns * sizeof(u8char_T)); } - if (enc_dbcs == DBCS_JPNU) + if (l_enc_dbcs == DBCS_JPNU) (void)memset(new_ScreenLines2 + new_row * Columns, 0, (size_t)Columns * sizeof(schar_T)); (void)memset(new_ScreenAttrs + new_row * Columns, @@ -6453,12 +6455,12 @@ retry: len = Columns; /* When switching to utf-8 don't copy characters, they * may be invalid now. Also when p_mco changes. */ - if (!(enc_utf8 && ScreenLinesUC == NULL) + if (!(l_enc_utf8 && ScreenLinesUC == NULL) && p_mco == Screen_mco) memmove(new_ScreenLines + new_LineOffset[new_row], ScreenLines + LineOffset[old_row], (size_t)len * sizeof(schar_T)); - if (enc_utf8 && ScreenLinesUC != NULL + if (l_enc_utf8 && ScreenLinesUC != NULL && p_mco == Screen_mco) { memmove(new_ScreenLinesUC + new_LineOffset[new_row], ScreenLinesUC + LineOffset[old_row], @@ -6469,7 +6471,7 @@ retry: ScreenLinesC[i] + LineOffset[old_row], (size_t)len * sizeof(u8char_T)); } - if (enc_dbcs == DBCS_JPNU && ScreenLines2 != NULL) + if (l_enc_dbcs == DBCS_JPNU && ScreenLines2 != NULL) memmove(new_ScreenLines2 + new_LineOffset[new_row], ScreenLines2 + LineOffset[old_row], (size_t)len * sizeof(schar_T)); diff --git a/src/nvim/tag.c b/src/nvim/tag.c index e267280bbd..6ac6dc5cd2 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -10,6 +10,7 @@ * Code to handle tags and the tag stack */ +#include <assert.h> #include <errno.h> #include <inttypes.h> #include <stdbool.h> @@ -2307,6 +2308,7 @@ jumpto_tag ( win_T *curwin_save = NULL; char_u *full_fname = NULL; int old_KeyTyped = KeyTyped; /* getting the file may reset it */ + const int l_g_do_tagpreview = g_do_tagpreview; pbuf = xmalloc(LSIZE); @@ -2363,7 +2365,7 @@ jumpto_tag ( ++RedrawingDisabled; - if (g_do_tagpreview != 0) { + if (l_g_do_tagpreview != 0) { postponed_split = 0; /* don't split again below */ curwin_save = curwin; /* Save current window */ @@ -2395,7 +2397,7 @@ jumpto_tag ( if (keep_help) { /* A :ta from a help file will keep the b_help flag set. For ":ptag" * we need to use the flag from the window where we came from. */ - if (g_do_tagpreview != 0) + if (l_g_do_tagpreview != 0) keep_help_flag = curwin_save->w_buffer->b_help; else keep_help_flag = curbuf->b_help; @@ -2541,7 +2543,7 @@ jumpto_tag ( foldOpenCursor(); } - if (g_do_tagpreview != 0 + if (l_g_do_tagpreview != 0 && curwin != curwin_save && win_valid(curwin_save)) { /* Return cursor to where we were */ validate_cursor(); @@ -2779,7 +2781,8 @@ int get_tags(list_T *list, char_u *pat) TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL); if (ret == OK && num_matches > 0) { for (i = 0; i < num_matches; ++i) { - parse_match(matches[i], &tp); + int parse_result = parse_match(matches[i], &tp); + assert(parse_result == OK); is_static = test_for_static(&tp); /* Skip pseudo-tag lines. */ @@ -2796,7 +2799,7 @@ int get_tags(list_T *list, char_u *pat) || add_tag_field(dict, "cmd", tp.command, tp.command_end) == FAIL || add_tag_field(dict, "kind", tp.tagkind, - tp.tagkind_end) == FAIL + tp.tagkind ? tp.tagkind_end : NULL) == FAIL || dict_add_nr_str(dict, "static", is_static, NULL) == FAIL) ret = FAIL; diff --git a/src/nvim/window.c b/src/nvim/window.c index 9345d740d1..315d5f07de 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -1230,7 +1230,6 @@ static void win_rotate(int upwards, int count) return; } - /* Check if all frames in this row/col have one window. */ for (frp = curwin->w_frame->fr_parent->fr_child; frp != NULL; frp = frp->fr_next) @@ -1246,6 +1245,7 @@ static void win_rotate(int upwards, int count) wp1 = frp->fr_win; win_remove(wp1, NULL); frame_remove(frp); + assert(frp->fr_parent->fr_child); /* find last frame and append removed window/frame after it */ for (; frp->fr_next != NULL; frp = frp->fr_next) @@ -1263,6 +1263,7 @@ static void win_rotate(int upwards, int count) wp2 = wp1->w_prev; /* will become last window */ win_remove(wp1, NULL); frame_remove(frp); + assert(frp->fr_parent->fr_child); /* append the removed window/frame before the first in the list */ win_append(frp->fr_parent->fr_child->fr_win->w_prev, wp1); @@ -2193,6 +2194,7 @@ winframe_remove ( * the frames into this list. */ if (frp2->fr_child == frp) frp2->fr_child = frp->fr_child; + assert(frp->fr_child); frp->fr_child->fr_prev = frp->fr_prev; if (frp->fr_prev != NULL) frp->fr_prev->fr_next = frp->fr_child; @@ -4502,6 +4504,7 @@ void win_drag_vsep_line(win_T *dragwin, int offset) room += fr->fr_width - frame_minwidth(fr, NULL); fr = curfr; /* put fr at window that grows */ } + assert(fr); if (room < offset) /* Not enough room */ offset = room; /* Move as far as we can */ @@ -4973,6 +4976,7 @@ static void last_status_rec(frame_T *fr, int statusline) */ int tabline_height(void) { + assert(first_tabpage); switch (p_stal) { case 0: return 0; case 1: return (first_tabpage->tp_next == NULL) ? 0 : 1; |