From bedeec4d57d29be7de91697277ace00ba87d3e75 Mon Sep 17 00:00:00 2001 From: Peter Marko Date: Tue, 1 Apr 2025 15:23:51 +0200 Subject: [PATCH] Fix reinterpret-cast compiler errors Building on 32-bit arm, following warning/error occurs: src/internal/windows.cpp: In function 'bit7z::OLECHAR* AllocStringBuffer(LPCSTR, uint32_t)': src/internal/windows.cpp:79:6: error: cast from 'unsigned char*' to 'bstr_prefix_t*' {aka 'unsigned int*'} increases required alignment of target type [-Werror=cast-align] 79 | *reinterpret_cast< bstr_prefix_t* >( bstrBuffer ) = byteLength; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ git/src/internal/windows.cpp:83:19: error: cast from 'unsigned char*' to 'bit7z::BSTR' {aka 'wchar_t*'} increases required alignment of target type [-Werror=cast-align] 83 | BSTR result = reinterpret_cast< BSTR >( bstrBuffer + sizeof( bstr_prefix_t ) ); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1plus: all warnings being treated as errors Fix it by using the desired variable size right away and thus avoid casting to an array with different alignment. Upstream-Status: Backport [https://github.com/rikyoz/bit7z/commit/b2789ea9b0fbb2a74dbf6764ddb72d60659a3bce] Signed-off-by: Peter Marko --- src/internal/windows.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/internal/windows.cpp b/src/internal/windows.cpp index 9304aed7..7bee5959 100644 --- a/src/internal/windows.cpp +++ b/src/internal/windows.cpp @@ -68,19 +68,18 @@ auto AllocStringBuffer( LPCSTR str, uint32_t byteLength ) -> BSTR { // Allocating memory for storing the BSTR as a byte array. // NOLINTNEXTLINE(cppcoreguidelines-no-malloc, cppcoreguidelines-owning-memory) - auto* bstrBuffer = static_cast< byte_t* >( std::calloc( bufferSize, sizeof( byte_t ) ) ); + auto* bstrBuffer = static_cast< bstr_prefix_t* >( std::calloc( bufferSize, sizeof( byte_t ) ) ); if ( bstrBuffer == nullptr ) { // Failed to allocate memory for the BSTR buffer. return nullptr; } // Storing the number of bytes of the BSTR as a prefix of it. - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - *reinterpret_cast< bstr_prefix_t* >( bstrBuffer ) = byteLength; + *bstrBuffer = byteLength; // The actual BSTR must point after the byteLength prefix. // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic, cppcoreguidelines-pro-type-reinterpret-cast) - BSTR result = reinterpret_cast< BSTR >( bstrBuffer + sizeof( bstr_prefix_t ) ); + BSTR result = reinterpret_cast< BSTR >( bstrBuffer + 1 ); if ( str != nullptr ) { // Copying byte-by-byte the input string to the BSTR. // Note: flawfinder warns about not checking for buffer overflows; this is a false alarm,