]> granicus.if.org Git - vim/commitdiff
patch 8.2.4639: not sufficient parenthesis in preprocessor macros
authorkylo252 <59826753+kylo252@users.noreply.github.com>
Sun, 27 Mar 2022 19:05:17 +0000 (20:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 27 Mar 2022 19:05:17 +0000 (20:05 +0100)
Problem:    Not sufficient parenthesis in preprocessor macros.
Solution:   Add more parenthesis. (closes #10031)

src/globals.h
src/gui.h
src/if_py_both.h
src/macros.h
src/option.h
src/regexp.h
src/spell.h
src/structs.h
src/version.c
src/vim.h
src/vim9.h

index cd8893b307212be2c658139eb516df36731db7e2..1319b1f4b0e716806f43c5af18ffb7a59ca6b167 100644 (file)
@@ -702,10 +702,10 @@ EXTERN win_T      *lastwin;               // last window
 EXTERN win_T   *prevwin INIT(= NULL);  // previous window
 #define ONE_WINDOW (firstwin == lastwin)
 #define W_NEXT(wp) ((wp)->w_next)
-#define FOR_ALL_WINDOWS(wp) for (wp = firstwin; wp != NULL; wp = wp->w_next)
+#define FOR_ALL_WINDOWS(wp) for ((wp) = firstwin; (wp) != NULL; (wp) = (wp)->w_next)
 #define FOR_ALL_FRAMES(frp, first_frame) \
-    for (frp = first_frame; frp != NULL; frp = frp->fr_next)
-#define FOR_ALL_TABPAGES(tp) for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+    for ((frp) = first_frame; (frp) != NULL; (frp) = (frp)->fr_next)
+#define FOR_ALL_TABPAGES(tp) for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next)
 #define FOR_ALL_WINDOWS_IN_TAB(tp, wp) \
     for ((wp) = ((tp) == NULL || (tp) == curtab) \
            ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
@@ -778,7 +778,7 @@ EXTERN buf_T        *curbuf INIT(= NULL);   // currently active buffer
 
 // Iterate through all the signs placed in a buffer
 #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \
-       for (sign = buf->b_signlist; sign != NULL; sign = sign->se_next)
+       for ((sign) = (buf)->b_signlist; (sign) != NULL; (sign) = (sign)->se_next)
 
 // Flag that is set when switching off 'swapfile'.  It means that all blocks
 // are to be loaded into memory.  Shouldn't be global...
@@ -1000,7 +1000,7 @@ EXTERN JMP_BUF x_jump_env;
 #define DBCS_CHT       950     // taiwan
 #define DBCS_CHTU      9950    // euc-tw
 #define DBCS_2BYTE     1       // 2byte-
-#define DBCS_DEBUG     -1
+#define DBCS_DEBUG     (-1)
 
 EXTERN int     enc_dbcs INIT(= 0);             // One of DBCS_xxx values if
                                                // DBCS encoding
index bb8a3d905e3543cf28aaca0aaed63b089ab99861..0d503ae58c6fa2972d0ce07060360ff3866b30ce 100644 (file)
--- a/src/gui.h
+++ b/src/gui.h
 #endif
 
 // Indices for arrays of scrollbars
-#define SBAR_NONE          -1
+#define SBAR_NONE          (-1)
 #define SBAR_LEFT          0
 #define SBAR_RIGHT         1
 #define SBAR_BOTTOM        2
@@ -198,10 +198,10 @@ typedef struct GuiScrollbar
 typedef long       guicolor_T; // handle for a GUI color; for X11 this should
                                // be "Pixel", but that's an unsigned and we
                                // need a signed value
-#define INVALCOLOR (guicolor_T)-11111  // number for invalid color; on 32 bit
+#define INVALCOLOR ((guicolor_T)-11111)        // number for invalid color; on 32 bit
                                   // displays there is a tiny chance this is an
                                   // actual color
-#define CTERMCOLOR (guicolor_T)-11110  // only used for cterm.bg_rgb and
+#define CTERMCOLOR ((guicolor_T)-11110)        // only used for cterm.bg_rgb and
                                        // cterm.fg_rgb: use cterm color
 
 #ifdef FEAT_GUI_GTK
index 6d7b9687ac81714eb897b47f09249a92ecf6187d..84afc15f5930a8e74b60be43316befa070b62ce1 100644 (file)
@@ -30,9 +30,9 @@ static const char *vim_special_path = "_vim_path_";
 #define PyErr_FORMAT2(exc, str, arg1, arg2) PyErr_Format(exc, _(str), arg1,arg2)
 #define PyErr_VIM_FORMAT(str, arg) PyErr_FORMAT(VimError, str, arg)
 
-#define Py_TYPE_NAME(obj) (obj->ob_type->tp_name == NULL \
+#define Py_TYPE_NAME(obj) ((obj)->ob_type->tp_name == NULL \
        ? "(NULL)" \
-       : obj->ob_type->tp_name)
+       : (obj)->ob_type->tp_name)
 
 #define RAISE_NO_EMPTY_KEYS PyErr_SET_STRING(PyExc_ValueError, \
                                            N_("empty keys are not allowed"))
@@ -6686,7 +6686,7 @@ init_structs(void)
 }
 
 #define PYTYPE_READY(type) \
-    if (PyType_Ready(&type)) \
+    if (PyType_Ready(&(type))) \
        return -1;
 
     static int
index 763db4f5682ffab5837242fd3aa731bffcb0e2cd..4cec6c11c872165064d2a7468bf58f34ec18d85b 100644 (file)
 // Advance multi-byte pointer, do not skip over composing chars.
 #define MB_CPTR_ADV(p)     p += enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p)
 // Backup multi-byte pointer. Only use with "p" > "s" !
-#define MB_PTR_BACK(s, p)  p -= has_mbyte ? ((*mb_head_off)(s, p - 1) + 1) : 1
+#define MB_PTR_BACK(s, p)  p -= has_mbyte ? ((*mb_head_off)(s, (p) - 1) + 1) : 1
 // get length of multi-byte char, not including composing chars
 #define MB_CPTR2LEN(p)     (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p))
 
-#define MB_COPY_CHAR(f, t) do { if (has_mbyte) mb_copy_char(&f, &t); else *t++ = *f++; } while (0)
+#define MB_COPY_CHAR(f, t) do { if (has_mbyte) mb_copy_char(&(f), &(t)); else *(t)++ = *(f)++; } while (0)
 #define MB_CHARLEN(p)      (has_mbyte ? mb_charlen(p) : (int)STRLEN(p))
 #define MB_CHAR2LEN(c)     (has_mbyte ? mb_char2len(c) : 1)
 #define PTR2CHAR(p)        (has_mbyte ? mb_ptr2char(p) : (int)*(p))
  * HI2DI() converts a hashitem pointer to a dictitem pointer.
  */
 #define DI2HIKEY(di) ((di)->di_key)
-#define HIKEY2DI(p)  ((dictitem_T *)(p - offsetof(dictitem_T, di_key)))
+#define HIKEY2DI(p)  ((dictitem_T *)((p) - offsetof(dictitem_T, di_key)))
 #define HI2DI(hi)     HIKEY2DI((hi)->hi_key)
 
 /*
 #define CHECK_LIST_MATERIALIZE(l) if ((l)->lv_first == &range_list_item) range_list_materialize(l)
 
 // Inlined version of ga_grow() with optimized condition that it fails.
-#define GA_GROW_FAILS(gap, n) unlikely((((gap)->ga_maxlen - (gap)->ga_len < n) ? ga_grow_inner((gap), (n)) : OK) == FAIL)
+#define GA_GROW_FAILS(gap, n) unlikely((((gap)->ga_maxlen - (gap)->ga_len < (n)) ? ga_grow_inner((gap), (n)) : OK) == FAIL)
 // Inlined version of ga_grow() with optimized condition that it succeeds.
-#define GA_GROW_OK(gap, n) likely((((gap)->ga_maxlen - (gap)->ga_len < n) ? ga_grow_inner((gap), (n)) : OK) == OK)
+#define GA_GROW_OK(gap, n) likely((((gap)->ga_maxlen - (gap)->ga_len < (n)) ? ga_grow_inner((gap), (n)) : OK) == OK)
 
 #ifndef MIN
 # define MIN(a, b) ((a) < (b) ? (a) : (b))
index 2116fe9951805dfe49b007ff78e436790fa8b767..152956167c4f8d20d04164cdda647d21f72737e5 100644 (file)
@@ -131,7 +131,7 @@ typedef enum {
 #endif
 
 // end-of-line style
-#define EOL_UNKNOWN    -1      // not defined yet
+#define EOL_UNKNOWN    (-1)    // not defined yet
 #define EOL_UNIX       0       // NL
 #define EOL_DOS                1       // CR NL
 #define EOL_MAC                2       // CR
@@ -1328,6 +1328,6 @@ enum
 };
 
 // Value for b_p_ul indicating the global value must be used.
-#define NO_LOCAL_UNDOLEVEL -123456
+#define NO_LOCAL_UNDOLEVEL (-123456)
 
 #endif // _OPTION_H_
index 57623386157607419567d6b511425d01dd6b0864..a8bc82248d28961fa6231cbe8c5d73a11c37cd56 100644 (file)
@@ -31,7 +31,7 @@
  * In the NFA engine: how many states are allowed
  */
 #define NFA_MAX_STATES 100000
