mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2025-01-03 15:39:46 +01:00
Add bounds checks to tile setter and getters
This removes all traces of Undefined Behavior from getting and placing tiles. This mimics the previous behavior (2.2 and below) as reasonably as possible. `vmult` was previously a vector, there was a bunch of unused space directly after the end of the usable space of the vector, which was all filled with zeroes. The same goes for `contents`, having previously been a vector, and so having a bunch of zeroes immediately following the end of the in-bounds space. That's why both are 0 if you index them out of bounds.
This commit is contained in:
parent
344c93e754
commit
cfd5be1bc5
1 changed files with 31 additions and 2 deletions
|
@ -951,7 +951,14 @@ int editorclass::gettileidx(
|
||||||
int mult;
|
int mult;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
mult = vmult[yoff];
|
if (INBOUNDS_ARR(yoff, vmult))
|
||||||
|
{
|
||||||
|
mult = vmult[yoff];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mult = 0;
|
||||||
|
}
|
||||||
|
|
||||||
idx = x + rx*40 + mult;
|
idx = x + rx*40 + mult;
|
||||||
|
|
||||||
|
@ -967,6 +974,11 @@ void editorclass::settile(
|
||||||
) {
|
) {
|
||||||
const int idx = gettileidx(rx, ry, x, y);
|
const int idx = gettileidx(rx, ry, x, y);
|
||||||
|
|
||||||
|
if (!INBOUNDS_ARR(idx, contents))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
contents[idx] = t;
|
contents[idx] = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -978,6 +990,11 @@ int editorclass::gettile(
|
||||||
) {
|
) {
|
||||||
const int idx = gettileidx(rx, ry, x, y);
|
const int idx = gettileidx(rx, ry, x, y);
|
||||||
|
|
||||||
|
if (!INBOUNDS_ARR(idx, contents))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return contents[idx];
|
return contents[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -986,10 +1003,22 @@ int editorclass::getabstile(const int x, const int y)
|
||||||
int idx;
|
int idx;
|
||||||
int yoff;
|
int yoff;
|
||||||
|
|
||||||
yoff = vmult[y];
|
if (INBOUNDS_ARR(y, vmult))
|
||||||
|
{
|
||||||
|
yoff = vmult[y];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yoff = 0;
|
||||||
|
}
|
||||||
|
|
||||||
idx = x + yoff;
|
idx = x + yoff;
|
||||||
|
|
||||||
|
if (!INBOUNDS_ARR(idx, contents))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return contents[idx];
|
return contents[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue