From 0f61853a3782aed3130c59c6617295e5b88fa880 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 11 May 2024 17:59:46 +0300 Subject: [PATCH 1/2] Fix false positive uselessAssignmentArg cppcheck warning (also at the same time some cstyleCast warnings) --- src/rose/rose_build_scatter.cpp | 40 +++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/rose/rose_build_scatter.cpp b/src/rose/rose_build_scatter.cpp index 87085ae9..a697f6db 100644 --- a/src/rose/rose_build_scatter.cpp +++ b/src/rose/rose_build_scatter.cpp @@ -111,21 +111,33 @@ void write_out(scatter_full_plan *plan_out, void *aux_out, const scatter_plan_raw &raw, u32 aux_base_offset) { memset(plan_out, 0, sizeof(*plan_out)); -#define DO_CASE(t) \ - if (!raw.p_##t.empty()) { \ - plan_out->s_##t##_offset = aux_base_offset; \ - plan_out->s_##t##_count = raw.p_##t.size(); \ - assert(ISALIGNED_N((char *)aux_out + aux_base_offset, \ - alignof(scatter_unit_##t))); \ - memcpy((char *)aux_out + aux_base_offset, raw.p_##t.data(), \ - byte_length(raw.p_##t)); \ - aux_base_offset += byte_length(raw.p_##t); \ + if (!raw.p_u64a.empty()) { + plan_out->s_u64a_offset = aux_base_offset; + plan_out->s_u64a_count = raw.p_u64a.size(); + assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u64a))); + memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u64a.data(), byte_length(raw.p_u32)); + aux_base_offset += byte_length(raw.p_u64a); + } + if (!raw.p_u32.empty()) { + plan_out->s_u32_offset = aux_base_offset; + plan_out->s_u32_count = raw.p_u32.size(); + assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u32))); + memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u32.data(), byte_length(raw.p_u32)); + aux_base_offset += byte_length(raw.p_u32); + } + if (!raw.p_u16.empty()) { + plan_out->s_u16_offset = aux_base_offset; + plan_out->s_u16_count = raw.p_u16.size(); + assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u16))); + memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u16.data(), byte_length(raw.p_u16)); + aux_base_offset += byte_length(raw.p_u16); + } + if (!raw.p_u8.empty()) { + plan_out->s_u8_offset = aux_base_offset; + plan_out->s_u8_count = raw.p_u8.size(); + assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u8))); + memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u8.data(), byte_length(raw.p_u8)); } - - DO_CASE(u64a); - DO_CASE(u32); - DO_CASE(u16); - DO_CASE(u8); } } // namespace ue2 From a2e66e31d2683153f5c82be0ac4dff8fe870738d Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Sat, 11 May 2024 18:47:00 +0300 Subject: [PATCH 2/2] replace memcpy with std::copy --- src/rose/rose_build_scatter.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/rose/rose_build_scatter.cpp b/src/rose/rose_build_scatter.cpp index a697f6db..f7a457b6 100644 --- a/src/rose/rose_build_scatter.cpp +++ b/src/rose/rose_build_scatter.cpp @@ -115,28 +115,36 @@ void write_out(scatter_full_plan *plan_out, void *aux_out, plan_out->s_u64a_offset = aux_base_offset; plan_out->s_u64a_count = raw.p_u64a.size(); assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u64a))); - memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u64a.data(), byte_length(raw.p_u32)); + auto *start = reinterpret_cast(raw.p_u64a.data()); + auto *to = static_cast(aux_out) + aux_base_offset; + std::copy(start, start + byte_length(raw.p_u64a), to); aux_base_offset += byte_length(raw.p_u64a); } if (!raw.p_u32.empty()) { plan_out->s_u32_offset = aux_base_offset; plan_out->s_u32_count = raw.p_u32.size(); assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u32))); - memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u32.data(), byte_length(raw.p_u32)); + auto *start = reinterpret_cast(raw.p_u32.data()); + auto *to = static_cast(aux_out) + aux_base_offset; + std::copy(start, start + byte_length(raw.p_u32), to); aux_base_offset += byte_length(raw.p_u32); } if (!raw.p_u16.empty()) { plan_out->s_u16_offset = aux_base_offset; plan_out->s_u16_count = raw.p_u16.size(); assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u16))); - memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u16.data(), byte_length(raw.p_u16)); + auto *start = reinterpret_cast(raw.p_u16.data()); + auto *to = static_cast(aux_out) + aux_base_offset; + std::copy(start, start + byte_length(raw.p_u16), to); aux_base_offset += byte_length(raw.p_u16); } if (!raw.p_u8.empty()) { plan_out->s_u8_offset = aux_base_offset; plan_out->s_u8_count = raw.p_u8.size(); assert(ISALIGNED_N(static_cast(aux_out) + aux_base_offset, alignof(scatter_unit_u8))); - memcpy(static_cast(aux_out) + aux_base_offset, raw.p_u8.data(), byte_length(raw.p_u8)); + auto *start = reinterpret_cast(raw.p_u8.data()); + auto *to = static_cast(aux_out) + aux_base_offset; + std::copy(start, start + byte_length(raw.p_u8), to); } }