Fix a bunch of undefined behaviour detected by the static analyzer in the saved game format.
This commit is contained in:
@@ -906,7 +906,7 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
|
||||
wipe_sdfs();
|
||||
for(size_t i = 0; i < page["SDF"].size(); i++) {
|
||||
size_t x, y, val;
|
||||
size_t x = sdx_max, y = sdy_max, val = 0;
|
||||
page["SDF"] >> x >> y >> val;
|
||||
if(x <= sdx_max && y <= sdy_max) {
|
||||
stuff_done[x][y] = val;
|
||||
@@ -916,11 +916,11 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
pointers.clear();
|
||||
magic_ptrs.fill(0);
|
||||
for(size_t n = 0; n < page["POINTER"].size(); n++) {
|
||||
int i, j, k;
|
||||
int i = 0, j = 0, k = 0;
|
||||
auto tmp = page["POINTER"] >> i >> j;
|
||||
if(i >= 10 && i < 100) {
|
||||
magic_ptrs[i - 10] = j;
|
||||
} else {
|
||||
} else if(i >= 100 && i < 200) {
|
||||
tmp >> k;
|
||||
pointers[i] = std::make_pair(j, k);
|
||||
}
|
||||
@@ -949,7 +949,7 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
for(size_t n = 0; n < page["TOWNSAVE"].size(); n++) {
|
||||
size_t i;
|
||||
auto tmp = page["TOWNSAVE"] >> i;
|
||||
if(i >= creature_save.size()) continue;
|
||||
if(!tmp || i >= creature_save.size()) continue;
|
||||
std::string hostile;
|
||||
tmp >> creature_save[i].which_town >> hostile;
|
||||
creature_save[i].hostile = hostile == "HOSTILE";
|
||||
@@ -987,25 +987,29 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
}
|
||||
} else if(page.getFirstKey() == "BOAT") {
|
||||
size_t i;
|
||||
page["BOAT"] >> i;
|
||||
if(i >= boats.size()) boats.resize(i + 1);
|
||||
boats[i].exists = true;
|
||||
boats[i].readFrom(page);
|
||||
if(page["BOAT"] >> i) {
|
||||
if(i >= boats.size()) boats.resize(i + 1);
|
||||
boats[i].exists = true;
|
||||
boats[i].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "HORSE") {
|
||||
size_t i;
|
||||
page["HORSE"] >> i;
|
||||
if(i >= horses.size()) horses.resize(i + 1);
|
||||
horses[i].exists = true;
|
||||
horses[i].readFrom(page);
|
||||
if(page["HORSE"] >> i) {
|
||||
if(i >= horses.size()) horses.resize(i + 1);
|
||||
horses[i].exists = true;
|
||||
horses[i].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "MAGICSTORE") {
|
||||
size_t i, j;
|
||||
page["MAGICSTORE"] >> i >> j;
|
||||
magic_store_items[i][j].readFrom(page);
|
||||
if(page["MAGICSTORE"] >> i >> j) {
|
||||
magic_store_items[i][j].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "ENCOUNTER") {
|
||||
int i;
|
||||
page["ENCOUNTER"] >> i;
|
||||
out_c[i].exists = true;
|
||||
out_c[i].readFrom(page);
|
||||
if(page["ENCOUNTER"] >> i) {
|
||||
out_c[i].exists = true;
|
||||
out_c[i].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "TIMER") {
|
||||
size_t i, j;
|
||||
cTimer timer;
|
||||
@@ -1016,18 +1020,20 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
}
|
||||
} else if(page.getFirstKey() == "CREATURE") {
|
||||
size_t i, j;
|
||||
page["CREATURE"] >> i >> j;
|
||||
if(i < 0 || i >= creature_save.size()) continue;
|
||||
creature_save[i].init(j);
|
||||
creature_save[i][j].readFrom(page);
|
||||
if(page["CREATURE"] >> i >> j) {
|
||||
if(i < 0 || i >= creature_save.size()) continue;
|
||||
creature_save[i].init(j);
|
||||
creature_save[i][j].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "STORED") {
|
||||
size_t i, j;
|
||||
page["STORED"] >> i >> j;
|
||||
if(i >= 3) continue;
|
||||
if(j >= stored_items[i].size()) {
|
||||
stored_items[i].resize(j + 1);
|
||||
if(page["STORED"] >> i >> j) {
|
||||
if(i >= 3) continue;
|
||||
if(j >= stored_items[i].size()) {
|
||||
stored_items[i].resize(j + 1);
|
||||
}
|
||||
stored_items[i][j].readFrom(page);
|
||||
}
|
||||
stored_items[i][j].readFrom(page);
|
||||
} else if(page.getFirstKey() == "SUMMON") {
|
||||
page["SUMMON"] >> monst_i;
|
||||
if(monst_i >= summons.size()) {
|
||||
@@ -1062,15 +1068,16 @@ void cParty::readFrom(const cTagFile& file) {
|
||||
} else if(page.getFirstKey() == "JOBBANK") {
|
||||
size_t i;
|
||||
job_bank_t bank;
|
||||
page["JOBBANK"] >> i >> bank.anger;
|
||||
if(i >= job_banks.size()) {
|
||||
job_banks.resize(i + 1);
|
||||
if(page["JOBBANK"] >> i >> bank.anger) {
|
||||
if(i >= job_banks.size()) {
|
||||
job_banks.resize(i + 1);
|
||||
}
|
||||
std::vector<int> jobs;
|
||||
page["JOB"].extractSparse(jobs);
|
||||
bank.inited = !jobs.empty();
|
||||
std::copy_n(jobs.begin(), std::min(jobs.size(), bank.jobs.size()), bank.jobs.begin());
|
||||
job_banks[i] = bank;
|
||||
}
|
||||
std::vector<int> jobs;
|
||||
page["JOB"].extractSparse(jobs);
|
||||
bank.inited = !jobs.empty();
|
||||
std::copy_n(jobs.begin(), std::min(jobs.size(), bank.jobs.size()), bank.jobs.begin());
|
||||
job_banks[i] = bank;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1300,23 +1300,23 @@ void cPlayer::readFrom(const cTagFile& file) {
|
||||
|
||||
equip.reset();
|
||||
for(size_t n = 0; n < page["EQUIP"].size(); n++) {
|
||||
size_t i;
|
||||
size_t i = equip.size();
|
||||
page["EQUIP"] >> i;
|
||||
equip[i] = true;
|
||||
if(i < equip.size()) equip[i] = true;
|
||||
}
|
||||
|
||||
mage_spells.reset();
|
||||
for(size_t n = 0; n < page["MAGE"].size(); n++) {
|
||||
size_t i;
|
||||
size_t i = mage_spells.size();
|
||||
page["MAGE"] >> i;
|
||||
mage_spells[i] = true;
|
||||
if(i < mage_spells.size()) mage_spells[i] = true;
|
||||
}
|
||||
|
||||
priest_spells.reset();
|
||||
for(size_t n = 0; n < page["PRIEST"].size(); n++) {
|
||||
size_t i;
|
||||
size_t i = priest_spells.size();
|
||||
page["PRIEST"] >> i;
|
||||
priest_spells[i] = true;
|
||||
if(i < priest_spells.size()) priest_spells[i] = true;
|
||||
}
|
||||
|
||||
traits.clear();
|
||||
@@ -1336,7 +1336,7 @@ void cPlayer::readFrom(const cTagFile& file) {
|
||||
party->next_pc_id = max(unique_id + 1, party->next_pc_id);
|
||||
}
|
||||
} else if(page.getFirstKey() == "ITEM") {
|
||||
size_t i;
|
||||
size_t i = items.size();
|
||||
page["ITEM"] >> i;
|
||||
if(i >= items.size()) continue;
|
||||
items[i].readFrom(page);
|
||||
|
@@ -910,15 +910,17 @@ void cCurTown::readFrom(const cTagFile& file){
|
||||
}
|
||||
} else if(page.getFirstKey() == "ITEM") {
|
||||
size_t i;
|
||||
page["ITEM"] >> i;
|
||||
if(i >= items.size()) items.resize(i + 1);
|
||||
items[i].readFrom(page);
|
||||
if(page["ITEM"] >> i) {
|
||||
if(i >= items.size()) items.resize(i + 1);
|
||||
items[i].readFrom(page);
|
||||
}
|
||||
} else if(page.getFirstKey() == "CREATURE") {
|
||||
size_t i;
|
||||
page["CREATURE"] >> i;
|
||||
monst.init(i);
|
||||
monst[i].readFrom(page);
|
||||
monst[i].active = true;
|
||||
if(page["CREATURE"] >> i) {
|
||||
monst.init(i);
|
||||
monst[i].readFrom(page);
|
||||
monst[i].active = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user