Mercurial > vim
diff src/structs.h @ 10658:77d66e9ac0ab v8.0.0219
patch 8.0.0219: ubsan reports errors for overflow
commit https://github.com/vim/vim/commit/7a40ea2138102545848ea86a361f1b8dec7552b5
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jan 22 18:34:57 2017 +0100
patch 8.0.0219: ubsan reports errors for overflow
Problem: Ubsan reports errors for integer overflow.
Solution: Define macros for minimum and maximum values. Select an
expression based on the value. (Mike Williams)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 22 Jan 2017 18:45:04 +0100 |
parents | 688b97124d23 |
children | f883a1224396 |
line wrap: on
line diff
--- a/src/structs.h +++ b/src/structs.h @@ -1133,25 +1133,43 @@ typedef long_u hash_T; /* Type for hi_h # ifdef PROTO typedef long varnumber_T; typedef unsigned long uvarnumber_T; +#define VARNUM_MIN LONG_MIN +#define VARNUM_MAX LONG_MAX +#define UVARNUM_MAX ULONG_MAX # else typedef __int64 varnumber_T; typedef unsigned __int64 uvarnumber_T; +#define VARNUM_MIN _I64_MIN +#define VARNUM_MAX _I64_MAX +#define UVARNUM_MAX _UI64_MAX # endif # elif defined(HAVE_STDINT_H) typedef int64_t varnumber_T; typedef uint64_t uvarnumber_T; +#define VARNUM_MIN INT64_MIN +#define VARNUM_MAX INT64_MAX +#define UVARNUM_MAX UINT64_MAX # else typedef long varnumber_T; typedef unsigned long uvarnumber_T; +#define VARNUM_MIN LONG_MIN +#define VARNUM_MAX LONG_MAX +#define UVARNUM_MAX ULONG_MAX # endif #else /* Use 32-bit Number. */ # if VIM_SIZEOF_INT <= 3 /* use long if int is smaller than 32 bits */ typedef long varnumber_T; typedef unsigned long uvarnumber_T; +#define VARNUM_MIN LONG_MIN +#define VARNUM_MAX LONG_MAX +#define UVARNUM_MAX ULONG_MAX # else typedef int varnumber_T; typedef unsigned int uvarnumber_T; +#define VARNUM_MIN INT_MIN +#define VARNUM_MAX INT_MAX +#define UVARNUM_MAX UINT_MAX # endif #endif