diff --git a/include/rocksdb/utilities/spatial_db.h b/include/rocksdb/utilities/spatial_db.h index 95bfe2f80..979968cb6 100644 --- a/include/rocksdb/utilities/spatial_db.h +++ b/include/rocksdb/utilities/spatial_db.h @@ -57,13 +57,13 @@ struct Variant { new (&data_.s) std::string(s); } - Variant::Variant(const Variant& v) : type_(v.type_) { + Variant(const Variant& v) : type_(v.type_) { Init(v, data_); } Variant& operator=(const Variant& v); - Variant::Variant(Variant&& rhs) : type_(kNull) { + Variant(Variant&& rhs) : type_(kNull) { *this = std::move(rhs); } @@ -77,7 +77,7 @@ struct Variant { bool get_bool() const { return data_.b; } uint64_t get_int() const { return data_.i; } double get_double() const { return data_.d; } - const std::string& get_string() const { return *reinterpret_cast(&data_.s); } + const std::string& get_string() const { return *GetStringPtr(data_); } bool operator==(const Variant& other) const; bool operator!=(const Variant& rhs) const { return !(*this == rhs); } @@ -95,12 +95,23 @@ struct Variant { char s[sizeof(std::string)]; } data_; + // Avoid type_punned aliasing problem + static std::string* GetStringPtr(Data& d) { + void* p = d.s; + return reinterpret_cast(p); + } + + static const std::string* GetStringPtr(const Data& d) { + const void* p = d.s; + return reinterpret_cast(p); + } + static void Init(const Variant&, Data&); static void Destroy(Type t, Data& d) { if (t == kString) { using std::string; - reinterpret_cast(&d.s)->~string(); + GetStringPtr(d)->~string(); } } }; diff --git a/util/hash_cuckoo_rep.cc b/util/hash_cuckoo_rep.cc index 0be731d89..55a4b80ba 100644 --- a/util/hash_cuckoo_rep.cc +++ b/util/hash_cuckoo_rep.cc @@ -50,6 +50,7 @@ struct CuckooStep { bucket_id_ = std::move(rhs.bucket_id_); prev_step_id_ = std::move(rhs.prev_step_id_); depth_ = std::move(rhs.depth_); + return *this; } CuckooStep(const CuckooStep&) = delete; diff --git a/util/options.cc b/util/options.cc index 7aa6af748..b4e488106 100644 --- a/util/options.cc +++ b/util/options.cc @@ -347,7 +347,7 @@ void DBOptions::Dump(Logger* log) const { stats_dump_period_sec); Warn(log, " Options.advise_random_on_open: %d", advise_random_on_open); - Warn(log, " Options.db_write_buffer_size: %"ROCKSDB_PRIszt"d", + Warn(log, " Options.db_write_buffer_size: %" ROCKSDB_PRIszt "d", db_write_buffer_size); Warn(log, " Options.access_hint_on_compaction_start: %s", access_hints[access_hint_on_compaction_start]); @@ -430,7 +430,7 @@ void ColumnFamilyOptions::Dump(Logger* log) const { max_bytes_for_level_multiplier); for (size_t i = 0; i < max_bytes_for_level_multiplier_additional.size(); i++) { - Warn(log, "Options.max_bytes_for_level_multiplier_addtl[%"ROCKSDB_PRIszt"]: %d", i, + Warn(log, "Options.max_bytes_for_level_multiplier_addtl[%" ROCKSDB_PRIszt "]: %d", i, max_bytes_for_level_multiplier_additional[i]); } Warn(log, " Options.max_sequential_skip_in_iterations: %" PRIu64, diff --git a/utilities/spatialdb/spatial_db.cc b/utilities/spatialdb/spatial_db.cc index 943f71537..4e642c544 100644 --- a/utilities/spatialdb/spatial_db.cc +++ b/utilities/spatialdb/spatial_db.cc @@ -79,7 +79,7 @@ void Variant::Init(const Variant& v, Data& d) { d.d = v.data_.d; break; case kString: - new (d.s) std::string(*reinterpret_cast(v.data_.s)); + new (d.s) std::string(*GetStringPtr(v.data_)); break; default: assert(false); @@ -107,7 +107,7 @@ Variant& Variant::operator=(Variant&& rhs) { Destroy(type_, data_); if (rhs.type_ == kString) { - new (data_.s) std::string(std::move(*reinterpret_cast(rhs.data_.s))); + new (data_.s) std::string(std::move(*GetStringPtr(rhs.data_))); } else { data_ = rhs.data_; } @@ -133,7 +133,7 @@ bool Variant::operator==(const Variant& rhs) const { case kDouble: return data_.d == rhs.data_.d; case kString: - return *reinterpret_cast(data_.s) == *reinterpret_cast(rhs.data_.s); + return *GetStringPtr(data_) == *GetStringPtr(rhs.data_); default: assert(false); }