mirror of https://github.com/lua/lua
Negation in constant folding of '>>' may overflow
This commit is contained in:
parent
cfbe378f90
commit
26be27459b
|
@ -62,7 +62,7 @@ static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,
|
|||
case LUA_OPBOR: return intop(|, v1, v2);
|
||||
case LUA_OPBXOR: return intop(^, v1, v2);
|
||||
case LUA_OPSHL: return luaV_shiftl(v1, v2);
|
||||
case LUA_OPSHR: return luaV_shiftl(v1, -v2);
|
||||
case LUA_OPSHR: return luaV_shiftr(v1, v2);
|
||||
case LUA_OPUNM: return intop(-, 0, v1);
|
||||
case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
|
||||
default: lua_assert(0); return 0;
|
||||
|
|
4
lvm.c
4
lvm.c
|
@ -765,12 +765,10 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) {
|
|||
/* number of bits in an integer */
|
||||
#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT)
|
||||
|
||||
|
||||
/*
|
||||
** Shift left operation. (Shift right just negates 'y'.)
|
||||
*/
|
||||
#define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y))
|
||||
|
||||
|
||||
lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
|
||||
if (y < 0) { /* shift right? */
|
||||
if (y <= -NBITS) return 0;
|
||||
|
|
5
lvm.h
5
lvm.h
|
@ -110,6 +110,11 @@ typedef enum {
|
|||
luaC_barrierback(L, gcvalue(t), v); }
|
||||
|
||||
|
||||
/*
|
||||
** Shift right is the same as shift left with a negative 'y'
|
||||
*/
|
||||
#define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y))
|
||||
|
||||
|
||||
|
||||
LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
|
||||
|
|
|
@ -38,6 +38,18 @@ d = d << 32
|
|||
assert(a | b ~ c & d == 0xF4000000 << 32)
|
||||
assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1)
|
||||
|
||||
|
||||
do -- constant folding
|
||||
local code = string.format("return -1 >> %d", math.maxinteger)
|
||||
assert(load(code)() == 0)
|
||||
local code = string.format("return -1 >> %d", math.mininteger)
|
||||
assert(load(code)() == 0)
|
||||
local code = string.format("return -1 << %d", math.maxinteger)
|
||||
assert(load(code)() == 0)
|
||||
local code = string.format("return -1 << %d", math.mininteger)
|
||||
assert(load(code)() == 0)
|
||||
end
|
||||
|
||||
assert(-1 >> 1 == (1 << (numbits - 1)) - 1 and 1 << 31 == 0x80000000)
|
||||
assert(-1 >> (numbits - 1) == 1)
|
||||
assert(-1 >> numbits == 0 and
|
||||
|
|
Loading…
Reference in New Issue