From 44613f75e63cf67cee55ac5fe8dad8ad35151165 Mon Sep 17 00:00:00 2001 From: mitchell Date: Fri, 3 Jan 2020 19:38:10 -0500 Subject: Backport: Use safe mechanism for converting between function pointers and void*. Backport of changeset 7863:507307a6c315. --- qt/ScintillaEditBase/PlatQt.cpp | 16 ++++++++-------- win32/PlatWin.cxx | 13 ++++++------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/qt/ScintillaEditBase/PlatQt.cpp b/qt/ScintillaEditBase/PlatQt.cpp index b4ea7a7d0..281fdba3d 100644 --- a/qt/ScintillaEditBase/PlatQt.cpp +++ b/qt/ScintillaEditBase/PlatQt.cpp @@ -1110,17 +1110,17 @@ public: } Function FindFunction(const char *name) override { if (lib) { - // C++ standard doesn't like casts between function pointers and void pointers so use a union - union { + // Use memcpy as it doesn't invoke undefined or conditionally defined behaviour. #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - QFunctionPointer fp; + QFunctionPointer fp {}; #else - void *fp; + void *fp = nullptr; #endif - Function f; - } fnConv; - fnConv.fp = lib->resolve(name); - return fnConv.f; + fp = lib->resolve(name); + Function f = nullptr; + static_assert(sizeof(f) == sizeof(fp), "size mismatch"); + memcpy(&f, &fp, sizeof(f)); + return f; } return nullptr; } diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 6553b7486..296f7f0cc 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -2851,13 +2851,12 @@ public: // Use GetProcAddress to get a pointer to the relevant function. Function FindFunction(const char *name) noexcept override { if (h) { - // C++ standard doesn't like casts between function pointers and void pointers so use a union - union { - FARPROC fp; - Function f; - } fnConv; - fnConv.fp = ::GetProcAddress(h, name); - return fnConv.f; + // Use memcpy as it doesn't invoke undefined or conditionally defined behaviour. + FARPROC fp = ::GetProcAddress(h, name); + Function f = nullptr; + static_assert(sizeof(f) == sizeof(fp), "size mismatch"); + memcpy(&f, &fp, sizeof(f)); + return f; } else { return nullptr; } -- cgit v1.2.3