-#define NFA_TOO_EXPENSIVE -1
+#define NFA_TOO_EXPENSIVE (-1)
 
 // Which regexp engine to use? Needed for vim_regcomp().
 // Must match with 'regexpengine'.
index e1ca380e051c1f35fe208aba81ff027b23412349..a085b0b0cd1e3d8a8f99f959b90fff22f009aa89 100644 (file)
@@ -211,9 +211,9 @@ typedef struct salitem_S
 
 // Values for SP_*ERROR are negative, positive values are used by
 // read_cnt_string().
-#define        SP_TRUNCERROR   -1      // spell file truncated error
-#define        SP_FORMERROR    -2      // format error in spell file
-#define SP_OTHERERROR  -3      // other error while reading spell file
+#define        SP_TRUNCERROR   (-1)    // spell file truncated error
+#define        SP_FORMERROR    (-2)    // format error in spell file
+#define SP_OTHERERROR  (-3)    // other error while reading spell file
 
 /*
  * Structure used in "b_langp", filled from 'spelllang'.
index a83d9ea643b191f92526f5eabfc2eb314a9f1bf3..a153336c9c422a2ff2f526b9cb440d3fc7fd617f 100644 (file)
@@ -2830,7 +2830,7 @@ struct file_buffer
     // flags for use of ":lmap" and IM control
     long       b_p_iminsert;   // input mode for insert
     long       b_p_imsearch;   // input mode for search
-#define B_IMODE_USE_INSERT -1  //      Use b_p_iminsert value for search
+#define B_IMODE_USE_INSERT (-1)        //      Use b_p_iminsert value for search
 #define B_IMODE_NONE 0         //      Input via none
 #define B_IMODE_LMAP 1         //      Input via langmap
 #define B_IMODE_IM 2           //      Input via input method
@@ -3698,7 +3698,7 @@ struct window_S
     winopt_T   w_onebuf_opt;
     winopt_T   w_allbuf_opt;
     // transform a pointer to a "onebuf" option into a "allbuf" option
-#define GLOBAL_WO(p)   ((char *)p + sizeof(winopt_T))
+#define GLOBAL_WO(p)   ((char *)(p) + sizeof(winopt_T))
 
     // A few options have local flags for P_INSECURE.
 #ifdef FEAT_STL_OPT
@@ -4462,7 +4462,7 @@ typedef struct {
 #define FIO_ENCRYPTED  0x1000  // encrypt written bytes
 #define FIO_NOCONVERT  0x2000  // skip encoding conversion
 #define FIO_UCSBOM     0x4000  // check for BOM at start of file
-#define FIO_ALL        -1      // allow all formats
+#define FIO_ALL        (-1)    // allow all formats
 
 // When converting, a read() or write() may leave some bytes to be converted
 // for the next call.  The value is guessed...
index 569d12c2bbaf1920e3f7818346b859b08c602585..680eef1f53daaf209986a50b1d12053be1162475 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4639,
 /**/
     4638,
 /**/
index 0a923f16d024e09364441456fe2faa00a7ed606e..13ce0327385a367e9de76986517ac40d5d9d354f 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -864,9 +864,9 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define FINDFILE_DIR   1       // only directories
 #define FINDFILE_BOTH  2       // files and directories
 
-#define W_ENDCOL(wp)   (wp->w_wincol + wp->w_width)
+#define W_ENDCOL(wp)   ((wp)->w_wincol + (wp)->w_width)
 #ifdef FEAT_MENU
