From 1cac788521d8de382b0c976cfc8ea2ad1cd59f34 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Thu, 22 Nov 2018 14:34:03 +0300 Subject: [PATCH] Workaround 'nonlocal var will use ptr to local var' cppcheck false positive * extra/msvc_dbg.c (sym_namebuf_u): New union type. * extra/msvc_dbg.c (GetSymbolNameFromAddress): Use sym_namebuf_u instead of anonymous union. * os_dep.c [MPROTECT_VDB && DARWIN] (mp_reply_s, mp_msg_s): Move struct type definition out of GC_mprotect_thread (adding mp_ prefix). --- extra/msvc_dbg.c | 11 +++++++---- os_dep.c | 22 +++++++++++++--------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/extra/msvc_dbg.c b/extra/msvc_dbg.c index 22865d5..7f6409d 100644 --- a/extra/msvc_dbg.c +++ b/extra/msvc_dbg.c @@ -212,6 +212,11 @@ size_t GetModuleNameFromStack(size_t skip, char* moduleName, size_t size) return 0; } +union sym_namebuf_u { + IMAGEHLP_SYMBOL sym; + char symNameBuffer[sizeof(IMAGEHLP_SYMBOL) + MAX_SYM_NAME]; +}; + size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size, size_t* offsetBytes) { @@ -219,10 +224,8 @@ size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size, if (offsetBytes) *offsetBytes = 0; __try { ULONG_ADDR dwOffset = 0; - union { - IMAGEHLP_SYMBOL sym; - char symNameBuffer[sizeof(IMAGEHLP_SYMBOL) + MAX_SYM_NAME]; - } u; + union sym_namebuf_u u; + u.sym.SizeOfStruct = sizeof(u.sym); u.sym.MaxNameLength = sizeof(u.symNameBuffer) - sizeof(u.sym); diff --git a/os_dep.c b/os_dep.c index 026aaf6..85fa315 100644 --- a/os_dep.c +++ b/os_dep.c @@ -4022,21 +4022,25 @@ typedef enum { # define GC_mprotect_state GC_MP_NORMAL #endif /* !THREADS */ +struct mp_reply_s { + mach_msg_header_t head; + char data[256]; +}; + +struct mp_msg_s { + mach_msg_header_t head; + mach_msg_body_t msgh_body; + char data[1024]; +}; + STATIC void *GC_mprotect_thread(void *arg) { mach_msg_return_t r; /* These two structures contain some private kernel data. We don't */ /* need to access any of it so we don't bother defining a proper */ /* struct. The correct definitions are in the xnu source code. */ - struct reply_s { - mach_msg_header_t head; - char data[256]; - } reply; - struct msg_s { - mach_msg_header_t head; - mach_msg_body_t msgh_body; - char data[1024]; - } msg; + struct mp_reply_s reply; + struct mp_msg_s msg; mach_msg_id_t id; if ((word)arg == GC_WORD_MAX) return 0; /* to prevent a compiler warning */ -- 2.7.4