host-bmc: Migrate to placement_new from reinterpret casting
reinterpret_cast is prohibited by the C++ core guidelines because
it takes the behavior outside the language definition and gives
problems with type safety. Placement-new on the other-hand allows
to control the object storage while still properly instantiating
an object,keeping the behavior inside the C++ language
specification.
Change-Id: If8dcc8ebb592692110a7c96485021e0df660f576
Signed-off-by: Pavithra Barithaya <pavithrabarithaya07@gmail.com>
diff --git a/host-bmc/dbus_to_event_handler.cpp b/host-bmc/dbus_to_event_handler.cpp
index 3eef16a..6149050 100644
--- a/host-bmc/dbus_to_event_handler.cpp
+++ b/host-bmc/dbus_to_event_handler.cpp
@@ -31,7 +31,7 @@
std::vector<uint8_t> requestMsg(
sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
eventDataVec.size());
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_platform_event_message_req(
instanceId, 1 /*formatVersion*/, TERMINUS_ID /*tId*/, eventType,
@@ -97,8 +97,7 @@
{
std::vector<uint8_t> sensorEventDataVec{};
sensorEventDataVec.resize(sensorEventSize);
- auto eventData = reinterpret_cast<struct pldm_sensor_event_data*>(
- sensorEventDataVec.data());
+ auto eventData = new (sensorEventDataVec.data()) pldm_sensor_event_data;
eventData->sensor_id = sensorId;
eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
eventData->event_class[0] = static_cast<uint8_t>(offset);
@@ -150,9 +149,8 @@
if (findValue)
{
- auto eventData =
- reinterpret_cast<struct pldm_sensor_event_data*>(
- sensorEventDataVec.data());
+ auto eventData = new (sensorEventDataVec.data())
+ pldm_sensor_event_data;
eventData->event_class[1] = itr.first;
if (sensorCacheMap.contains(sensorId) &&
sensorCacheMap[sensorId][offset] !=
@@ -206,7 +204,7 @@
auto pdrRecord = sensorPDRs.getFirstRecord(pdrEntry);
while (pdrRecord)
{
- pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
+ pdr = new (pdrEntry.data) pldm_state_sensor_pdr;
SensorId sensorId = LE16TOH(pdr->sensor_id);
if (sensorHandlers.contains(pdrType))
{
diff --git a/host-bmc/dbus_to_terminus_effecters.cpp b/host-bmc/dbus_to_terminus_effecters.cpp
index 54eb71f..5c2e0ee 100644
--- a/host-bmc/dbus_to_terminus_effecters.cpp
+++ b/host-bmc/dbus_to_terminus_effecters.cpp
@@ -484,7 +484,7 @@
size_t payload_length = PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES - 1 +
getEffecterDataSize(dataSize);
requestMsg.resize(sizeof(pldm_msg_hdr) + payload_length);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
switch (dataSize)
{
case PLDM_EFFECTER_DATA_SIZE_UINT8:
@@ -605,7 +605,7 @@
sizeof(pldm_msg_hdr) + sizeof(effecterId) + sizeof(compEffCnt) +
sizeof(set_effecter_state_field) * compEffCnt,
0);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_set_state_effecter_states_req(
instanceId, effecterId, compEffCnt, stateField.data(), request);
diff --git a/host-bmc/host_pdr_handler.cpp b/host-bmc/host_pdr_handler.cpp
index 8da01a7..052e7e2 100644
--- a/host-bmc/host_pdr_handler.cpp
+++ b/host-bmc/host_pdr_handler.cpp
@@ -172,7 +172,7 @@
std::vector<uint8_t> requestMsg(
sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
uint32_t recordHandle{};
if (!nextRecordHandle && (!modifiedPDRRecordHandles.empty()) &&
isHostPdrModified)
@@ -234,8 +234,8 @@
size_t numEntities{};
pldm_entity* entities = nullptr;
bool merged = false;
- auto entityPdr = reinterpret_cast<pldm_pdr_entity_association*>(
- const_cast<uint8_t*>(pdr.data()) + sizeof(pldm_pdr_hdr));
+ auto entityPdr = new (const_cast<uint8_t*>(pdr.data()) +
+ sizeof(pldm_pdr_hdr)) pldm_pdr_entity_association;
if (oemPlatformHandler &&
oemPlatformHandler->checkRecordHandleInRange(record_handle))
@@ -372,9 +372,8 @@
changeEntries[0].size() * sizeof(uint32_t);
std::vector<uint8_t> eventDataVec{};
eventDataVec.resize(maxSize);
- auto eventData =
- reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
- eventDataVec.data());
+ auto eventData = new (eventDataVec.data())
+ pldm_pdr_repository_chg_event_data;
size_t actualSize{};
auto firstEntry = changeEntries[0].data();
auto rc = encode_pldm_pdr_repository_chg_event_data(
@@ -391,7 +390,7 @@
std::vector<uint8_t> requestMsg(
sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
actualSize);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
rc = encode_platform_event_message_req(
instanceId, 1, TERMINUS_ID, PLDM_PDR_REPOSITORY_CHG_EVENT,
eventDataVec.data(), actualSize, request,
@@ -531,7 +530,7 @@
rh = nextRecordHandle - 1;
}
- auto pdrHdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
+ auto pdrHdr = new (pdr.data()) pldm_pdr_hdr;
if (!rh)
{
rh = pdrHdr->record_handle;
@@ -717,7 +716,7 @@
auto instanceId = instanceIdDb.next(mctp_eid);
std::vector<uint8_t> requestMsg(
sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_get_version_req(instanceId, 0, PLDM_GET_FIRSTPART,
PLDM_BASE, request);
if (rc != PLDM_SUCCESS)
@@ -790,7 +789,7 @@
std::vector<uint8_t> requestMsg(
sizeof(pldm_msg_hdr) +
PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_get_state_sensor_readings_req(
instanceId, sensorId, sensorRearm, 0, request);
@@ -933,7 +932,7 @@
sizeof(pldm_msg_hdr) + PLDM_GET_FRU_RECORD_TABLE_METADATA_REQ_BYTES);
// GetFruRecordTableMetadata
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_get_fru_record_table_metadata_req(
instanceId, request, requestMsg.size() - sizeof(pldm_msg_hdr));
if (rc != PLDM_SUCCESS)
@@ -1011,7 +1010,7 @@
sizeof(pldm_msg_hdr) + PLDM_GET_FRU_RECORD_TABLE_REQ_BYTES);
// send the getFruRecordTable command
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_get_fru_record_table_req(
instanceId, 0, PLDM_GET_FIRSTPART, request,
requestMsg.size() - sizeof(pldm_msg_hdr));