From: Sage Weil Date: Thu, 9 Mar 2017 18:09:29 +0000 (-0500) Subject: include/denc: remove nullptr runtime magic boundedness check X-Git-Tag: v12.0.2~313^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cdd0bf771a8d28a919061c0cfdf31ee78981fd9b;p=ceph.git include/denc: remove nullptr runtime magic boundedness check We were passing *(const T*)nullptr to bound_encode so that we would segv at runtime in a bound_encode implementation had anyd dependency on the value. However, this relies on undefined language behavior and fails on low optimization levels. So drop these checks and rely on the developer to implement a legal bound_encode() Signed-off-by: Sage Weil --- diff --git a/src/include/denc.h b/src/include/denc.h index d9350c530c7e..5b0dfa3c796f 100644 --- a/src/include/denc.h +++ b/src/include/denc.h @@ -679,8 +679,13 @@ namespace _denc { !traits::featured, void>::type bound_encode(const container& s, size_t& p) { size_t elem_size = 0; - denc(*(const T*)nullptr, elem_size); - p += sizeof(uint32_t) + elem_size * s.size(); + p += sizeof(uint32_t); + if (!s.empty()) { + // STL containers use weird element types like std::pair; + // cast to something we have denc_traits for. + denc(static_cast(*s.begin()), elem_size); + p += sizeof(uint32_t) + elem_size * s.size(); + } } template static typename std::enable_if::type bound_encode(const container& s, size_t& p, uint64_t f) { size_t elem_size = 0; - denc(*(const T*)nullptr, elem_size, f); - p += sizeof(uint32_t) + elem_size * s.size(); + p += sizeof(uint32_t); + if (!s.empty()) { + // STL containers use weird element types like std::pair; + // cast to something we have denc_traits for. + denc(static_cast(*s.begin()), elem_size, f); + p += elem_size * s.size(); + } } template @@ -902,7 +912,7 @@ public: !traits::featured, void>::type bound_encode(const container& s, size_t& p) { size_t elem_size = 0; - denc(*(const T*)nullptr, elem_size); + denc(*s.begin(), elem_size); p += elem_size * N; } template @@ -919,8 +929,11 @@ public: traits::featured>::type bound_encode(const container& s, size_t& p, uint64_t f) { size_t elem_size = 0; - denc(*(const T*)nullptr, elem_size, f); - p += sizeof(uint32_t) + elem_size * s.size(); + p += sizeof(uint32_t); + if (!s.empty()) { + denc(*s.begin(), elem_size, f); + p += elem_size * s.size(); + } } template @@ -1018,13 +1031,13 @@ private: template static void bound_encode_helper_nfb(const T& s, size_t& p, _denc::indices) { - denc(*(typename std::tuple_element::type *)nullptr, p); + denc(std::get(s), p); bound_encode_helper_nfb(s, p, _denc::indices{}); } template static void bound_encode_helper_nfb(const T& s, size_t& p, _denc::indices) { - denc(*(typename std::tuple_element::type *)nullptr, p); + denc(std::get(s), p); } template @@ -1042,13 +1055,13 @@ private: template static void bound_encode_helper_fb(const T& s, size_t& p, uint64_t f, _denc::indices) { - denc(*(typename std::tuple_element::type *)nullptr, p); + denc(std::get(s), p); bound_encode_helper_fb(s, p, f, _denc::indices{}); } template static void bound_encode_helper_fb(const T& s, size_t& p, uint64_t f, _denc::indices) { - denc(*(typename std::tuple_element::type *)nullptr, p, f); + denc(std::get(s), p); } template @@ -1159,14 +1172,14 @@ struct denc_traits< template static typename std::enable_if::type bound_encode(const boost::optional& v, size_t& p) { - denc(*(bool *)nullptr, p); + p += sizeof(bool); if (v) denc(*v, p); } template static typename std::enable_if::type bound_encode(const boost::optional& v, size_t& p, uint64_t f) { - denc(*(bool *)nullptr, p); + p += sizeof(bool); if (v) denc(*v, p); } @@ -1233,7 +1246,7 @@ struct denc_traits { static constexpr bool bounded = true; static void bound_encode(const boost::none_t& v, size_t& p) { - denc(*(bool *)nullptr, p); + p += sizeof(bool); } static void encode(const boost::none_t& v,