Deutsch English Français Italiano |
<0f5ec645511128c21c90fb0688247e60@www.novabbs.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder9.news.weretis.net!news.nk.ca!rocksolid2!i2pn2.org!.POSTED!not-for-mail From: learningcpp1@gmail.com (m137) Newsgroups: comp.lang.c Subject: Re: Representation of =?UTF-8?B?X0Jvb2w=?= Date: Sun, 19 Jan 2025 02:30:02 +0000 Organization: novaBBS Message-ID: <0f5ec645511128c21c90fb0688247e60@www.novabbs.com> References: <87tums515a.fsf@nosuchdomain.example.com> <42fcea7270de500367eceea7ad5530fd@www.novabbs.com> <87ed116s5e.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Info: i2pn2.org; logging-data="66865"; mail-complaints-to="usenet@i2pn2.org"; posting-account="h4I3C/TQeMNW2qYH6OSH32NZuxQQNBy/f089TkslY9o"; User-Agent: Rocksolid Light X-Spam-Checker-Version: SpamAssassin 4.0.0 X-Rslight-Posting-User: b7c53bbe3b6333072e2ddc8ab3b4f124948b1834 X-Rslight-Site: $2y$10$eAl41QeToKFn0DKwwruz0.2EFG4BSbcBmaLNVMENi0KKfkvk6NnGe Bytes: 7260 Lines: 119 On Fri, 17 Jan 2025 21:34:53 +0000, Keith Thompson wrote: > The message being referred to is one I posted Sun 2021-05-23, with > Message-ID <87tums515a.fsf@nosuchdomain.example.com>. It's visible on > Google Groups at > <https://groups.google.com/g/comp.lang.c/c/4FUlV_XkmXg/m/OG8WeUCfAwAJ>. > > As others have suggested, please include attribution information when > posting a followup. You don't need to quote the entire message, > but provide at least some context, particularly when the parent > message is old. > Hi Keith, Sorry for the confusion, I am new to the platform and had not realised that I needed to quote your post in my reply. >> >> The definition of non-value representation rules out object >> representations that represent a value of the object type from being >> non-value representations. So it seems to be stricter than the >> definition of trap representation, which does not seem to rule out such >> object representations from being trap representations. Is this >> interpretation correct? > > I don't believe so. As far as I can tell, a "non-value > representation" (C23 and later) is exactly the same thing as a "trap > representation" (C17 and earlier). The older term was probably > considered unclear, since it could imply that a trap is required. > In fact, reading an object with a trap/non-value representation > has undefined behavior, which can include yielding the value you > might have expected. > The reason I thought they were different was because the definition of trap representation uses the phrase "need not", i.e. a trap representation is an object representation that **need not** represent a value of the object type. I read this as saying that a trap representation could be an object representation that represents a value of the object type, **or** it could be one that does not. This seemed more permissive than the definition of non-value representation, which uses the phrase "does not", i.e. a non-value representation is an object representation that *does not* represent a value of the object type. I took that as meaning that object representations that do represent a value of the object type (such as those 254 representations of `_Bool`, assuming a width of 1) are excluded from being classed as non-value representations. But I understand now that that is not the case. > Editions of the C standard earlier than C23 were not entirely > clear about the representation of _Bool. Yes, confusingly, I could not find anything about the width of a `_Bool` in C99, and C11 and C17 only talk about it in a footnote all the way down in 6.7.2.1: - C11 final draft, footnote 122: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=131 - C17 final draft, footnote 124: https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf#page=100 > Typically in C17 and earlier, and always in C23, _Bool/bool will > have exactly 1 value bit and CHAR_BIT-1 padding bits. Padding bits > do not contribute to the value of an object (so 0 and 1 are the > only possible values), but non-zero padding bits *may or may not* > create trap/non-value representations. (A gratuitously exotic > implementation might use a representation other than 00000001 for > true, but 00000000 is guaranteed to be a representation for 0/false.) > > As far as I can tell, the standard is silent on whether a bool object > with non-zero padding bits is a trap/non-value representation or not. > > I wrote a test program to explore how bool is treated. It uses > memcpy to set the representation of a bool object and then prints > the value of that object. Source is at the bottom of this message. > > If bool has no non-value representations, then the values of the > CHAR_BIT-1 padding bits must be ignored when reading a bool object, > and the value of such an object is determined only by its single > value bit, 0 or 1. If it does have non-value representations, > then reading such an object has undefined behavior. > > With gcc 14.2.0, with "-std=c23", all-zeros is treated as false > when used in a condition and all other representations are treated > as true. Converting the value of a bool object to another integer > type yields the value of its full 8-bit representation. If a bool > object holds a representation other than 00000000 or 00000001, > it compares equal to both `true` and `false`. > > This implies that bool has 1 value bit and 7 padding bits (as > required by C23) and that it has 2 value representations and 254 > trap representations. The observed behavior for the non-value > representations is the result of undefined behavior. (gcc -std=c23 > sets __STDC_VERSION__ to 202000L, not 202311L. The documentation > acknowledges that support for C23 is experimental and incomplete.) > > With clang 19.1.4, with "-std=c23", the behavior is consistent > with bool having no non-value representations. The 7 padding bits > do not contribute to the value of a bool object. Any bool object > with 0 as the low-order bit is treated as false in a condition and > yields 0 when converted to another integer type,. Any bool object > with 1 as the low-order bit is treated as true, and yields 1 when > converted to another integer type. I presume the intent is for bool > to have 256 value representations and no non-value representations > (with the padding bits ignored as required), but it's also consistent > with bool having non-value representations and the observed behavior > being undefined. It's not possible to determine with a test program > whether the output is the result of undefined behavior or not. Compiling the last snippet in this article: https://www.trust-in-soft.com/resources/blogs/2016-06-16-trap-representations-and-padding-bits, with Clang 19.1.0 and options "-std=c23 -O3 -pedantic" seems to show that Clang does treat `_Bool` as having 2 value representations and 254 non-value representations (see here: https://gcc.godbolt.org/z/4jK9d69P8). Thank you so much for taking the time to provide such a thorough analysis. It really clears things up for me. --