Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::asio::buffer bug with string literal
From: Richard Hodges (hodges.r_at_[hidden])
Date: 2017-11-29 19:08:15


I take your point. But what I am alluding to is that people have used chars
for bytes since 1970.

I suspect that simply assuming that any char[N] is a string will break all
kinds of code.

I think it's better to leave things as they are and demand that if people
are dealing in zero-terminated strings, they explicitly state intent with a
string_view or similar.

I agree that it's slightly unsatisfactory state of affairs, but this is not
ASIO's problem to solve. The problem is with the initial decision by Mrs
Kernighan and Ritchie to mix the concerns of pointers to bytes and strings
in one type.

On 29 November 2017 at 12:59, Martijn Otto via Boost-users <
boost-users_at_[hidden]> wrote:

> I don't think std::string should be a problem in this case, if you want
> to construct a buffer from an std::string, you wouldn't be using this
> overload anyway, since it's a pointer to a char, not an array of
> characters.
>
> It would only be a problem for someone who has a proper array of chars
> that is not null-terminated. This is not exactly unimaginable, but it's
> certainly unlikely and nothing is preventing anyone from using unsigned
> char here.
>
> On wo, 2017-11-29 at 07:47 +0100, Richard Hodges via Boost-users wrote:
> >
> >
> > On 29 November 2017 at 02:58, Gavin Lambert via Boost-users <boost-us
> > ers_at_[hidden]> wrote:
> > > On 29/11/2017 01:57, Richard Hodges wrote:
> > > > It gives me the shivers. Binary data could easily have a zero in
> > > > the last byte.
> > > >
> > >
> > > In theory those should be distinguishable -- char is a distinct
> > > type from unsigned char (even if char is unsigned by default), and
> > > *hopefully* anyone poking binary data at the wire is doing so as an
> > > unsigned char or uint8_t.
> > In reality, in my world (e.g. protocol buffers), std::string is a
> > more useful type for binary data buffers that
> > std::vector<std::uint8_t>. I know it's a different type, but still,
> > it's chars modelling bytes. This is not an uncommon idea.
> >
> > The fact that you can't construct a std::vector from data without a
> > copy means that std::vector<byte> is less suitable for buffering data
> > than one might imagine.
> >
> > >
> > > In practice, there might be some trouble with people abusing
> > > std::string as if it were std::vector<uint8_t> by pointer casting.
> > >
> > >
> > > _______________________________________________
> > > Boost-users mailing list
> > > Boost-users_at_[hidden]
> > > https://lists.boost.org/mailman/listinfo.cgi/boost-users
> > >
> > _______________________________________________
> > Boost-users mailing list
> > Boost-users_at_[hidden]
> > https://lists.boost.org/mailman/listinfo.cgi/boost-users
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> https://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net