You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

hide_ptr.h 1.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2018 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #ifndef ABSL_BASE_INTERNAL_HIDE_PTR_H_
  15. #define ABSL_BASE_INTERNAL_HIDE_PTR_H_
  16. #include <cstdint>
  17. #include "absl/base/config.h"
  18. namespace absl
  19. {
  20. ABSL_NAMESPACE_BEGIN
  21. namespace base_internal
  22. {
  23. // Arbitrary value with high bits set. Xor'ing with it is unlikely
  24. // to map one valid pointer to another valid pointer.
  25. constexpr uintptr_t HideMask()
  26. {
  27. return (uintptr_t{0xF03A5F7BU} << (sizeof(uintptr_t) - 4) * 8) | 0xF03A5F7BU;
  28. }
  29. // Hide a pointer from the leak checker. For internal use only.
  30. // Differs from absl::IgnoreLeak(ptr) in that absl::IgnoreLeak(ptr) causes ptr
  31. // and all objects reachable from ptr to be ignored by the leak checker.
  32. template<class T>
  33. inline uintptr_t HidePtr(T* ptr)
  34. {
  35. return reinterpret_cast<uintptr_t>(ptr) ^ HideMask();
  36. }
  37. // Return a pointer that has been hidden from the leak checker.
  38. // For internal use only.
  39. template<class T>
  40. inline T* UnhidePtr(uintptr_t hidden)
  41. {
  42. return reinterpret_cast<T*>(hidden ^ HideMask());
  43. }
  44. } // namespace base_internal
  45. ABSL_NAMESPACE_END
  46. } // namespace absl
  47. #endif // ABSL_BASE_INTERNAL_HIDE_PTR_H_