-# define W_WINROW(wp)  (wp->w_winrow + wp->w_winbar_height)
+# define W_WINROW(wp)  ((wp)->w_winrow + (wp)->w_winbar_height)
 #else
 # define W_WINROW(wp)  (wp->w_winrow)
 #endif
@@ -887,7 +887,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 # define SST_MAX_ENTRIES 1000  // maximal size for state stack array
 # define SST_FIX_STATES         7      // size of sst_stack[].
 # define SST_DIST       16     // normal distance between entries
-# define SST_INVALID   (synstate_T *)-1        // invalid syn_state pointer
+# define SST_INVALID   ((synstate_T *)-1)      // invalid syn_state pointer
 
 # define HL_CONTAINED  0x01    // not used on toplevel
 # define HL_TRANSP     0x02    // has no highlighting
@@ -949,7 +949,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define GETFILE_ERROR      1   // normal error
 #define GETFILE_NOT_WRITTEN 2  // "not written" error
 #define GETFILE_SAME_FILE   0  // success, same file
-#define GETFILE_OPEN_OTHER -1  // success, opened another file
+#define GETFILE_OPEN_OTHER (-1)        // success, opened another file
 #define GETFILE_UNUSED     8
 #define GETFILE_SUCCESS(x)  ((x) <= 0)
 
@@ -971,9 +971,9 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 // Values for "noremap" argument of ins_typebuf().  Also used for
 // map->m_noremap and menu->noremap[].
 #define REMAP_YES      0       // allow remapping
-#define REMAP_NONE     -1      // no remapping
-#define REMAP_SCRIPT   -2      // remap script-local mappings only
-#define REMAP_SKIP     -3      // no remapping for first char
+#define REMAP_NONE     (-1)    // no remapping
+#define REMAP_SCRIPT   (-2)    // remap script-local mappings only
+#define REMAP_SKIP     (-3)    // no remapping for first char
 
 // Values for mch_call_shell() second argument
 #define SHELL_FILTER   1       // filtering text
@@ -1069,7 +1069,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 
 // for lnum argument in do_ecmd()
 #define ECMD_LASTL     (linenr_T)0     // use last position in loaded file
-#define ECMD_LAST      (linenr_T)-1    // use last position in all files
+#define ECMD_LAST      ((linenr_T)-1)  // use last position in all files
 #define ECMD_ONE       (linenr_T)1     // use first line
 
 // flags for do_cmdline()
@@ -1265,13 +1265,13 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define MAX_SWAP_PAGE_SIZE 50000
 
 // Special values for current_sctx.sc_sid.
