mirror of
https://github.com/lua/lua
synced 2024-11-25 06:09:36 +03:00
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_OPBOR: return intop(|, v1, v2);
|
||||||
case LUA_OPBXOR: return intop(^, v1, v2);
|
case LUA_OPBXOR: return intop(^, v1, v2);
|
||||||
case LUA_OPSHL: return luaV_shiftl(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_OPUNM: return intop(-, 0, v1);
|
||||||
case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
|
case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
|
||||||
default: lua_assert(0); return 0;
|
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 */
|
/* number of bits in an integer */
|
||||||
#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT)
|
#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Shift left operation. (Shift right just negates 'y'.)
|
** 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) {
|
lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
|
||||||
if (y < 0) { /* shift right? */
|
if (y < 0) { /* shift right? */
|
||||||
if (y <= -NBITS) return 0;
|
if (y <= -NBITS) return 0;
|
||||||
|
5
lvm.h
5
lvm.h
@ -110,6 +110,11 @@ typedef enum {
|
|||||||
luaC_barrierback(L, gcvalue(t), v); }
|
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);
|
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 | b ~ c & d == 0xF4000000 << 32)
|
||||||
assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1)
|
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 >> 1 == (1 << (numbits - 1)) - 1 and 1 << 31 == 0x80000000)
|
||||||
assert(-1 >> (numbits - 1) == 1)
|
assert(-1 >> (numbits - 1) == 1)
|
||||||
assert(-1 >> numbits == 0 and
|
assert(-1 >> numbits == 0 and
|
||||||
|
Loading…
Reference in New Issue
Block a user