fw-update : 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: Id5d75d41a83fbbae109506a8059e756596ba1cbc
Signed-off-by: Pavithra Barithaya <pavithrabarithaya07@gmail.com>
diff --git a/fw-update/device_updater.cpp b/fw-update/device_updater.cpp
index 91217d6..644883e 100644
--- a/fw-update/device_updater.cpp
+++ b/fw-update/device_updater.cpp
@@ -38,7 +38,7 @@
Request request(
sizeof(pldm_msg_hdr) + sizeof(struct pldm_request_update_req) +
compImgSetVerStrInfo.length);
- auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+ auto requestMsg = new (request.data()) pldm_msg;
auto rc = encode_request_update_req(
instanceId, maxTransferSize, applicableComponents.size(),
@@ -168,7 +168,7 @@
Request request(
sizeof(pldm_msg_hdr) + sizeof(struct pldm_pass_component_table_req) +
compVerStrInfo.length);
- auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+ auto requestMsg = new (request.data()) pldm_msg;
auto rc = encode_pass_component_table_req(
instanceId, transferFlag, compClassification, compIdentifier,
compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
@@ -296,7 +296,7 @@
Request request(
sizeof(pldm_msg_hdr) + sizeof(struct pldm_update_component_req) +
compVerStrInfo.length);
- auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+ auto requestMsg = new (request.data()) pldm_msg;
auto rc = encode_update_component_req(
instanceId, compClassification, compIdentifier, compClassificationIndex,
@@ -372,7 +372,7 @@
uint32_t offset = 0;
uint32_t length = 0;
Response response(sizeof(pldm_msg_hdr) + sizeof(completionCode), 0);
- auto responseMsg = reinterpret_cast<pldm_msg*>(response.data());
+ auto responseMsg = new (response.data()) pldm_msg;
auto rc = decode_request_firmware_data_req(request, payloadLength, &offset,
&length);
if (rc)
@@ -434,7 +434,7 @@
}
response.resize(sizeof(pldm_msg_hdr) + sizeof(completionCode) + length);
- responseMsg = reinterpret_cast<pldm_msg*>(response.data());
+ responseMsg = new (response.data()) pldm_msg;
package.seekg(compOffset + offset);
package.read(
reinterpret_cast<char*>(
@@ -459,7 +459,7 @@
{
uint8_t completionCode = PLDM_SUCCESS;
Response response(sizeof(pldm_msg_hdr) + sizeof(completionCode), 0);
- auto responseMsg = reinterpret_cast<pldm_msg*>(response.data());
+ auto responseMsg = new (response.data()) pldm_msg;
uint8_t transferResult = 0;
auto rc =
@@ -518,7 +518,7 @@
{
uint8_t completionCode = PLDM_SUCCESS;
Response response(sizeof(pldm_msg_hdr) + sizeof(completionCode), 0);
- auto responseMsg = reinterpret_cast<pldm_msg*>(response.data());
+ auto responseMsg = new (response.data()) pldm_msg;
uint8_t verifyResult = 0;
auto rc = decode_verify_complete_req(request, payloadLength, &verifyResult);
@@ -576,7 +576,7 @@
{
uint8_t completionCode = PLDM_SUCCESS;
Response response(sizeof(pldm_msg_hdr) + sizeof(completionCode), 0);
- auto responseMsg = reinterpret_cast<pldm_msg*>(response.data());
+ auto responseMsg = new (response.data()) pldm_msg;
uint8_t applyResult = 0;
bitfield16_t compActivationModification{};
@@ -654,7 +654,7 @@
auto instanceId = updateManager->instanceIdDb.next(eid);
Request request(
sizeof(pldm_msg_hdr) + sizeof(struct pldm_activate_firmware_req));
- auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+ auto requestMsg = new (request.data()) pldm_msg;
auto rc = encode_activate_firmware_req(
instanceId, PLDM_NOT_ACTIVATE_SELF_CONTAINED_COMPONENTS, requestMsg,
diff --git a/fw-update/inventory_manager.cpp b/fw-update/inventory_manager.cpp
index 021c4ec..98d56d1 100644
--- a/fw-update/inventory_manager.cpp
+++ b/fw-update/inventory_manager.cpp
@@ -542,7 +542,7 @@
auto instanceId = instanceIdDb.next(eid);
Request requestMsg(
sizeof(pldm_msg_hdr) + PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES);
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ auto request = new (requestMsg.data()) pldm_msg;
auto rc = encode_get_firmware_parameters_req(
instanceId, PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES, request);
if (rc)
diff --git a/fw-update/update_manager.cpp b/fw-update/update_manager.cpp
index 2567996..66539d5 100644
--- a/fw-update/update_manager.cpp
+++ b/fw-update/update_manager.cpp
@@ -239,7 +239,7 @@
}
else
{
- auto ptr = reinterpret_cast<pldm_msg*>(response.data());
+ auto ptr = new (response.data()) pldm_msg;
auto rc = encode_cc_only_resp(
request->hdr.instance_id, request->hdr.type,
request->hdr.command, PLDM_ERROR_INVALID_DATA, ptr);
@@ -248,7 +248,7 @@
}
else
{
- auto ptr = reinterpret_cast<pldm_msg*>(response.data());
+ auto ptr = new (response.data()) pldm_msg;
auto rc = encode_cc_only_resp(request->hdr.instance_id,
request->hdr.type, +request->hdr.command,
PLDM_FWUP_COMMAND_NOT_EXPECTED, ptr);