From 3eed2d595ee5d1577b272a238ab018b1addf77a5 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 11 Sep 2020 12:53:28 +0800 Subject: [PATCH] common/buffer: use homebrew BUF_OFFSETOF to replace offsetof() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit because buffer::raw is not a standard layout type. so `offsetof()` does not always work. let's use a homebrew macro to calculate the address of `bptr_storage`. this change silences the warning like: src/common/buffer.cc:2156:15: warning: ‘offsetof’ within non-standard-layout type ‘ceph::buffer::v15_2_0::raw’ is conditionally-supported [-Winvalid-offsetof] 2156 | offsetof(buffer::raw, bptr_storage)); Signed-off-by: Kefu Chai --- src/common/buffer.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index b71af2ec75e..f8b0a65d269 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -2147,13 +2147,17 @@ buffer::list buffer::list::static_from_string(string& s) { // const makes me generally sad. } +// buffer::raw is not a standard layout type. +#define BUF_OFFSETOF(type, field) \ + (reinterpret_cast(&(((type*)1024)->field)) - 1024u) + bool buffer::ptr_node::dispose_if_hypercombined( buffer::ptr_node* const delete_this) { // in case _raw is nullptr const std::uintptr_t bptr = (reinterpret_cast(delete_this->_raw) + - offsetof(buffer::raw, bptr_storage)); + BUF_OFFSETOF(buffer::raw, bptr_storage)); const bool is_hypercombined = reinterpret_cast(delete_this) == bptr; if (is_hypercombined) {