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 <kchai@redhat.com>
This commit is contained in:
Kefu Chai 2020-09-11 12:53:28 +08:00
parent 3713645324
commit 3eed2d595e

View File

@ -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<std::uintptr_t>(&(((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<std::uintptr_t>(delete_this->_raw) +
offsetof(buffer::raw, bptr_storage));
BUF_OFFSETOF(buffer::raw, bptr_storage));
const bool is_hypercombined =
reinterpret_cast<std::uintptr_t>(delete_this) == bptr;
if (is_hypercombined) {