Subject: Re: reading values as bytes without memcpu, from enum unsigned char?
Date: 2020-08-07 14:12:22
>>> Just to spell it out, this is fine:
>>> auto ptr = new AnyType(...);
>>> auto byte_ptr = reinterpret_cast<unsigned char*>(ptr);
>> *byte_ptr; doesn't access anything. lvalue-to-rvalue conversion is not applied to a discarded-value expression of non-volatile type.
>> But anyway, assuming we have access there, that code can haz UB. More specific example:
>> int i = UCHAR_MAX + 1;
>> auto uc = *reinterpret_cast<unsigned char*>(&i); // UB because of [expr.pre]/4
> I don't see how [expr]/4 applies here. You're accessing an `unsigned
> char` in a place where there is no `unsigned char` object. There's no
> expectation that this value won't be "mathematically defined" or
> otherwise "not in the range of representable values for its type". So
> it's not UB by [expr]/4.
See my analysis of a similar code https://lists.isocpp.org/sg12/2019/06/0802.php
> The issue is that the value is not well-specified by the standard.
The value is 100% specified by the standard. It is the value of `i`, which is `UCHAR_MAX + 1`.
STD-DISCUSSION list run by firstname.lastname@example.org
Older Archives on Google Groups