-#define SID_MODELINE   -1      // when using a modeline
-#define SID_CMDARG     -2      // for "--cmd" argument
-#define SID_CARG       -3      // for "-c" argument
-#define SID_ENV                -4      // for sourcing environment variable
-#define SID_ERROR      -5      // option was reset because of an error
-#define SID_NONE       -6      // don't set scriptID
-#define SID_WINLAYOUT  -7      // changing window size
+#define SID_MODELINE   (-1)    // when using a modeline
+#define SID_CMDARG     (-2)    // for "--cmd" argument
+#define SID_CARG       (-3)    // for "-c" argument
+#define SID_ENV                (-4)    // for sourcing environment variable
+#define SID_ERROR      (-5)    // option was reset because of an error
+#define SID_NONE       (-6)    // don't set scriptID
+#define SID_WINLAYOUT  (-7)    // changing window size
 
 /*
  * Events for autocommands.
@@ -1723,7 +1723,7 @@ void *vim_memset(void *, int, size_t);
 // Prefer using emsgf(), because perror() may send the output to the wrong
 // destination and mess up the screen.
 #ifdef HAVE_STRERROR
-# define PERROR(msg)               (void)semsg("%s: %s", (char *)msg, strerror(errno))
+# define PERROR(msg)               (void)semsg("%s: %s", (char *)(msg), strerror(errno))
 #else
 # define PERROR(msg)               do_perror(msg)
 #endif
@@ -1921,7 +1921,7 @@ typedef int sock_T;
     (((unsigned)((code) & 0xC0) >> 6) + 1)
 
 #define SET_NUM_MOUSE_CLICKS(code, num) \
-    (code) = ((code) & 0x3f) | ((((num) - 1) & 3) << 6)
+    ((code) = ((code) & 0x3f) | ((((num) - 1) & 3) << 6))
 
 // Added to mouse column for GUI when 'mousefocus' wants to give focus to a
 // window by simulating a click on its status line.  We could use up to 128 *
@@ -2515,8 +2515,8 @@ typedef enum {
 #endif
 
 // values for vim_handle_signal() that are not a signal
-#define SIGNAL_BLOCK   -1
-#define SIGNAL_UNBLOCK  -2
+#define SIGNAL_BLOCK   (-1)
+#define SIGNAL_UNBLOCK  (-2)
 #if !defined(UNIX) && !defined(VMS)
 # define vim_handle_signal(x) 0
 #endif
@@ -2528,8 +2528,8 @@ typedef enum {
 
 // behavior for bad character, "++bad=" argument
 #define BAD_REPLACE    '?'     // replace it with '?' (default)
-#define BAD_KEEP       -1      // leave it
-#define BAD_DROP       -2      // erase it
+#define BAD_KEEP       (-1)    // leave it
+#define BAD_DROP       (-2)    // erase it
 
 // last argument for do_source()
 #define DOSO_NONE      0
@@ -2552,11 +2552,11 @@ typedef enum {
 // direction for nv_mousescroll() and ins_mousescroll()
 #define MSCR_DOWN      0       // DOWN must be FALSE
 #define MSCR_UP                1
-#define MSCR_LEFT      -1
-#define MSCR_RIGHT     -2
+#define MSCR_LEFT      (-1)
+#define MSCR_RIGHT     (-2)
 
-#define KEYLEN_PART_KEY -1     // keylen value for incomplete key-code
-#define KEYLEN_PART_MAP -2     // keylen value for incomplete mapping
+#define KEYLEN_PART_KEY (-1)   // keylen value for incomplete key-code
+#define KEYLEN_PART_MAP (-2)   // keylen value for incomplete mapping
 #define KEYLEN_REMOVED  9999   // keylen value for removed sequence
 
 // Return values from win32_fileinfo().
@@ -2716,8 +2716,8 @@ typedef enum {
 
 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
 # define ELAPSED_TIMEVAL
-# define ELAPSED_INIT(v) gettimeofday(&v, NULL)
-# define ELAPSED_FUNC(v) elapsed(&v)
+# define ELAPSED_INIT(v) gettimeofday(&(v), NULL)
+# define ELAPSED_FUNC(v) elapsed(&(v))
 typedef struct timeval elapsed_T;
 long elapsed(struct timeval *start_tv);
 #elif defined(MSWIN)
@@ -2734,8 +2734,8 @@ long elapsed(DWORD start_tick);
 #endif
 
 // Replacement for nchar used by nv_replace().
-#define REPLACE_CR_NCHAR    -1
-#define REPLACE_NL_NCHAR    -2
+#define REPLACE_CR_NCHAR    (-1)
+#define REPLACE_NL_NCHAR    (-2)
 
 // flags for term_start()
 #define TERM_START_NOJOB       1
index 60c54d9f55a156716a2250a7a85c8f76a25bb645..81ca1477c9c4da1c8d5f0f70bb8d7746024e0bc0 100644 (file)
@@ -515,10 +515,10 @@ struct dfunc_S {
 extern garray_T def_functions;
 
 // Used for "lnum" when a range is to be taken from the stack.
-#define LNUM_VARIABLE_RANGE -999
+#define LNUM_VARIABLE_RANGE (-999)
 
 // Used for "lnum" when a range is to be taken from the stack and "!" is used.
-#define LNUM_VARIABLE_RANGE_ABOVE -888
+#define LNUM_VARIABLE_RANGE_ABOVE (-888)
 
 // Keep in sync with get_compile_type()
 #ifdef FEAT_PROFILE
@@ -530,7 +530,7 @@ extern garray_T def_functions;
                : (dfunc)->df_instr))
 #else
 # define INSTRUCTIONS(dfunc) \
-       (debug_break_level > 0 || may_break_in_function(dfunc->df_ufunc) \
+       (debug_break_level > 0 || may_break_in_function((dfunc)->df_ufunc) \
                ? (dfunc)->df_instr_debug \
                : (dfunc)->df_instr)
 #endif