Avoid undefined behaviour in saveload chunk handlers

Use data() instead of &[0] to avoid issues with empty vectors
This commit is contained in:
Jonathan G Rennison
2021-10-02 16:45:02 +01:00
parent c47fd30330
commit 96ea775b24
3 changed files with 9 additions and 9 deletions

View File

@@ -30,7 +30,7 @@ static void Load_XBSS()
LongBridgeSignalStorage &lbss = _long_bridge_signal_sim_map[index]; LongBridgeSignalStorage &lbss = _long_bridge_signal_sim_map[index];
SlObject(&stub, _long_bridge_signal_storage_stub_desc); SlObject(&stub, _long_bridge_signal_storage_stub_desc);
lbss.signal_red_bits.resize(stub.length); lbss.signal_red_bits.resize(stub.length);
SlArray(&(lbss.signal_red_bits[0]), stub.length, SLE_UINT64); SlArray(lbss.signal_red_bits.data(), stub.length, SLE_UINT64);
} }
} }
@@ -39,7 +39,7 @@ static void RealSave_XBSS(const LongBridgeSignalStorage *lbss)
LongBridgeSignalStorageStub stub; LongBridgeSignalStorageStub stub;
stub.length = (uint32)lbss->signal_red_bits.size(); stub.length = (uint32)lbss->signal_red_bits.size();
SlObject(&stub, _long_bridge_signal_storage_stub_desc); SlObject(&stub, _long_bridge_signal_storage_stub_desc);
SlArray(const_cast<uint64*>(&(lbss->signal_red_bits[0])), stub.length, SLE_UINT64); SlArray(const_cast<uint64*>(lbss->signal_red_bits.data()), stub.length, SLE_UINT64);
} }
static void Save_XBSS() static void Save_XBSS()

View File

@@ -32,7 +32,7 @@ static void RealSave_PLAN(Plan *p)
for (size_t i = 0; i < p->lines.size(); i++) { for (size_t i = 0; i < p->lines.size(); i++) {
PlanLine *pl = p->lines[i]; PlanLine *pl = p->lines[i];
SlWriteUint32((uint32)pl->tiles.size()); SlWriteUint32((uint32)pl->tiles.size());
SlArray(&pl->tiles[0], pl->tiles.size(), SLE_UINT32); SlArray(pl->tiles.data(), pl->tiles.size(), SLE_UINT32);
} }
} }
@@ -60,7 +60,7 @@ static void Load_PLAN()
p->lines[i] = pl; p->lines[i] = pl;
const size_t tile_count = SlReadUint32(); const size_t tile_count = SlReadUint32();
pl->tiles.resize(tile_count); pl->tiles.resize(tile_count);
SlArray(&pl->tiles[0], tile_count, SLE_UINT32); SlArray(pl->tiles.data(), tile_count, SLE_UINT32);
pl->UpdateVisualExtents(); pl->UpdateVisualExtents();
} }
p->SetVisibility(false); p->SetVisibility(false);
@@ -80,7 +80,7 @@ static void Load_PLANLINE()
p->lines[line_index] = pl; p->lines[line_index] = pl;
size_t plsz = SlGetFieldLength() / sizeof(TileIndex); size_t plsz = SlGetFieldLength() / sizeof(TileIndex);
pl->tiles.resize(plsz); pl->tiles.resize(plsz);
SlArray(&pl->tiles[0], plsz, SLE_UINT32); SlArray(pl->tiles.data(), plsz, SLE_UINT32);
pl->UpdateVisualExtents(); pl->UpdateVisualExtents();
} }

View File

@@ -64,7 +64,7 @@ static void Load_TRRP()
TraceRestrictProgram *prog = new (index) TraceRestrictProgram(); TraceRestrictProgram *prog = new (index) TraceRestrictProgram();
SlObject(&stub, _trace_restrict_program_stub_desc); SlObject(&stub, _trace_restrict_program_stub_desc);
prog->items.resize(stub.length); prog->items.resize(stub.length);
SlArray(&(prog->items[0]), stub.length, SLE_UINT32); if (stub.length > 0) SlArray(prog->items.data(), stub.length, SLE_UINT32);
if (SlXvIsFeaturePresent(XSLFI_JOKERPP)) { if (SlXvIsFeaturePresent(XSLFI_JOKERPP)) {
for (size_t i = 0; i < prog->items.size(); i++) { for (size_t i = 0; i < prog->items.size(); i++) {
TraceRestrictItem &item = prog->items[i]; // note this is a reference, TraceRestrictItem &item = prog->items[i]; // note this is a reference,
@@ -99,7 +99,7 @@ static void RealSave_TRRP(TraceRestrictProgram *prog)
TraceRestrictProgramStub stub; TraceRestrictProgramStub stub;
stub.length = (uint32)prog->items.size(); stub.length = (uint32)prog->items.size();
SlObject(&stub, _trace_restrict_program_stub_desc); SlObject(&stub, _trace_restrict_program_stub_desc);
SlArray(&(prog->items[0]), stub.length, SLE_UINT32); SlArray(prog->items.data(), stub.length, SLE_UINT32);
} }
/** /**
@@ -142,7 +142,7 @@ static void Load_TRRS()
SlObject(slot, _trace_restrict_slot_desc); SlObject(slot, _trace_restrict_slot_desc);
SlObject(&stub, _trace_restrict_slot_stub_desc); SlObject(&stub, _trace_restrict_slot_stub_desc);
slot->occupants.resize(stub.length); slot->occupants.resize(stub.length);
if (stub.length) SlArray(&(slot->occupants[0]), stub.length, SLE_UINT32); if (stub.length) SlArray(slot->occupants.data(), stub.length, SLE_UINT32);
} }
TraceRestrictSlot::RebuildVehicleIndex(); TraceRestrictSlot::RebuildVehicleIndex();
} }
@@ -156,7 +156,7 @@ static void RealSave_TRRS(TraceRestrictSlot *slot)
TraceRestrictSlotStub stub; TraceRestrictSlotStub stub;
stub.length = (uint32)slot->occupants.size(); stub.length = (uint32)slot->occupants.size();
SlObject(&stub, _trace_restrict_slot_stub_desc); SlObject(&stub, _trace_restrict_slot_stub_desc);
if (stub.length) SlArray(&(slot->occupants[0]), stub.length, SLE_UINT32); if (stub.length) SlArray(slot->occupants.data(), stub.length, SLE_UINT32);
} }
/** /**