diff options
-rw-r--r-- | include/leveldb/slice.h | 3 | ||||
-rw-r--r-- | util/env_posix.cc | 9 | ||||
-rw-r--r-- | util/env_windows.cc | 9 | ||||
-rw-r--r-- | util/hash.cc | 2 | ||||
-rw-r--r-- | util/no_destructor.h | 10 |
5 files changed, 20 insertions, 13 deletions
diff --git a/include/leveldb/slice.h b/include/leveldb/slice.h index e97223a..37cb821 100644 --- a/include/leveldb/slice.h +++ b/include/leveldb/slice.h @@ -51,9 +51,6 @@ class LEVELDB_EXPORT Slice { // Return true iff the length of the referenced data is zero bool empty() const { return size_ == 0; } - const char* begin() const { return data(); } - const char* end() const { return data() + size(); } - // Return the ith byte in the referenced data. // REQUIRES: n < size() char operator[](size_t n) const { diff --git a/util/env_posix.cc b/util/env_posix.cc index ffd06c4..57c19ec 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -874,7 +874,11 @@ class SingletonEnv { #endif // !defined(NDEBUG) static_assert(sizeof(env_storage_) >= sizeof(EnvType), "env_storage_ will not fit the Env"); - static_assert(alignof(decltype(env_storage_)) >= alignof(EnvType), + static_assert(std::is_standard_layout_v<SingletonEnv<EnvType>>); + static_assert( + offsetof(SingletonEnv<EnvType>, env_storage_) % alignof(EnvType) == 0, + "env_storage_ does not meet the Env's alignment needs"); + static_assert(alignof(SingletonEnv<EnvType>) % alignof(EnvType) == 0, "env_storage_ does not meet the Env's alignment needs"); new (&env_storage_) EnvType(); } @@ -892,8 +896,7 @@ class SingletonEnv { } private: - typename std::aligned_storage<sizeof(EnvType), alignof(EnvType)>::type - env_storage_; + alignas(EnvType) char env_storage_[sizeof(EnvType)]; #if !defined(NDEBUG) static std::atomic<bool> env_initialized_; #endif // !defined(NDEBUG) diff --git a/util/env_windows.cc b/util/env_windows.cc index 1c74b02..e0a19cc 100644 --- a/util/env_windows.cc +++ b/util/env_windows.cc @@ -769,7 +769,11 @@ class SingletonEnv { #endif // !defined(NDEBUG) static_assert(sizeof(env_storage_) >= sizeof(EnvType), "env_storage_ will not fit the Env"); - static_assert(alignof(decltype(env_storage_)) >= alignof(EnvType), + static_assert(std::is_standard_layout_v<SingletonEnv<EnvType>>); + static_assert( + offsetof(SingletonEnv<EnvType>, env_storage_) % alignof(EnvType) == 0, + "env_storage_ does not meet the Env's alignment needs"); + static_assert(alignof(SingletonEnv<EnvType>) % alignof(EnvType) == 0, "env_storage_ does not meet the Env's alignment needs"); new (&env_storage_) EnvType(); } @@ -787,8 +791,7 @@ class SingletonEnv { } private: - typename std::aligned_storage<sizeof(EnvType), alignof(EnvType)>::type - env_storage_; + alignas(EnvType) char env_storage_[sizeof(EnvType)]; #if !defined(NDEBUG) static std::atomic<bool> env_initialized_; #endif // !defined(NDEBUG) diff --git a/util/hash.cc b/util/hash.cc index fa252c7..8122fa8 100644 --- a/util/hash.cc +++ b/util/hash.cc @@ -27,7 +27,7 @@ uint32_t Hash(const char* data, size_t n, uint32_t seed) { uint32_t h = seed ^ (n * m); // Pick up four bytes at a time - while (limit - data >= 4) { + while (data + 4 <= limit) { uint32_t w = DecodeFixed32(data); data += 4; h += w; diff --git a/util/no_destructor.h b/util/no_destructor.h index a0d3b87..08ce6a4 100644 --- a/util/no_destructor.h +++ b/util/no_destructor.h @@ -5,6 +5,7 @@ #ifndef STORAGE_LEVELDB_UTIL_NO_DESTRUCTOR_H_ #define STORAGE_LEVELDB_UTIL_NO_DESTRUCTOR_H_ +#include <cstddef> #include <type_traits> #include <utility> @@ -20,8 +21,12 @@ class NoDestructor { explicit NoDestructor(ConstructorArgTypes&&... constructor_args) { static_assert(sizeof(instance_storage_) >= sizeof(InstanceType), "instance_storage_ is not large enough to hold the instance"); + static_assert(std::is_standard_layout_v<NoDestructor<InstanceType>>); static_assert( - alignof(decltype(instance_storage_)) >= alignof(InstanceType), + offsetof(NoDestructor, instance_storage_) % alignof(InstanceType) == 0, + "instance_storage_ does not meet the instance's alignment requirement"); + static_assert( + alignof(NoDestructor<InstanceType>) % alignof(InstanceType) == 0, "instance_storage_ does not meet the instance's alignment requirement"); new (&instance_storage_) InstanceType(std::forward<ConstructorArgTypes>(constructor_args)...); @@ -37,8 +42,7 @@ class NoDestructor { } private: - typename std::aligned_storage<sizeof(InstanceType), - alignof(InstanceType)>::type instance_storage_; + alignas(InstanceType) char instance_storage_[sizeof(InstanceType)]; }; } // namespace leveldb |