From 51ea4eb4951fa272a5e3e80938d6b93b705f1ca4 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 23 May 2022 13:20:04 +0200 Subject: [PATCH 1/2] mem,btrace: fix struct alignment --- include/re_btrace.h | 4 ++-- src/btrace/btrace.c | 10 +++++++--- src/mem/mem.c | 12 ++++++------ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/include/re_btrace.h b/include/re_btrace.h index 79d826229..6f45c64b4 100644 --- a/include/re_btrace.h +++ b/include/re_btrace.h @@ -6,7 +6,7 @@ struct btrace { void *stack[BTRACE_SZ]; - int len; + size_t len; }; int btrace_print(struct re_printf *pf, struct btrace *btrace); @@ -20,7 +20,7 @@ static inline int btrace(struct btrace *btrace) if (!btrace) return EINVAL; - btrace->len = (int)backtrace(btrace->stack, BTRACE_SZ); + btrace->len = backtrace(btrace->stack, BTRACE_SZ); return 0; } diff --git a/src/btrace/btrace.c b/src/btrace/btrace.c index 08fef88b3..0b6fcd920 100644 --- a/src/btrace/btrace.c +++ b/src/btrace/btrace.c @@ -26,26 +26,30 @@ static int print_debug(struct re_printf *pf, struct btrace *btrace, if (!btrace->len) return 0; +#if defined(FREEBSD) || defined(OPENBSD) symbols = backtrace_symbols(btrace->stack, btrace->len); +#else + symbols = backtrace_symbols(btrace->stack, (int)btrace->len); +#endif if (!symbols) return 0; switch (type) { case BTRACE_CSV: - for (int j = 0; j < btrace->len; j++) { + for (size_t j = 0; j < btrace->len; j++) { re_hprintf(pf, "%s%s", symbols[j], ((j + 1) < btrace->len) ? ", " : ""); } break; case BTRACE_NEWLINE: - for (int j = 0; j < btrace->len; j++) { + for (size_t j = 0; j < btrace->len; j++) { re_hprintf(pf, "%s \n", symbols[j]); } break; case BTRACE_JSON: re_hprintf(pf, "["); - for (int j = 0; j < btrace->len; j++) { + for (size_t j = 0; j < btrace->len; j++) { re_hprintf(pf, "\"%s\"%s", symbols[j], ((j + 1) < btrace->len) ? ", " : ""); } diff --git a/src/mem/mem.c b/src/mem/mem.c index 28a654a29..41bfa1929 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -27,12 +27,12 @@ /** Defines a reference-counting memory object */ struct mem { - uint32_t nrefs; /**< Number of references */ - mem_destroy_h *dh; /**< Destroy handler */ + size_t nrefs; /**< Number of references */ + mem_destroy_h *dh; /**< Destroy handler */ #if MEM_DEBUG - struct le le; /**< Linked list element */ - uint32_t magic; /**< Magic number */ + size_t magic; /**< Magic number */ size_t size; /**< Size of memory object */ + struct le le; /**< Linked list element */ struct btrace btraces; /**< Backtrace array */ #endif }; @@ -40,7 +40,7 @@ struct mem { #if MEM_DEBUG /* Memory debugging */ static struct list meml = LIST_INIT; -static const uint32_t mem_magic = 0xe7fb9ac4; +static const size_t mem_magic = 0xe7fb9ac4; static ssize_t threshold = -1; /**< Memory threshold, disabled by default */ static struct memstat memstat = { @@ -349,7 +349,7 @@ uint32_t mem_nrefs(const void *data) MAGIC_CHECK(m); - return m->nrefs; + return (uint32_t)m->nrefs; } From afe7525f5e0cd5a08db336d8a2430aa510663411 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 23 May 2022 14:10:42 +0200 Subject: [PATCH 2/2] cmake: add mem alignment check --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b40cdf9a6..2ffff71e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,8 @@ endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") add_compile_options(-Wshorten-64-to-32) + # Ensure struct mem is aligned (used as fat pointer) + set_source_files_properties(src/mem/mem.c PROPERTIES COMPILE_FLAGS -Wpadded) endif()