diff options
Diffstat (limited to 'absl/container/internal/inlined_vector.h')
-rw-r--r-- | absl/container/internal/inlined_vector.h | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h index 639bf145..cdfd868e 100644 --- a/absl/container/internal/inlined_vector.h +++ b/absl/container/internal/inlined_vector.h @@ -390,25 +390,20 @@ class Storage { return data_.allocated.allocated_data; } - Pointer<A> GetInlinedData() { - return reinterpret_cast<Pointer<A>>(data_.inlined.inlined_data); - } - - ConstPointer<A> GetInlinedData() const { - return reinterpret_cast<ConstPointer<A>>(data_.inlined.inlined_data); - } - - // Like GetInlinedData(), but for data that has not been constructed yet. The - // only difference is ABSL_ATTRIBUTE_NO_SANITIZE_CFI, which is necessary - // because the object is uninitialized. + // ABSL_ATTRIBUTE_NO_SANITIZE_CFI is used because the memory pointed to may be + // uninitialized, a common pattern in allocate()+construct() APIs. // https://clang.llvm.org/docs/ControlFlowIntegrity.html#bad-cast-checking // NOTE: When this was written, LLVM documentation did not explicitly // mention that casting `char*` and using `reinterpret_cast` qualifies // as a bad cast. - ABSL_ATTRIBUTE_NO_SANITIZE_CFI Pointer<A> GetInlinedDataUninitialized() { + ABSL_ATTRIBUTE_NO_SANITIZE_CFI Pointer<A> GetInlinedData() { return reinterpret_cast<Pointer<A>>(data_.inlined.inlined_data); } + ConstPointer<A> GetInlinedData() const { + return reinterpret_cast<ConstPointer<A>>(data_.inlined.inlined_data); + } + SizeType<A> GetAllocatedCapacity() const { return data_.allocated.allocated_capacity; } @@ -637,7 +632,7 @@ auto Storage<T, N, A>::Initialize(ValueAdapter values, SizeType<A> new_size) SetAllocation(allocation); SetIsAllocated(); } else { - construct_data = GetInlinedDataUninitialized(); + construct_data = GetInlinedData(); } ConstructElements<A>(GetAllocator(), construct_data, values, new_size); |