From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Subject: [PATCH 19/19] avoid -Warray-bounds warning, avoid stack overallocation
Date: Thu, 15 Dec 2022 20:52:55 +0000 [thread overview]
Message-ID: <20221215205255.27840-20-e@80x24.org> (raw)
In-Reply-To: <20221215205255.27840-1-e@80x24.org>
Compilers don't like seeing `sl.bt[-1]', so we give backtrace(3)
the same address by another means. We'll also save allocating
one pointer off the stack by capping the union padding.
---
mwrap_core.h | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/mwrap_core.h b/mwrap_core.h
index 1b3d98f..3fd67f1 100644
--- a/mwrap_core.h
+++ b/mwrap_core.h
@@ -134,6 +134,7 @@ static void *my_mempcpy(void *dest, const void *src, size_t n)
#define RETURN_ADDRESS(nr) \
__builtin_extract_return_addr(__builtin_return_address(nr))
+
#define SRC_LOC_BT(bt) union stk_bt bt; do { \
uint32_t depth = locating ? 1 : bt_req_depth; \
switch (depth) { \
@@ -142,7 +143,7 @@ static void *my_mempcpy(void *dest, const void *src, size_t n)
default: /* skip 1st level of BT since thats our function */ \
mwrap_assert(bt_req_depth <= MWRAP_BT_MAX); \
++locating; \
- long n = (long)backtrace(&bt.sl.bt[-1], bt_req_depth); \
+ long n = (long)backtrace(bt_dst(&bt), bt_req_depth); \
--locating; \
bt.sl.bt_len = n <= 1 ? 0 : (uint32_t)n - 1; \
if (n > 1) mwrap_assert(bt.sl.bt[0] == RETURN_ADDRESS(0)); \
@@ -209,9 +210,27 @@ union stk_sf {
union stk_bt {
struct src_loc sl;
- char buf_[sizeof(struct src_loc) + sizeof(void *) * MWRAP_BT_MAX];
+ /* we subtract one level from MWRAP_BT_MAX since we discard one
+ * level of backtrace(3) (see below for why) */
+ char buf_[sizeof(struct src_loc) + sizeof(void *) * (MWRAP_BT_MAX-1)];
};
+/*
+ * we discard the 1st-level of the backtrace(3) since it's our *alloc
+ * function (and therefore uninteresting), so we want backtrace(3) to
+ * write to bt->sl.bt[-1] so that bt->sl.bt[0] is the first interesting
+ * thing.
+ */
+#ifdef static_assert
+static_assert(offsetof(struct src_loc, lineno) + sizeof(void *) ==
+ offsetof(struct src_loc, bt),
+ "bt lineno is is bt[-1]");
+#endif
+static void **bt_dst(union stk_bt *bt)
+{
+ return (void **)&bt->sl.lineno;
+}
+
static struct alloc_hdr *ptr2hdr(void *p)
{
return (struct alloc_hdr *)((uintptr_t)p - sizeof(struct alloc_hdr));
prev parent reply other threads:[~2022-12-15 20:52 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-15 20:52 [PATCH 00/19] another round of httpd improvements Eric Wong
2022-12-15 20:52 ` [PATCH 01/19] mwrap_httpd: show current bytes consistently Eric Wong
2022-12-15 20:52 ` [PATCH 02/19] introduce AUTO_FREE macro to simplify cleanup Eric Wong
2022-12-15 20:52 ` [PATCH 03/19] httpd: rework httpd to use auto-free for memstream Eric Wong
2022-12-15 20:52 ` [PATCH 04/19] httpd: avoid newline if not using bt: >= 1 Eric Wong
2022-12-15 20:52 ` [PATCH 05/19] mwrap_httpd: flesh out /$PID/ and /$PID/trim endpoints Eric Wong
2022-12-15 20:52 ` [PATCH 06/19] mwrap_httpd: add info about src_file and src_loc stats Eric Wong
2022-12-15 20:52 ` [PATCH 07/19] use uatomic_inc where appropriate Eric Wong
2022-12-15 20:52 ` [PATCH 08/19] httpd: drop unnecessary AND ops from base-64 Eric Wong
2022-12-15 20:52 ` [PATCH 09/19] mymalloc: add notes on the malloc implementation Eric Wong
2022-12-15 20:52 ` [PATCH 10/19] rproxy: link to mwrap_httpd /$PID/ root without each, too Eric Wong
2022-12-15 20:52 ` [PATCH 11/19] httpd: shrink `mean_life' field to `double' Eric Wong
2022-12-15 20:52 ` [PATCH 12/19] httpd: support CSV output Eric Wong
2022-12-15 20:52 ` [PATCH 13/19] rproxy: enable deflater by default Eric Wong
2022-12-15 20:52 ` [PATCH 14/19] mwrap_httpd: do not abort on fork if out-of-resources Eric Wong
2022-12-15 20:52 ` [PATCH 15/19] httpd: pause forking thread on resource limitations Eric Wong
2022-12-15 20:52 ` [PATCH 16/19] rename mwrap_httpd.h to httpd.h Eric Wong
2022-12-15 20:52 ` [PATCH 17/19] httpd: describe simple and naive buffering scheme Eric Wong
2022-12-15 20:52 ` [PATCH 18/19] httpd: drop TODO item for pipelining Eric Wong
2022-12-15 20:52 ` Eric Wong [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221215205255.27840-20-e@80x24.org \
--to=e@80x24.org \
--cc=mwrap-perl@80x24.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mwrap-perl.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).