Skip to content

Commit

Permalink
ensure CrawlTable/CrawlNum have enough entries
Browse files Browse the repository at this point in the history
  • Loading branch information
pionere committed Aug 31, 2024
1 parent e65e98c commit 19bb705
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 10 deletions.
2 changes: 2 additions & 0 deletions Source/lighting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,7 @@ void TraceLightSource(int nXPos, int nYPos, int nRadius)
nRadius = 2 * (nRadius + 1) * 8 * 16;
static_assert(INT_MAX / (2 * 8 * 16) > MAX_LIGHT_RAD, "Light tracing overflows in TraceLightSource.");
static_assert(MAX_OFFSET == 8, "Light tracing shift must be adjusted in TraceLightSource.");
static_assert(lengthof(CrawlNum) > 15, "TraceLightSource uses CrawlTable/CrawlNum up to radius 15.");
cr = &CrawlTable[CrawlNum[15]];
for (i = (BYTE)*cr; i > 0; i--) {
x1 = nXPos;
Expand Down Expand Up @@ -798,6 +799,7 @@ void DoVision(int nXPos, int nYPos, int nRadius, bool local)
}
}
nRadius = 2 * (nRadius + 1);
static_assert(lengthof(CrawlNum) > 15, "DoVision uses CrawlTable/CrawlNum up to radius 15.");
cr = &CrawlTable[CrawlNum[15]];
for (i = (BYTE)*cr; i > 0; i--) {
x1 = nXPos;
Expand Down
29 changes: 23 additions & 6 deletions Source/missiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ static bool FindClosest(int sx, int sy, int& dx, int& dy)
mid = mid >= 0 ? mid - 1 : -(mid + 1);

static_assert(DBORDERX >= 15 && DBORDERY >= 15, "FindClosest expects a large enough border.");
static_assert(lengthof(CrawlNum) > 15, "FindClosest uses CrawlTable/CrawlNum up to radius 16.");
for (i = 1; i <= 15; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -299,6 +300,7 @@ static bool FindClosestChain(int sx, int sy, int& dx, int& dy)
mid = mid >= 0 ? mid - 1 : -(mid + 1);

static_assert(DBORDERX >= 7 && DBORDERY >= 7, "FindClosestChain expects a large enough border.");
static_assert(lengthof(CrawlNum) > 7, "FindClosestChain uses CrawlTable/CrawlNum up to radius 7.");
for (i = 1; i <= 7; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -1591,6 +1593,7 @@ static int PlaceRune(int mi, int sx, int sy, int dx, int dy, int mitype, int mir
}
mis->_miRange = 16 + 1584; // delay + ttl
static_assert(DBORDERX >= 9 && DBORDERY >= 9, "PlaceRune expects a large enough border.");
static_assert(lengthof(CrawlNum) > 9, "PlaceRune uses CrawlTable/CrawlNum up to radius 9.");
for (i = 0; i <= 9; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = *cr; j > 0; j--) {
Expand All @@ -1616,7 +1619,7 @@ static int PlaceRune(int mi, int sx, int sy, int dx, int dy, int mitype, int mir
*/
int AddFireRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
{
return PlaceRune(mi, sx, sy, dx, dy, MIS_FIREEXP, 0);
return PlaceRune(mi, sx, sy, dx, dy, MIS_FIREEXP, 0); // RUNE_RANGE
}

/**
Expand All @@ -1627,7 +1630,7 @@ int AddFireRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
int AddLightRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
{
static_assert(DBORDERX >= 1 && DBORDERY >= 1, "AddLightRune expects a large enough border.");
return PlaceRune(mi, sx, sy, dx, dy, MIS_LIGHTNINGC, 1);
return PlaceRune(mi, sx, sy, dx, dy, MIS_LIGHTNINGC, 1); // RUNE_RANGE
}

/**
Expand All @@ -1638,7 +1641,7 @@ int AddLightRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster
int AddNovaRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
{
static_assert(DBORDERX >= 1 && DBORDERY >= 1, "AddNovaRune expects a large enough border.");
return PlaceRune(mi, sx, sy, dx, dy, MIS_LIGHTNOVAC, 1);
return PlaceRune(mi, sx, sy, dx, dy, MIS_LIGHTNOVAC, 1); // RUNE_RANGE
}

/**
Expand All @@ -1649,7 +1652,7 @@ int AddNovaRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
int AddWaveRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
{
static_assert(DBORDERX >= 1 && DBORDERY >= 1, "AddWaveRune expects a large enough border.");
return PlaceRune(mi, sx, sy, dx, dy, MIS_FIREWAVEC, 1);
return PlaceRune(mi, sx, sy, dx, dy, MIS_FIREWAVEC, 1); // RUNE_RANGE
}

/**
Expand All @@ -1659,7 +1662,7 @@ int AddWaveRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
*/
int AddStoneRune(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
{
return PlaceRune(mi, sx, sy, dx, dy, MIS_STONE, 0);
return PlaceRune(mi, sx, sy, dx, dy, MIS_STONE, 0); // RUNE_RANGE
}

int AddHorkSpawn(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
Expand Down Expand Up @@ -1751,6 +1754,7 @@ int AddRingC(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, in
mitype = MIS_FIREWALL; //mis->_miType == MIS_FIRERING ? MIS_FIREWALL : MIS_LIGHTWALL;

static_assert(DBORDERX >= 3 && DBORDERY >= 3, "AddRingC expects a large enough border.");
static_assert(lengthof(CrawlNum) > 3, "AddRingC uses CrawlTable/CrawlNum radius 3.");
cr = &CrawlTable[CrawlNum[3]];
for (j = *cr; j > 0; j--) {
tx = sx + *++cr;
Expand Down Expand Up @@ -2095,6 +2099,7 @@ int AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
}

static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddTeleport expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddTeleport uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2351,6 +2356,7 @@ int AddShroud(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, i
mis = &missile[mi];

static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddShroud expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddShroud uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2418,6 +2424,7 @@ int AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int
if (currLvl._dType != DTYPE_TOWN && spllvl >= 0) {
const int RANGE = 6;
static_assert(DBORDERX >= RANGE - 1 && DBORDERY >= RANGE - 1, "AddTown expects a large enough border.");
static_assert(lengthof(CrawlNum) >= RANGE, "AddShroud uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i < RANGE; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2550,6 +2557,7 @@ int AddMeteor(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, i
mis->_miMaxDam = maxdam << 6;

static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddMeteor expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddMeteor uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2747,6 +2755,7 @@ int AddStone(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, in
// assert((unsigned)misource < MAX_PLRS);
mis = &missile[mi];
static_assert(DBORDERX >= 2 && DBORDERY >= 2, "AddStone expects a large enough border.");
static_assert(lengthof(CrawlNum) > 2, "AddStone uses CrawlTable/CrawlNum up to radius 2.");
for (i = 0; i <= 2; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2801,6 +2810,7 @@ int AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
mis = &missile[mi];

static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddGuardian expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddGuardian uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2833,6 +2843,7 @@ int AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, in
mon = &monsters[misource];
if (mon->_mmode > MM_INGAME_LAST) {
static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddGolem expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddGolem uses CrawlTable/CrawlNum up to radius 5.");
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
Expand Down Expand Up @@ -2997,6 +3008,7 @@ int AddWallC(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, in
// (micaster & MST_PLAYER);
// ((unsigned)misource < MAX_PLRS);
static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddWallC expects a large enough border.");
static_assert(lengthof(CrawlNum) > 5, "AddWallC uses CrawlTable/CrawlNum up to radius 5.");
mis = &missile[mi];
for (i = 0; i <= 5; i++) {
cr = &CrawlTable[CrawlNum[i]];
Expand Down Expand Up @@ -3059,6 +3071,7 @@ int AddNovaC(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, in
const int8_t* cr;
// ((micaster & MST_PLAYER) || micaster == MST_OBJECT);
static_assert(DBORDERX >= 3 && DBORDERY >= 3, "AddNovaC expects a large enough border.");
static_assert(lengthof(CrawlNum) > 3, "AddNovaC uses CrawlTable/CrawlNum radius 3.");
cr = &CrawlTable[CrawlNum[3]];
for (i = *cr; i > 0; i--) {
tx = sx + *++cr;
Expand Down Expand Up @@ -3253,6 +3266,7 @@ int AddAttract(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,

dist = 4 + (spllvl >> 2);
static_assert(DBORDERX >= 9 && DBORDERY >= 9, "AddAttract expects a large enough border.");
static_assert(lengthof(CrawlNum) > 9, "AddAttract uses CrawlTable/CrawlNum up to radius 9.");
if (dist > 9)
dist = 9;
for (i = 0; i <= dist; i++) {
Expand Down Expand Up @@ -3951,6 +3965,7 @@ void MI_HorkSpawn(int mi)
// assert(abs(mis->_mix - mis->_misx) <= 1 && abs(mis->_miy - mis->_misy) <= 1);
mis->_miDelFlag = TRUE;
static_assert(DBORDERX >= 1 && DBORDERY >= 1, "MI_HorkSpawn expects a large enough border.");
static_assert(lengthof(CrawlNum) > 1, "MI_HorkSpawn uses CrawlTable/CrawlNum up to radius 1.");
for (i = 0; i <= 1; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = *cr; j > 0; j--) {
Expand Down Expand Up @@ -3981,7 +3996,8 @@ void MI_Rune(int mi)
if (--mis->_miVar3 < 0) {
sx = mis->_mix;
sy = mis->_miy;
cr = &CrawlTable[CrawlNum[mis->_miVar2]];
static_assert(lengthof(CrawlNum) > 1, "MI_Rune uses CrawlTable/CrawlNum up to radius 1.");
cr = &CrawlTable[CrawlNum[mis->_miVar2]]; // RUNE_RANGE
for (j = *cr; j > 0; j--) {
tx = sx + *++cr;
ty = sy + *++cr;
Expand Down Expand Up @@ -4392,6 +4408,7 @@ void MI_Guardian(int mi)
if (mis->_miRange >= 0) {
ex = false;
static_assert(DBORDERX >= 6 && DBORDERY >= 6, "MI_Guardian expects a large enough border.");
static_assert(lengthof(CrawlNum) > 6, "MI_Guardian uses CrawlTable/CrawlNum up to radius 6.");
for (i = 6; i >= 0 && !ex; i--) {
cr = &CrawlTable[CrawlNum[i]];
for (j = *cr; j > 0; j--) {
Expand Down
1 change: 1 addition & 0 deletions Source/monster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3612,6 +3612,7 @@ void MAI_Scav(int mnum)
static_assert(DBORDERY >= 4, "MAI_Scav expects a large enough border II.");
static_assert(MAXDUNX < UCHAR_MAX, "MAI_Scav stores dungeon coordinates in BYTE field I.");
static_assert(MAXDUNY < UCHAR_MAX, "MAI_Scav stores dungeon coordinates in BYTE field II.");
static_assert(lengthof(CrawlNum) > 4, "MAI_Scav uses CrawlTable/CrawlNum up to radius 4.");
assert(CrawlTable[CrawlNum[4]] == 32);
BYTE corpseLocs[32 * 2];
tmp = 0;
Expand Down
5 changes: 3 additions & 2 deletions Source/objects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1425,8 +1425,8 @@ static void FindClosestPlr(int* dx, int* dy)
{
int xx, yy, j, i;
const int8_t* cr;

for (i = 0; i < 10; i++) {
static_assert(lengthof(CrawlNum) > 9, "FindClosestPlr uses CrawlTable/CrawlNum up to radius 9.");
for (i = 0; i <= 9; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = *cr; j > 0; j--) {
xx = *dx + *++cr;
Expand Down Expand Up @@ -2795,6 +2795,7 @@ static void OperateShrine(int pnum, int oi, bool sendmsg)
static_assert(MIS_RUNEFIRE + 2 == MIS_RUNENOVA, "SHRINE_SOLAR expects runes in a given order II.");
static_assert(MIS_RUNEFIRE + 3 == MIS_RUNEWAVE, "SHRINE_SOLAR expects runes in a given order III.");
static_assert(DBORDERX >= 3 && DBORDERY >= 3, "SHRINE_SOLAR expects a large enough border.");
static_assert(lengthof(CrawlNum) > 3, "OperateShrine uses CrawlTable/CrawlNum radius 3.");
const int8_t* cr = &CrawlTable[CrawlNum[3]];
mode = sendmsg ? ICM_SEND : ICM_DUMMY;
for (i = (BYTE)*cr; i > 0; i--) {
Expand Down
5 changes: 3 additions & 2 deletions Source/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -749,8 +749,9 @@ static void PlacePlayer(int pnum)
return;

if (i == lengthof(plrxoff2)) {
static_assert(DBORDERX >= 16 && DBORDERY >= 16, "PlacePlayer expects a large enough border.");
for (i = 2; i < 16; i++) {
static_assert(DBORDERX >= 15 && DBORDERY >= 15, "PlacePlayer expects a large enough border.");
static_assert(lengthof(CrawlNum) > 15, "PlacePlayer uses CrawlTable/CrawlNum up to radius 16.");
for (i = 2; i <= 15; i++) {
cr = &CrawlTable[CrawlNum[i]];
for (j = (BYTE)*cr; j > 0; j--) {
nx = plr._px + *++cr;
Expand Down

0 comments on commit 19bb705

Please sign in to comment.