Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: Loops (was Re: do { quit; } else { }) Date: Tue, 13 May 2025 15:41:36 -0700 Organization: None to speak of Lines: 81 Message-ID: <875xi4cevz.fsf@nosuchdomain.example.com> References: <20250415153419.00004cf7@yahoo.com> <86h62078i8.fsf@linuxsc.com> <20250504180833.00000906@yahoo.com> <86plggzilx.fsf@linuxsc.com> <86ldr4yx0x.fsf@linuxsc.com> <1000cs3$2234m$1@dont-email.me> <87sel8nqid.fsf@nosuchdomain.example.com> <86msbgw49b.fsf@linuxsc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Wed, 14 May 2025 00:41:37 +0200 (CEST) Injection-Info: dont-email.me; posting-host="28f21fc31a5e376fbb703380c9354ddd"; logging-data="2189314"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18bQcwu6Rz/MdGWwnRZ+MY9" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:MswtjoJTQ5E7OtUxQctFBlTm4Ug= sha1:cyYFOe70KxCo5Zj1urqnolxJ+c0= Bytes: 4566 Tim Rentsch writes: > Keith Thompson writes: [...] >> My personal interpretation is that this: >> >> void func(int arr[static 5]) { >> } >> >> int main(void) { >> int arr[10]; >> func(arr+5); // OK >> // func(arr+6); // UB >> } >> >> is valid, because, for example, the last 5 elements of a 10-element >> array object can be treated as a 5-element array object. gcc seems >> to agree, based on the fact that it warns about func(arr+6) but >> not about func(arr+5). >> >> This is a fundamental part of my mental model of C, but in a few >> minutes of searching I wasn't able to find explicit wording in the >> standard that supports it. > > In N1570, 6.7.6.3 p7. Did you mean to imply that that paragraph supports (or refutes) my statement? I don't see how it does either. """ A declaration of a parameter as ‘‘array of _type_’’ shall be adjusted to ‘‘qualified pointer to _type_’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression. """ The question is whether, for example, the last 5 elements of a 10-element array object can be treated as a 5-element array object. If someone can cite wording in the standard that answers that question, I'd appreciate it. (I'll be happier if the answer is yes.) Looking into this a bit more, I realize that the question doesn't matter if there's no "static" keyword between the [ and ]. In that case, the parameter is of pointer type, and the description of pointer arithmetic (N1570 6.5.6p8) explicitly allows the pointer to point to the i-th element of an array object. The wording for [static N] is the only place I've seen (so far) that specifically refers to the *first* element of an array object, raising the question of whether a subobject of an array object is itself an array object. This might just be some slightly sloppy wording that was introduced in C99 and never corrected. For example, given this code: ``` void without_static(int arr[]) { (void)arr[4]; } void with_static(int arr[static 5]) { (void)arr[4]; } int main(void) { int arr[10] = { 0 }; without_static(arr+5); with_static(arr+5); } ``` there's no problem with the call `without_static(arr+5)`, but the call `with_static(arr+5)` has defined behavior if and only if the last 5 elements of a 10-element array object can be treated as a 5-element array object. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */