From d5b41bb8a088c6387ab3ae3be423a11d32748430 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 13 Sep 2024 13:09:51 +0200 Subject: [PATCH] [warnings] fix casts * Add macro WINPR_REINTERPRET_CAST to cast (checked) from type A to B * Fix cast warnings --- channels/rdpear/common/ndr.c | 4 ++-- libfreerdp/codec/progressive.c | 10 ++++++---- libfreerdp/core/license.c | 5 +++-- winpr/include/winpr/winpr.h | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/channels/rdpear/common/ndr.c b/channels/rdpear/common/ndr.c index 9c1b63683..f2d39db6d 100644 --- a/channels/rdpear/common/ndr.c +++ b/channels/rdpear/common/ndr.c @@ -730,7 +730,7 @@ BOOL ndr_struct_write_fromDescr(NdrContext* context, wStream* s, const NdrStruct { ndr_refid ptrId = NDR_PTR_NULL; BOOL isNew = 0; - ptr = *(const void**)ptr; + ptr = *(WINPR_CAST_CONST_PTR_AWAY(ptr, const void**)); if (!ptr && field->pointerType == NDR_POINTER_NON_NULL) { @@ -797,7 +797,7 @@ void ndr_struct_dump_fromDescr(wLog* logger, UINT32 lvl, size_t identLevel, { case NDR_POINTER: case NDR_POINTER_NON_NULL: - ptr = *(const void**)ptr; + ptr = *(WINPR_CAST_CONST_PTR_AWAY(ptr, const void**)); break; case NDR_NOT_POINTER: break; diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index 35a2758c2..275f87ca0 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -1050,8 +1050,9 @@ progressive_decompress_tile_first(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progressiv if (rc < 0) goto fail; - rc = prims->yCbCrToRGB_16s8u_P3AC4R((const INT16**)pSrcDst, 64 * 2, tile->data, tile->stride, - progressive->format, &roi_64x64); + const INT16** ptr = WINPR_REINTERPRET_CAST(pSrcDst, INT16**, const INT16**); + rc = prims->yCbCrToRGB_16s8u_P3AC4R(ptr, 64 * 2, tile->data, tile->stride, progressive->format, + &roi_64x64); fail: BufferPool_Return(progressive->bufferPool, pBuffer); return rc; @@ -1494,8 +1495,9 @@ progressive_decompress_tile_upgrade(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progress if (status < 0) goto fail; - status = prims->yCbCrToRGB_16s8u_P3AC4R((const INT16**)pSrcDst, 64 * 2, tile->data, - tile->stride, progressive->format, &roi_64x64); + const INT16** ptr = WINPR_REINTERPRET_CAST(pSrcDst, INT16**, const INT16**); + status = prims->yCbCrToRGB_16s8u_P3AC4R(ptr, 64 * 2, tile->data, tile->stride, + progressive->format, &roi_64x64); fail: BufferPool_Return(progressive->bufferPool, pBuffer); return status; diff --git a/libfreerdp/core/license.c b/libfreerdp/core/license.c index 6b2790430..223c2648d 100644 --- a/libfreerdp/core/license.c +++ b/libfreerdp/core/license.c @@ -2850,8 +2850,9 @@ BOOL license_server_configure(rdpLicense* license) freerdp_settings_get_uint32(settings, FreeRDP_ServerLicenseProductVersion); const UINT32 issuerCount = freerdp_settings_get_uint32(settings, FreeRDP_ServerLicenseProductIssuersCount); - const char** issuers = - (const char**)freerdp_settings_get_pointer(settings, FreeRDP_ServerLicenseProductIssuers); + + const void* ptr = freerdp_settings_get_pointer(settings, FreeRDP_ServerLicenseProductIssuers); + const char** issuers = WINPR_REINTERPRET_CAST(ptr, const void*, const char**); WINPR_ASSERT(CompanyName); WINPR_ASSERT(ProductName); diff --git a/winpr/include/winpr/winpr.h b/winpr/include/winpr/winpr.h index 2761dd9e6..125bb5ebb 100644 --- a/winpr/include/winpr/winpr.h +++ b/winpr/include/winpr/winpr.h @@ -138,6 +138,24 @@ WINPR_API const char* winpr_get_build_config(void); #define WINPR_UNUSED(x) (void)(x) #if defined(__GNUC__) || defined(__clang__) +/** + * @brief A macro to do dirty casts. Do not use without a good justification! + * @param ptr The pointer to cast + * @param dstType The data type to cast to + * @return The casted pointer + * @since version 3.9.0 + */ +#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) \ + ({ \ + union \ + { \ + srcType src; \ + dstType dst; \ + } cnv; \ + cnv.src = ptr; \ + cnv.dst; \ + }) + /** * @brief A macro to do dirty casts. Do not use without a good justification! * @param ptr The pointer to cast @@ -174,6 +192,7 @@ WINPR_API const char* winpr_get_build_config(void); cnv.dst; \ }) #else +#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) (dstType) ptr #define WINPR_CAST_CONST_PTR_AWAY(ptr, dstType) (dstType) ptr #define WINPR_FUNC_PTR_CAST(ptr, dstType) (dstType)(uintptr_t) ptr #endif