summaryrefslogtreecommitdiff
path: root/third_party/base/span.h
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2018-04-11 21:18:38 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-11 21:18:38 +0000
commitc763970de6e749123af76170c16bbc3929058437 (patch)
tree6221c524b043f0f7986eeceac6a26fea6a843c4d /third_party/base/span.h
parent1e934f6868465bca960f9f13489489ba1d649581 (diff)
downloadpdfium-c763970de6e749123af76170c16bbc3929058437.tar.xz
Fix issues with PDFium third_party/base/span.h
Remove stray const in operator[] that was introduced when downgrading from C++14 to C++11 syntax. Add missing Get() in first() that was introduced when converting to UnownedPtr. Prevent ASAN from flagging spans where the UnownedPtr points to byte N+1 of a N byte object, and the span is empty. This is legal in C for ordinary pointers so long as the pointer isn't de-referenced, but is not allowed per the rules for UnownedPtr. Change-Id: Ic143c5ef4e37c1cf86f0a3e5408be6e2076a85e2 Reviewed-on: https://pdfium-review.googlesource.com/30212 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'third_party/base/span.h')
-rw-r--r--third_party/base/span.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/third_party/base/span.h b/third_party/base/span.h
index 034c6a35e7..0fb627ba8c 100644
--- a/third_party/base/span.h
+++ b/third_party/base/span.h
@@ -195,6 +195,7 @@ class span {
// [span.cons], span constructors, copy, assignment, and destructor
constexpr span() noexcept : data_(nullptr), size_(0) {}
constexpr span(T* data, size_t size) noexcept : data_(data), size_(size) {}
+
// TODO(dcheng): Implement construction from a |begin| and |end| pointer.
template <size_t N>
constexpr span(T (&array)[N]) noexcept : span(array, N) {}
@@ -215,12 +216,18 @@ class span {
template <typename U, typename = internal::EnableIfLegalSpanConversion<U, T>>
constexpr span(const span<U>& other) : span(other.data(), other.size()) {}
span& operator=(const span& other) noexcept = default;
- ~span() noexcept = default;
+ ~span() noexcept {
+ if (!size_) {
+ // Empty spans might point to byte N+1 of a N-byte object, legal for
+ // C pointers but not UnownedPtrs.
+ data_.ReleaseBadPointer();
+ }
+ }
// [span.sub], span subviews
const span first(size_t count) const {
CHECK(count <= size_);
- return span(data_, count);
+ return span(data_.Get(), count);
}
const span last(size_t count) const {
@@ -240,7 +247,7 @@ class span {
constexpr bool empty() const noexcept { return size_ == 0; }
// [span.elem], span element access
- const T& operator[](size_t index) const noexcept {
+ T& operator[](size_t index) const noexcept {
CHECK(index < size_);
return data_.Get()[index];
}