Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this a libc++ bug?

Tags:

c++

libc++

The function std::char_traits::copy is implemented in libc++ like this:

template <class _CharT>
inline _LIBCPP_CONSTEXPR_AFTER_CXX17
_CharT*
char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
{
    if (!__libcpp_is_constant_evaluated()) {
        _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
    }
    char_type* __r = __s1;
    for (; __n; --__n, ++__s1, ++__s2)
        assign(*__s1, *__s2);
    return __r;
}

The condition in _LIBCPP_ASSERT seems backwards. Shouldn't it be

__s1 < __s2 || __s1 >= __s2+__n

What am I missing?

like image 991
n. 1.8e9-where's-my-share m. Avatar asked Sep 08 '26 12:09

n. 1.8e9-where's-my-share m.


1 Answers

It's not a bug, libc++ condition until C++23 is correct. std::char_traits::copy:

The behavior is undefined if copied character ranges overlap, i.e. src is in [dest, dest + count).

Bad: (src >= dest && src < dest + count)

Assert: !(src >= dest && src < dest + count) -> !(src >= dest) || !(src < dest + count) -> (src < dest) || (src >= dest + count) -> __s2 < __s1 || __s2 >= __s1 + __n.


The mathematical logic rule applied here: !(a && b) is !a || !b.

like image 140
273K Avatar answered Sep 10 '26 02:09

273K



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!