diff options
| author | Paul Eggert | 2014-04-27 18:29:44 -0700 |
|---|---|---|
| committer | Paul Eggert | 2014-04-27 18:29:44 -0700 |
| commit | 6ab1b16c54b63d1c4217b6fcea026400029fcc72 (patch) | |
| tree | e3fef3d5e3f4436b2bc59b1006afc98075da06f0 /src/data.c | |
| parent | 196bfaecb0caffcdbb699694139a97148e90e227 (diff) | |
| download | emacs-6ab1b16c54b63d1c4217b6fcea026400029fcc72.tar.gz emacs-6ab1b16c54b63d1c4217b6fcea026400029fcc72.zip | |
Avoid undefined behavior in signed left shift.
This ports to GCC 4.9.0 with -fsanitize=undefined.
* alloc.c (bool_vector_fill, SETMARKBIT, UNSETMARKBIT):
* data.c (Fash):
* regex.c (extract_number):
* lisp.h (make_number, XINT):
Do not shift a 1 bit left into a sign bit.
* alloc.c (struct cons_block, struct float_block): Use unsigned,
not int, for gcmarkbits. All uses changed.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/data.c b/src/data.c index 965ddd215f5..bf863aaed79 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -2895,7 +2895,7 @@ In this case, the sign bit is duplicated. */) | |||
| 2895 | if (XINT (count) >= BITS_PER_EMACS_INT) | 2895 | if (XINT (count) >= BITS_PER_EMACS_INT) |
| 2896 | XSETINT (val, 0); | 2896 | XSETINT (val, 0); |
| 2897 | else if (XINT (count) > 0) | 2897 | else if (XINT (count) > 0) |
| 2898 | XSETINT (val, XINT (value) << XFASTINT (count)); | 2898 | XSETINT (val, XUINT (value) << XFASTINT (count)); |
| 2899 | else if (XINT (count) <= -BITS_PER_EMACS_INT) | 2899 | else if (XINT (count) <= -BITS_PER_EMACS_INT) |
| 2900 | XSETINT (val, XINT (value) < 0 ? -1 : 0); | 2900 | XSETINT (val, XINT (value) < 0 ? -1 : 0); |
| 2901 | else | 2901 | else |