C++ Logo

std-proposals

Advanced search

Re: Allowing access to object representations

From: language.lawyer_at <language.lawyer_at_[hidden]>
Date: Tue, 20 Aug 2019 00:20:10 +0300
>> The creation of an object of type T would end the lifetime of the array
>> elements, so accessing them would be UB.
>>
>
> An array of unsigned char or std::byte can have an object of some other
> type nested within it, so the array's lifetime is not ended.

Right, but I wrote that the lifetimes of the array *elements* would end.
There is no "nested within" relation between the elements and an object which is placed over them.

>> This just shows that the access to object representations do not fit well
>> into the current model of the C++ abstract machine.
>>
>
> Indeed. On one hand, one could conclude that people who want to access
> object representations should just suck it up. On the other hand, one could
> observe that the current C++ memory and object model results in a lot of
> pre-C++17 code being broken, and conclude that it should be revised.
>
> Besides, even if you think that no one should ever try to access object
> representations of anything much more complicated than a struct with a
> bunch of ints in it, do you think it is reasonable to limit typical usage
> of offsetof to such types as well? If I have a pointer to a member of some
> class that is standard-layout but not implicit-lifetime, should there not
> be a way for me to get a pointer to the enclosing class using pointer
> arithmetic? Are you comfortable with letting all the existing code of this
> form, written before C++17, continue to be broken? What did we gain from
> the C++17 changes that was so beneficial that it justified *silently
> breaking* said code? What about the fact that the migration effort for such
> code can be significant (given, as I've pointed out, the inadequacies of
> the proposed std::bless solution)?

Isn't offsetof usually used in some low-level code which typically also breaks the strict aliasing rule?
There are compiler flags making the later behavior defined.
It is not forbidden for implementations to define behavior which the standard does not define.

>>>> I do not think that this is a good way.
>>>>
>>>
>>> What problem did this cause when it was effectively the status quo in
>>> C++14, that is so serious that we should not attempt to codify it in
>> C++23
>>> or some future version of the standard?
>>
>> I do not think calling bytes of memory "objects" is a good status quo.
>>
>
> Is that really your only objection? Presumably, it would be possible to
> word the changes to the standard in a way that would avoid this. The point
> is that existing code relies on being able to do pointer arithmetic on
> memory that various types of objects occupy *as though* an array of unsigned
> char objects existed there. We don't have to say that there are actual
> objects. Given the way pointers work in C++17, I think this would require a
> lot of wording, but I think I've already stated enough times how the
> alternative of doing nothing leaves a lot of code broken.

I don't know the solution for this problem :/

Received on 2019-08-19 16:22:15