From: Kefu Chai Date: Fri, 11 Sep 2020 04:53:28 +0000 (+0800) Subject: common/buffer: use homebrew BUF_OFFSETOF to replace offsetof() X-Git-Tag: v16.1.0~1109^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F37097%2Fhead;p=ceph.git common/buffer: use homebrew BUF_OFFSETOF to replace offsetof() 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 --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index b71af2ec75e9e..f8b0a65d26900 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) {