diff options
| author | Paul Eggert | 2019-08-18 12:11:06 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-08-18 12:12:45 -0700 |
| commit | 780509f29f0aa006a578744f7e871eb6d5ce5931 (patch) | |
| tree | f8b9af7529ea7d617038eebf12b62299a19750d9 /src/data.c | |
| parent | f92d61c06c82d515ee83e340b8af4b1489778404 (diff) | |
| download | emacs-780509f29f0aa006a578744f7e871eb6d5ce5931.tar.gz emacs-780509f29f0aa006a578744f7e871eb6d5ce5931.zip | |
Improve bignum_integer static checking
* src/bignum.h (bignum_integer): Now returns pointer-to-const,
to catch trivial mistakes where the caller might try to modify
a Lisp bignum. Lisp bignums are supposed to be immutable.
All callers changed.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/data.c b/src/data.c index 6db8ea144dd..cf9f8e56133 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -2871,7 +2871,7 @@ static Lisp_Object | |||
| 2871 | bignum_arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args, | 2871 | bignum_arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args, |
| 2872 | ptrdiff_t argnum, intmax_t iaccum, Lisp_Object val) | 2872 | ptrdiff_t argnum, intmax_t iaccum, Lisp_Object val) |
| 2873 | { | 2873 | { |
| 2874 | mpz_t *accum; | 2874 | mpz_t const *accum; |
| 2875 | if (argnum == 0) | 2875 | if (argnum == 0) |
| 2876 | { | 2876 | { |
| 2877 | accum = bignum_integer (&mpz[0], val); | 2877 | accum = bignum_integer (&mpz[0], val); |
| @@ -2882,7 +2882,7 @@ bignum_arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args, | |||
| 2882 | 2882 | ||
| 2883 | while (true) | 2883 | while (true) |
| 2884 | { | 2884 | { |
| 2885 | mpz_t *next = bignum_integer (&mpz[1], val); | 2885 | mpz_t const *next = bignum_integer (&mpz[1], val); |
| 2886 | 2886 | ||
| 2887 | switch (code) | 2887 | switch (code) |
| 2888 | { | 2888 | { |
| @@ -3099,7 +3099,7 @@ integer_mod (Lisp_Object x, Lisp_Object y) | |||
| 3099 | } | 3099 | } |
| 3100 | else | 3100 | else |
| 3101 | { | 3101 | { |
| 3102 | mpz_t *ym = bignum_integer (&mpz[1], y); | 3102 | mpz_t const *ym = bignum_integer (&mpz[1], y); |
| 3103 | bool neg_y = mpz_sgn (*ym) < 0; | 3103 | bool neg_y = mpz_sgn (*ym) < 0; |
| 3104 | mpz_mod (mpz[0], *bignum_integer (&mpz[0], x), *ym); | 3104 | mpz_mod (mpz[0], *bignum_integer (&mpz[0], x), *ym); |
| 3105 | 3105 | ||
| @@ -3269,7 +3269,7 @@ In this case, the sign bit is duplicated. */) | |||
| 3269 | } | 3269 | } |
| 3270 | } | 3270 | } |
| 3271 | 3271 | ||
| 3272 | mpz_t *zval = bignum_integer (&mpz[0], value); | 3272 | mpz_t const *zval = bignum_integer (&mpz[0], value); |
| 3273 | if (XFIXNUM (count) < 0) | 3273 | if (XFIXNUM (count) < 0) |
| 3274 | { | 3274 | { |
| 3275 | if (TYPE_MAXIMUM (mp_bitcnt_t) < - XFIXNUM (count)) | 3275 | if (TYPE_MAXIMUM (mp_bitcnt_t) < - XFIXNUM (count)) |