Index: util/numeric/checked_address_range.h |
diff --git a/util/mac/checked_mach_address_range.h b/util/numeric/checked_address_range.h |
similarity index 69% |
copy from util/mac/checked_mach_address_range.h |
copy to util/numeric/checked_address_range.h |
index 717bb8d915c52378debab671b114f394026a1cee..e9514bbdec6e256082a6ccdad822c75d33692148 100644 |
--- a/util/mac/checked_mach_address_range.h |
+++ b/util/numeric/checked_address_range.h |
@@ -1,4 +1,4 @@ |
-// Copyright 2014 The Crashpad Authors. All rights reserved. |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
// |
// Licensed under the Apache License, Version 2.0 (the "License"); |
// you may not use this file except in compliance with the License. |
@@ -12,38 +12,40 @@ |
// See the License for the specific language governing permissions and |
// limitations under the License. |
-#ifndef CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ |
-#define CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ |
+#ifndef CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ |
+#define CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ |
-#include <mach/mach.h> |
+#include <stdint.h> |
+#include "build/build_config.h" |
#include "util/numeric/checked_range.h" |
namespace crashpad { |
+namespace internal { |
//! \brief Ensures that a range, composed of a base and a size, does not |
//! overflow the pointer type of the process it describes a range in. |
//! |
-//! This class checks bases of type `mach_vm_address_t` and sizes of type |
-//! `mach_vm_address_t` against a process whose pointer type is either 32 or 64 |
-//! bits wide. |
+//! This class checks bases of type `ValueType` and sizes of type `SizeType` |
+//! against a process whose pointer type is either 32 or 64 bits wide. |
//! |
//! Aside from varying the overall range on the basis of a process’ pointer type |
//! width, this class functions very similarly to CheckedRange. |
-class CheckedMachAddressRange { |
+//! |
+//! \sa CheckedMachAddressRange |
+template <class ValueType, class SizeType> |
+class CheckedAddressRangeGeneric { |
public: |
//! \brief Initializes a default range. |
//! |
//! The default range has base 0, size 0, and appears to be from a 32-bit |
//! process. |
- CheckedMachAddressRange(); |
+ CheckedAddressRangeGeneric(); |
//! \brief Initializes a range. |
//! |
//! See SetRange(). |
- CheckedMachAddressRange(bool is_64_bit, |
- mach_vm_address_t base, |
- mach_vm_size_t size); |
+ CheckedAddressRangeGeneric(bool is_64_bit, ValueType base, SizeType size); |
//! \brief Sets a range’s fields. |
//! |
@@ -52,16 +54,16 @@ class CheckedMachAddressRange { |
//! process. |
//! \param[in] base The range’s base address. |
//! \param[in] size The range’s size. |
- void SetRange(bool is_64_bit, mach_vm_address_t base, mach_vm_size_t size); |
+ void SetRange(bool is_64_bit, ValueType base, SizeType size); |
//! \brief The range’s base address. |
- mach_vm_address_t Base() const; |
+ ValueType Base() const; |
//! \brief The range’s size. |
- mach_vm_size_t Size() const; |
+ SizeType Size() const; |
//! \brief The range’s end address (its base address plus its size). |
- mach_vm_address_t End() const; |
+ ValueType End() const; |
//! \brief Returns the validity of the address range. |
//! |
@@ -72,6 +74,9 @@ class CheckedMachAddressRange { |
//! be computed without overflowing its data type. |
bool IsValid() const; |
+ //! \brief Returns whether this range refers to a 64-bit process. |
+ bool Is64Bit() const { return is_64_bit_; } |
+ |
//! \brief Returns whether the address range contains another address. |
//! |
//! \param[in] value The (possibly) contained address. |
@@ -82,7 +87,7 @@ class CheckedMachAddressRange { |
//! its base address, and less than its end address (base address plus size). |
//! |
//! This method must only be called if IsValid() would return `true`. |
- bool ContainsValue(const mach_vm_address_t value) const; |
+ bool ContainsValue(const ValueType value) const; |
//! \brief Returns whether the address range contains another address range. |
//! |
@@ -96,19 +101,26 @@ class CheckedMachAddressRange { |
//! base, and the contained address range’s end is less than or equal to the |
//! containing address range’s end. |
//! |
- //! This method should only be called on two CheckedMachAddressRange objects |
- //! representing address ranges in the same process. |
+ //! This method should only be called on two CheckedAddressRangeGeneric |
+ //! objects representing address ranges in the same process. |
//! |
//! This method must only be called if IsValid() would return `true` for both |
- //! CheckedMachAddressRange objects involved. |
- bool ContainsRange(const CheckedMachAddressRange& that) const; |
+ //! CheckedAddressRangeGeneric objects involved. |
+ bool ContainsRange(const CheckedAddressRangeGeneric& that) const; |
private: |
+#if defined(COMPILER_MSVC) |
+ // MSVC cannot handle a union containing CheckedRange (with constructor, etc.) |
+ // currently. |
+ CheckedRange<uint32_t> range_32_; |
+ CheckedRange<uint64_t> range_64_; |
+#else |
// The field of the union that is expressed is determined by is_64_bit_. |
union { |
CheckedRange<uint32_t> range_32_; |
CheckedRange<uint64_t> range_64_; |
}; |
+#endif |
// Determines which field of the union is expressed. |
bool is_64_bit_; |
@@ -118,14 +130,15 @@ class CheckedMachAddressRange { |
// 64 bits wide and there is no possibility for range and size to overflow. |
// When is_64_bit_ is false, range_ok_ will be false if SetRange() was passed |
// a base or size that overflowed the underlying 32-bit data type. This field |
- // is necessary because the interface exposes mach_vm_address_t and |
- // mach_vm_size_t uniformly, but these types are too wide for the underlying |
- // pointer and size types in 32-bit processes. |
+ // is necessary because the interface exposes the address and size types |
+ // uniformly, but these types are too wide for the underlying pointer and size |
+ // types in 32-bit processes. |
bool range_ok_; |
- DISALLOW_COPY_AND_ASSIGN(CheckedMachAddressRange); |
+ DISALLOW_COPY_AND_ASSIGN(CheckedAddressRangeGeneric); |
}; |
+} // namespace internal |
} // namespace crashpad |
-#endif // CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ |
+#endif // CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ |