3972. Issues with join_with_view::iterator's iter_swap

Section: 25.7.15.3 [range.join.with.iterator] Status: New Submitter: Hewill Kang Opened: 2023-09-04 Last modified: 2023-11-03

Priority: 2

View other active issues in [range.join.with.iterator].

View all other issues in [range.join.with.iterator].

View all issues with New status.

Discussion:

The iter_swap customization for join_with_view::iterator allows swapping iterators with different element types, potentially leading to unsafe behavior, for example:

vector<vector<string>> x{{"a"}, {"b"}, {"c"}};
vector<string_view>    y{"-"};
auto r = x | views::join_with(y);
auto i = r.begin();
auto j = ranges::next(i);
ranges::iter_swap(j, i);
for (auto&& elem : r)
  cout << elem << " "; // AddressSanitizer: stack-use-after-return on address

The above swaps two iterators whose reference are string_view& and string& respectively, which ultimately results in string_view being referenced to a local variable and left dangling.

[2023-11-02; Reflector poll]

Set priority to 2 after reflector poll.

Proposed resolution: