Lunatic: replace 'idx >= BOUND+0ULL' idiom with 'not (idx >= 0 and idx < BOUND)'

git-svn-id: https://svn.eduke32.com/eduke32@3964 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-07-19 12:49:02 +00:00
parent 4872adb3c8
commit 3835019c70
9 changed files with 41 additions and 40 deletions

View file

@ -60,7 +60,7 @@ function new(basetype, numelts, showname, typename, rng, mtadd)
local mt = { local mt = {
__index = function(ar, idx) __index = function(ar, idx)
if (idx >= numelts+0ULL) then if (not (idx >= 0 and idx < numelts)) then
error("out-of-bounds "..showname.." read access", 2) error("out-of-bounds "..showname.." read access", 2)
end end
return ffi.cast(eltptr_t, ar)[idx] return ffi.cast(eltptr_t, ar)[idx]
@ -69,7 +69,7 @@ function new(basetype, numelts, showname, typename, rng, mtadd)
-- NOTE: this function will be dead code if the prefixed __newindex -- NOTE: this function will be dead code if the prefixed __newindex
-- errors out unconditionally or the bcarray is declared 'const'. -- errors out unconditionally or the bcarray is declared 'const'.
__newindex = function(ar, idx, val) __newindex = function(ar, idx, val)
if (idx >= numelts+0ULL) then if (not (idx >= 0 and idx < numelts)) then
error("out-of-bounds "..showname.." write access", 2) error("out-of-bounds "..showname.." write access", 2)
end end
ffi.cast(eltptr_t, ar)[idx] = val ffi.cast(eltptr_t, ar)[idx] = val

View file

@ -11,13 +11,13 @@ local bcheck = {}
--== ENGINE ==-- --== ENGINE ==--
function bcheck.sector_idx(sectnum) function bcheck.sector_idx(sectnum)
if (sectnum >= ffiC.numsectors+0ULL) then if (not (sectnum >= 0 and sectnum < ffiC.numsectors)) then
error("invalid sector number "..sectnum, 3) error("invalid sector number "..sectnum, 3)
end end
end end
function bcheck.wall_idx(wallnum) function bcheck.wall_idx(wallnum)
if (wallnum >= ffiC.numwalls+0ULL) then if (not (wallnum >= 0 and wallnum < ffiC.numwalls)) then
error("invalid wall number "..wallnum, 3) error("invalid wall number "..wallnum, 3)
end end
end end
@ -25,13 +25,14 @@ end
-- TODO: Provide another function that also checks whether the sprite exists in -- TODO: Provide another function that also checks whether the sprite exists in
-- the game world (statnum != MAXSTATUS). -- the game world (statnum != MAXSTATUS).
function bcheck.sprite_idx(spritenum) function bcheck.sprite_idx(spritenum)
if (spritenum >= ffiC.MAXSPRITES+0ULL) then -- if (not (spritenum >= 0 and spritenum < ffiC.MAXSPRITES)) then
if (not (spritenum >= 0 and spritenum < ffiC.MAXSPRITES)) then
error("invalid sprite number "..spritenum, 3) error("invalid sprite number "..spritenum, 3)
end end
end end
function bcheck.tile_idx(tilenum) function bcheck.tile_idx(tilenum)
if (tilenum >= ffiC.MAXTILES+0ULL) then if (not (tilenum >= 0 and tilenum < ffiC.MAXTILES)) then
error("invalid tile number "..tilenum, 3) error("invalid tile number "..tilenum, 3)
end end
end end
@ -40,43 +41,43 @@ end
--== GAME ==-- --== GAME ==--
function bcheck.player_idx(snum) function bcheck.player_idx(snum)
if (snum >= ffiC.playerswhenstarted+0ULL) then if (not (snum >= 0 and snum < ffiC.playerswhenstarted)) then
error("invalid player number "..snum, 3) error("invalid player number "..snum, 3)
end end
end end
function bcheck.sound_idx(sndidx) function bcheck.sound_idx(sndidx)
if (sndidx >= con_lang.MAXSOUNDS+0ULL) then if (not (sndidx >= 0 and sndidx < con_lang.MAXSOUNDS)) then
error("invalid sound number "..sndidx, 3) error("invalid sound number "..sndidx, 3)
end end
end end
function bcheck.weapon_idx(weap) function bcheck.weapon_idx(weap)
if (weap >= ffiC.MAX_WEAPONS+0ULL) then if (not (weap >= 0 and weap < ffiC.MAX_WEAPONS)) then
error("Invalid weapon ID "..weap, 3) error("Invalid weapon ID "..weap, 3)
end end
end end
function bcheck.inventory_idx(inv) function bcheck.inventory_idx(inv)
if (inv >= ffiC.GET_MAX+0ULL) then if (not (inv >= 0 and inv < ffiC.GET_MAX)) then
error("Invalid inventory ID "..inv, 3) error("Invalid inventory ID "..inv, 3)
end end
end end
function bcheck.volume_idx(volume) function bcheck.volume_idx(volume)
if (volume >= con_lang.MAXVOLUMES+0ULL) then if (not (volume >= 0 and volume < con_lang.MAXVOLUMES)) then
error("invalid volume number "..volume, 3) error("invalid volume number "..volume, 3)
end end
end end
function bcheck.level_idx(level) function bcheck.level_idx(level)
if (level >= con_lang.MAXLEVELS+0ULL) then if (not (level >= 0 and level < con_lang.MAXLEVELS)) then
error("invalid level number "..level, 3) error("invalid level number "..level, 3)
end end
end end
function bcheck.quote_idx(qnum, onlyidx) function bcheck.quote_idx(qnum, onlyidx)
if (qnum >= con_lang.MAXQUOTES+0ULL) then if (not (qnum >= 0 and qnum < con_lang.MAXQUOTES)) then
error("invalid quote number "..qnum, 3) error("invalid quote number "..qnum, 3)
end end

View file

@ -268,7 +268,7 @@ function insertsprite(tab_or_tilenum, ...)
check_sector_idx(sectnum) check_sector_idx(sectnum)
check_allnumbers(shade, xrepeat, yrepeat, ang, xvel, zvel, owner) check_allnumbers(shade, xrepeat, yrepeat, ang, xvel, zvel, owner)
if (statnum >= ffiC.MAXSTATUS+0ULL) then if (not (statnum >= 0 and statnum < ffiC.MAXSTATUS)) then
error("invalid 'statnum' argument to insertsprite: must be a status number [0 .. MAXSTATUS-1]", 2) error("invalid 'statnum' argument to insertsprite: must be a status number [0 .. MAXSTATUS-1]", 2)
end end
@ -771,11 +771,11 @@ end
function _getkeyname(qdst, gfuncnum, which) function _getkeyname(qdst, gfuncnum, which)
local cstr_dst = bcheck.quote_idx(qdst) local cstr_dst = bcheck.quote_idx(qdst)
if (gfuncnum >= ffiC.NUMGAMEFUNCTIONS+0ULL) then if (not (gfuncnum >= 0 and gfuncnum < ffiC.NUMGAMEFUNCTIONS)) then
error("invalid game function number "..gfuncnum, 2) error("invalid game function number "..gfuncnum, 2)
end end
if (which >= 3+0ULL) then if (not (which >= 0 and which < 3)) then
error("third argument to getkeyname must be 0, 1 or 2", 2) error("third argument to getkeyname must be 0, 1 or 2", 2)
end end
@ -830,7 +830,7 @@ function _qgetsysstr(qdst, what, pli)
ffi.copy(dst, "multiplayer not yet implemented") -- TODO_MP ffi.copy(dst, "multiplayer not yet implemented") -- TODO_MP
elseif (what == ffiC.STR_VOLUMENAME) then elseif (what == ffiC.STR_VOLUMENAME) then
local vol = ffiC.ud.volume_number local vol = ffiC.ud.volume_number
assert(vol+0ULL < con_lang.MAXVOLUMES) assert(not (vol >= con_lang.MAXVOLUMES+0ULL))
ffi.copy(dst, ffiC.EpisodeNames[vol], ffi.sizeof(ffiC.EpisodeNames[0])) ffi.copy(dst, ffiC.EpisodeNames[vol], ffi.sizeof(ffiC.EpisodeNames[0]))
else else
error("unknown system string ID "..what, 2) error("unknown system string ID "..what, 2)
@ -870,7 +870,7 @@ end
function _digitalnumber(tilenum, x, y, num, shade, pal, function _digitalnumber(tilenum, x, y, num, shade, pal,
orientation, cx1, cy1, cx2, cy2, zoom) orientation, cx1, cy1, cx2, cy2, zoom)
if (tilenum >= ffiC.MAXTILES-9+0ULL) then if (not (tilenum >= 0 and tilenum >= ffiC.MAXTILES-9)) then
error("invalid base tile number "..tilenum, 2) error("invalid base tile number "..tilenum, 2)
end end
@ -879,7 +879,7 @@ function _digitalnumber(tilenum, x, y, num, shade, pal,
end end
local function text_check_common(tilenum, orientation) local function text_check_common(tilenum, orientation)
if (tilenum >= ffiC.MAXTILES-255+0ULL) then if (not (tilenum >= 0 and tilenum < ffiC.MAXTILES-255)) then
error("invalid base tile number "..tilenum, 3) error("invalid base tile number "..tilenum, 3)
end end
@ -1992,7 +1992,7 @@ local function check_gamearray_idx(gar, idx, addstr)
-- system gamearray: currently, only g_tile.sizx/sizy. -- system gamearray: currently, only g_tile.sizx/sizy.
local size = rawget(gar, '_size') or ffiC.MAXTILES local size = rawget(gar, '_size') or ffiC.MAXTILES
if (idx >= size+0ULL) then if (not (idx >= 0 and idx < size)) then
addstr = addstr or "" addstr = addstr or ""
error("invalid "..addstr.."array index "..idx, 3) error("invalid "..addstr.."array index "..idx, 3)
end end

View file

@ -983,7 +983,7 @@ local literal_mov = { [0]=con_move_ct(0), [1]=con_move_ct(1) }
local function get_actor_idx(a) local function get_actor_idx(a)
local i = ffi.cast(actor_ptr_ct, a)-ffi.cast(actor_ptr_ct, ffiC.actor) local i = ffi.cast(actor_ptr_ct, a)-ffi.cast(actor_ptr_ct, ffiC.actor)
assert(not (i >= ffiC.MAXSPRITES+0ULL)) -- assert(not (i >= ffiC.MAXSPRITES+0ULL))
return i return i
end end
@ -1117,14 +1117,14 @@ local actor_mt = {
-- Getters/setters. -- Getters/setters.
_get_t_data = function(a, idx) _get_t_data = function(a, idx)
if (idx >= 10ULL) then if (not (idx >= 0 and idx < 10)) then
error("invalid t_data index "..idx, 2) error("invalid t_data index "..idx, 2)
end end
return ffi.cast(actor_ptr_ct, a).t_data[idx] return ffi.cast(actor_ptr_ct, a).t_data[idx]
end, end,
_set_t_data = function(a, idx, val) _set_t_data = function(a, idx, val)
if (idx >= 10ULL) then if (not (idx >= 0 and idx < 10)) then
error("invalid t_data index "..idx, 2) error("invalid t_data index "..idx, 2)
end end
ffi.cast(actor_ptr_ct, a).t_data[idx] = val ffi.cast(actor_ptr_ct, a).t_data[idx] = val
@ -1246,7 +1246,7 @@ local weapondata_mt = {
-- Get weapon index as pointer difference first. PLAYER_0. -- Get weapon index as pointer difference first. PLAYER_0.
local wi = ffi.cast(weapondata_ptr_ct, wd) local wi = ffi.cast(weapondata_ptr_ct, wd)
- ffi.cast(weapondata_ptr_ct, ffiC.g_playerWeapon) - ffi.cast(weapondata_ptr_ct, ffiC.g_playerWeapon)
assert(not (wi >= ffiC.MAX_WEAPONS+0ULL)) assert(wi >= 0 and wi < ffiC.MAX_WEAPONS)
-- Set g_weaponOverridden[wi][member], but without invoking -- Set g_weaponOverridden[wi][member], but without invoking
-- weapondata_t's __newindex metamethod (i.e. us)! -- weapondata_t's __newindex metamethod (i.e. us)!
@ -1513,7 +1513,7 @@ end
function gv_access._set_guniqhudid(id) function gv_access._set_guniqhudid(id)
local MAXUNIQHUDID = 256 -- KEEPINSYNC build.h local MAXUNIQHUDID = 256 -- KEEPINSYNC build.h
if (id >= MAXUNIQHUDID+0ULL) then if (not (id >= 0 and id < MAXUNIQHUDID)) then
error("invalid unique HUD ID "..id) error("invalid unique HUD ID "..id)
end end
ffiC.guniqhudid = id ffiC.guniqhudid = id
@ -1986,7 +1986,7 @@ local function our_gameactor(args)
if (type(tilenum) ~= "number") then if (type(tilenum) ~= "number") then
error("invalid argument #1 to gameactor: must be a number", 2) error("invalid argument #1 to gameactor: must be a number", 2)
end end
if (tilenum >= ffiC.MAXTILES+0ULL) then if (not (tilenum >= 0 and tilenum < ffiC.MAXTILES)) then
error("invalid argument #1 to gameactor: must be a tile number [0..gv.MAXTILES-1]", 2) error("invalid argument #1 to gameactor: must be a tile number [0..gv.MAXTILES-1]", 2)
end end
@ -2124,7 +2124,7 @@ local function our_gameevent(args)
if (type(event) ~= "number") then if (type(event) ~= "number") then
error("invalid argument #1 to gameevent: must be a number or event label", 2) error("invalid argument #1 to gameevent: must be a number or event label", 2)
end end
if (event >= con_lang.MAXEVENTS+0ULL) then if (not (event >= 0 and event < con_lang.MAXEVENTS)) then
error("invalid argument #1 to gameevent: must be an event number (0 .. MAXEVENTS-1)", 2) error("invalid argument #1 to gameevent: must be an event number (0 .. MAXEVENTS-1)", 2)
end end

View file

@ -464,7 +464,7 @@ local sectortype_ptr_ct = ffi.typeof("$ *", ffi.typeof(strip_const(SECTOR_STRUCT
local function get_sector_idx(sec) local function get_sector_idx(sec)
local i = ffi.cast(sectortype_ptr_ct, sec)-ffi.cast(sectortype_ptr_ct, ffiC.sector) local i = ffi.cast(sectortype_ptr_ct, sec)-ffi.cast(sectortype_ptr_ct, ffiC.sector)
assert(not (i >= ffiC.numsectors+0ULL)) -- assert(i >= 0 and i < ffiC.numsectors)
return i return i
end end
@ -671,7 +671,7 @@ local tspritetype_mt = deep_copy(spritetype_mt)
-- http://www.freelists.org/post/luajit/FFI-versus-Lua-C-API-in-purely-interpreted-mode -- http://www.freelists.org/post/luajit/FFI-versus-Lua-C-API-in-purely-interpreted-mode
local function get_sprite_idx(spr) local function get_sprite_idx(spr)
local i = ffi.cast(spritetype_ptr_ct, spr)-ffi.cast(spritetype_ptr_ct, ffiC.sprite) local i = ffi.cast(spritetype_ptr_ct, spr)-ffi.cast(spritetype_ptr_ct, ffiC.sprite)
assert(not (i >= ffiC.MAXSPRITES+0ULL)) -- assert(i >= 0 and i < ffiC.MAXSPRITES)
return i return i
end end
@ -727,7 +727,7 @@ end
function tspritetype_mt.__index.setpos(tspr, pos, newsect) function tspritetype_mt.__index.setpos(tspr, pos, newsect)
tspr.x, tspr.y, tspr.z = pos.x, pos.y, pos.z tspr.x, tspr.y, tspr.z = pos.x, pos.y, pos.z
if (newsect ~= nil) then if (newsect ~= nil) then
tspr:set_sectnum(newsect) tspr:changesect(newsect)
end end
return tspr return tspr
end end
@ -735,7 +735,7 @@ end
function tspritetype_mt.__index.updatesect(tspr, flags) function tspritetype_mt.__index.updatesect(tspr, flags)
local newsect = l_updatesector(tspr, tspr.sectnum, flags) local newsect = l_updatesector(tspr, tspr.sectnum, flags)
if (newsect ~= -1 and newsect ~= tspr.sectnum) then if (newsect ~= -1 and newsect ~= tspr.sectnum) then
tspr:set_sectnum(newsect) tspr:changesect(newsect)
end end
return newsect return newsect
end end
@ -927,7 +927,7 @@ l_changesect = static_members.sprite.changesect
function static_members.sprite.changestat(spritenum, statnum, noerr) function static_members.sprite.changestat(spritenum, statnum, noerr)
-- TODO: see gameexec.c's CON_CHANGESPRITESTAT. -- TODO: see gameexec.c's CON_CHANGESPRITESTAT.
check_sprite_idx(spritenum) check_sprite_idx(spritenum)
if (statnum >= ffiC.MAXSTATUS+0ULL) then if (not (statnum >= 0 and statnum < ffiC.MAXSTATUS)) then
error("invalid status number "..statnum, 2) error("invalid status number "..statnum, 2)
end end
if (ffiC.changespritestat(spritenum, statnum)==-1 and not noerr) then if (ffiC.changespritestat(spritenum, statnum)==-1 and not noerr) then
@ -1080,7 +1080,7 @@ local function iter_spritesofstat_safe(tab, i)
end end
function spritesofstat(stat, maydelete) function spritesofstat(stat, maydelete)
if (stat >= ffiC.MAXSTATUS+0ULL) then if (not (stat >= 0 and stat < ffiC.MAXSTATUS)) then
error("passed invalid statnum to spritesofstat iterator", 2) error("passed invalid statnum to spritesofstat iterator", 2)
end end
@ -1103,7 +1103,7 @@ local function iter_sectorsofbunch(cf, i)
end end
function sectorsofbunch(bunchnum, cf) function sectorsofbunch(bunchnum, cf)
if (bunchnum >= ffiC.numyaxbunches+0ULL) then if (not (bunchnum >= 0 and bunchnum < ffiC.numyaxbunches)) then
error("passed invalid bunchnum to sectorsofbunch iterator", 2) error("passed invalid bunchnum to sectorsofbunch iterator", 2)
end end
if (not (cf == 0 or cf == 1)) then if (not (cf == 0 or cf == 1)) then

View file

@ -240,6 +240,8 @@ local function restore_point2(alsosectorp)
end end
local function saveboard_maptext(filename, pos, ang, cursectnum) local function saveboard_maptext(filename, pos, ang, cursectnum)
assert(ffiC.numsectors > 0)
-- First, temporarily tweak wall[].point2. -- First, temporarily tweak wall[].point2.
if (save_tweak_point2()) then if (save_tweak_point2()) then
return -1 return -1
@ -448,8 +450,8 @@ local function loadboard_maptext(fil, posptr, angptr, cursectnumptr)
local numsectors, numwalls, numsprites = #msector, #mwall, #msprite local numsectors, numwalls, numsprites = #msector, #mwall, #msprite
local sector, wall, sprite = ffiC.sector, ffiC.wall, ffiC.sprite local sector, wall, sprite = ffiC.sector, ffiC.wall, ffiC.sprite
if (numsectors+0ULL > ffiC.MAXSECTORS or numwalls+0ULL > ffiC.MAXWALLS or if (numsectors == 0 or numsectors > ffiC.MAXSECTORS or
numsprites+0ULL > ffiC.MAXSPRITES) numwalls > ffiC.MAXWALLS or numsprites > ffiC.MAXSPRITES)
then then
return RETERR-9 return RETERR-9
end end

View file

@ -365,6 +365,7 @@ local function new_initial_gvartab()
yxaspect = RO "_gv._get_yxaspect()", yxaspect = RO "_gv._get_yxaspect()",
viewingrange = RO "_gv._get_viewingrange()", viewingrange = RO "_gv._get_viewingrange()",
-- TODO: gravitationalconstant, gametype_flags
numsectors = RO "_gv.numsectors", numsectors = RO "_gv.numsectors",
NUMSECTORS = RO "_gv.numsectors", NUMSECTORS = RO "_gv.numsectors",

View file

@ -190,9 +190,6 @@ checkfail("local w = player[0].weapon[-1]", "out-of-bounds weapon read access")
--player[0].weapon.firesound = 1e5 --player[0].weapon.firesound = 1e5
checkfail("player[0].weapon.SHOTGUN.firesound = 1e5", "invalid sound number") checkfail("player[0].weapon.SHOTGUN.firesound = 1e5", "invalid sound number")
checkfail("player[0].weapon.SHOTGUN.firesound = 0/0", "must be a non-NaN number") checkfail("player[0].weapon.SHOTGUN.firesound = 0/0", "must be a non-NaN number")
-- XXX XXX XXX: FAILS!
-- inf=1/0; inf >= 1ull <- yields FALSE on x86_64 (inf->uint64_t conversion: undefined!)
-- Related (Mike used 0ULL here): http://www.freelists.org/post/luajit/Stack-trace-on-SIGSEGV,4
checkfail("player[0].weapon.SHOTGUN.firesound = 1/0", "invalid sound number") checkfail("player[0].weapon.SHOTGUN.firesound = 1/0", "invalid sound number")
-- NOTE: It should only be relied on that setting e.g. .firesound to -1 sets it -- NOTE: It should only be relied on that setting e.g. .firesound to -1 sets it
-- to 0, not other negative values. -- to 0, not other negative values.

View file

@ -54,7 +54,7 @@ local band = bit.band
local function ksc_common(ang) local function ksc_common(ang)
ang = band(ang, 2047) ang = band(ang, 2047)
assert(ang < 2048+0ULL) -- might have been passed NaN assert(ang >= 0 and ang < 2048) -- might have been passed NaN
return ang return ang
end end