-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[libc++] {std, ranges}::equal
algorithms for vector<bool>::iterator
fail with small storage types
#126369
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
@llvm/issue-subscribers-bug Author: Peng Liu (winner245)
When using `std::equal` with `vector<bool>::iterator` in libc++, the function fails to compare vectors correctly for `vector<bool>` using storage types smaller than `int`, e.g., `unsigned char`, `unsigned short`, `uint8_t` and `uint16_t`. The issue arises when these small integral types are used as the underlying storage types for `vector<bool>`, where intermediate bitwise operations involving these small integral types are subject to integral promotions, leading to incorrect final equality comparison results.
Bug ReproductionI have prepared a carefully written demo that illustrates the incorrect equality comparisons of
For comparison purposes, the demo also provides the correct equality comparisons obtained from the standard general-form Key observations
This behavior is clearly a bug in libc++. It is crucial to address this issue to ensure correct functionality across all storage types for Related issues: #122528, #121713 |
… types (#130394) The current implementation of `{std, ranges}::equal` fails to correctly compare `vector<bool>`s when the underlying storage type is smaller than `int` (e.g., `unsigned char`, `unsigned short`, `uint8_t` and `uint16_t`). See [demo](https://godbolt.org/z/j4s87s6b3)). The problem arises due to integral promotions on the intermediate bitwise operations, leading to incorrect final equality comparison results. This patch fixes the issue by ensuring that `{std, ranges}::equal` operate properly for both aligned and unaligned bits. Fixes #126369.
Uh oh!
There was an error while loading. Please reload this page.
When using
std::equal
withvector<bool>::iterator
in libc++, the function fails to compare vectors correctly forvector<bool>
using storage types smaller thanint
, e.g.,unsigned char
,unsigned short
,uint8_t
anduint16_t
. The issue arises when these small integral types are used as the underlying storage types forvector<bool>
, where intermediate bitwise operations involving these small integral types are subject to integral promotions, leading to incorrect final equality comparison results.Bug Reproduction
I have prepared a carefully written demo that illustrates the incorrect equality comparisons of
std::equal
when comparing twovector<bool>
instances. With carefully chosen storage types, input sizes, and bit offsets for the two input vectors, we've captured incorrect comparisons in every possible code path:For comparison purposes, the demo also provides the correct equality comparisons obtained from the standard general-form
std::equal
which works with all generalinput_iterator
s. To ensure that the standardstd::equal
is invoked, I wrap the inputvector<bool>::iterator
s into standardinput_iterator
s before callingstd::equal
(iterator unwrapping currently doesn't work, which is another issue to be fixed). Furthermore, we also provide the comparison results obtained from other implementations like MSVC-STL or libstdc++.Key observations
While the
std::equal
optimization forvector<bool>::iterator
fails with small integral types in libc++, the problem does not appear in other implementations such as MSVC-STL or libstdc++, nor does it occur with the standardstd::equal
implementation in libc++.The same issue also carries over to the
std::ranges::equal
algorithm with the__bit_iterator
optimization in libc++, as the range version algorithm boils down to calling the non-range version.This behavior is clearly a bug in libc++. It is crucial to address this issue to ensure correct functionality across all storage types for
vector<bool>
.Related issues: #121713, #122410, #122528
The text was updated successfully, but these errors were encountered: