Skip to content

Commit

Permalink
Suppress a redundant hardening check in basic_string_view::substr (#9…
Browse files Browse the repository at this point in the history
…1804)

Fixes #91634.

This could alternatively be done with an _LIBCPP_ASSUME, after
#91801 lands, but would also
require #91619 be fixed
first. Given the dependencies, it seemed simplest to just make a private
ctor.
  • Loading branch information
davidben authored Jul 23, 2024
1 parent eb90ac5 commit 795a47f
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion libcxx/include/string_view
Original file line number Diff line number Diff line change
Expand Up @@ -448,8 +448,11 @@ public:
}

_LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI basic_string_view substr(size_type __pos = 0, size_type __n = npos) const {
// Use the `__assume_valid` form of the constructor to avoid an unnecessary check. Any substring of a view is a
// valid view. In particular, `size()` is known to be smaller than `numeric_limits<difference_type>::max()`, so the
// new size is also smaller. See also https://github.com/llvm/llvm-project/issues/91634.
return __pos > size() ? (__throw_out_of_range("string_view::substr"), basic_string_view())
: basic_string_view(data() + __pos, std::min(__n, size() - __pos));
: basic_string_view(__assume_valid(), data() + __pos, std::min(__n, size() - __pos));
}

_LIBCPP_CONSTEXPR_SINCE_CXX14 int compare(basic_string_view __sv) const _NOEXCEPT {
Expand Down Expand Up @@ -674,6 +677,16 @@ public:
#endif

private:
struct __assume_valid {};

// This is the same as the pointer and length constructor, but without the additional hardening checks. It is intended
// for use within the class, when the class invariants already guarantee the resulting object is valid. The compiler
// usually cannot eliminate the redundant checks because it does not know class invariants.
_LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI
basic_string_view(__assume_valid, const _CharT* __s, size_type __len) _NOEXCEPT
: __data_(__s),
__size_(__len) {}

const value_type* __data_;
size_type __size_;
};
Expand Down

0 comments on commit 795a47f

Please sign in to comment.