From e40943c945c1f0c9e14936ac605d06b891ac4bc1 Mon Sep 17 00:00:00 2001
From: wineway <wangyuweihx@gmail.com>
Date: Thu, 7 Dec 2023 04:07:58 +0800
Subject: [PATCH] UB: reinterpret_cast pointer without using launder

Signed-off-by: wineway <wangyuweihx@gmail.com>
---
 include/leveldb/env.h | 6 ++++++
 util/env_posix.cc     | 2 +-
 util/env_windows.cc   | 2 +-
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/include/leveldb/env.h b/include/leveldb/env.h
index e00895a..1ff3045 100644
--- a/include/leveldb/env.h
+++ b/include/leveldb/env.h
@@ -39,6 +39,12 @@
 #endif  // defined(DeleteFile)
 #endif  // defined(_WIN32)
 
+#ifdef __cpp_lib_launder
+#define LAUNDER(x) std::launder((x))
+#else
+#define LAUNDER(x) x
+#endif
+
 namespace leveldb {
 
 class FileLock;
diff --git a/util/env_posix.cc b/util/env_posix.cc
index ffd06c4..1003c69 100644
--- a/util/env_posix.cc
+++ b/util/env_posix.cc
@@ -883,7 +883,7 @@ class SingletonEnv {
   SingletonEnv(const SingletonEnv&) = delete;
   SingletonEnv& operator=(const SingletonEnv&) = delete;
 
-  Env* env() { return reinterpret_cast<Env*>(&env_storage_); }
+  Env* env() { return LAUNDER(reinterpret_cast<Env*>(&env_storage_)); }
 
   static void AssertEnvNotInitialized() {
 #if !defined(NDEBUG)
diff --git a/util/env_windows.cc b/util/env_windows.cc
index 1c74b02..937032c 100644
--- a/util/env_windows.cc
+++ b/util/env_windows.cc
@@ -778,7 +778,7 @@ class SingletonEnv {
   SingletonEnv(const SingletonEnv&) = delete;
   SingletonEnv& operator=(const SingletonEnv&) = delete;
 
-  Env* env() { return reinterpret_cast<Env*>(&env_storage_); }
+  Env* env() { return LAUNDER(reinterpret_cast<Env*>(&env_storage_)); }
 
   static void AssertEnvNotInitialized() {
 #if !defined(NDEBUG)