Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch Newsgroups: comp.lang.c Subject: Re: So You Think You Can Const? Date: Wed, 08 Jan 2025 12:43:52 -0800 Organization: A noiseless patient Spider Lines: 64 Message-ID: <867c75829j.fsf@linuxsc.com> References: <20250107130809.661@kylheku.com> <87a5c15ob0.fsf@bsb.me.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Wed, 08 Jan 2025 21:43:52 +0100 (CET) Injection-Info: dont-email.me; posting-host="6e19b66cb0c542b6b8c649f7413a0cd9"; logging-data="3071468"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX197eHqzNzd83sMTpwh2igVf7m0GbhlCgfQ=" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:FJGK2VI4cLLPDDy7FhurdNJV0GM= sha1:uOns+nwGaX9Ey1pypIT2iDB4Z3M= Bytes: 3367 Ben Bacarisse writes: > Julio Di Egidio writes: > >> On 07/01/2025 23:11, Kaz Kylheku wrote: >> >>> On 2025-01-07, Julio Di Egidio wrote: >> >> >> >>>> In particular, I am using C90, and compiling with >>>> `gcc ... -ansi -pedantic -Wall -Wextra` (as I have >>>> the requirement to ideally support any device). >>>> >>>> To the question, I was reading this, but I am not >>>> sure what the quoted passage means: >>>> >>>> Matt Stancliff, "So You Think You Can Const?", >>>> >>>> << Your compiler, at its discretion, may also choose >>>> to place any const declarations in read-only storage, >>>> so if you attempt to hack around the const blocks, >>>> you could get undefined behavior. >> >>> >>> An object defined with a type that is const-qualified >>> could be put into write-protected storage. >> >> What do you/we mean by "object" in this context? (Sorry, I do have >> forgotten, the glossary to begin with.) > > An object (in C) is a contiguous region of storage, the contents of > which can represent values. > >> Overall, I am surmising this and only this might go write-protected: >> >> MyStruct_t const T = {...}; > > Yes, though you should extend your concern beyond what might be > write-protected. Modifying an object whose type is const qualified > is undefined, even if the object is in writable storage. A compiler > may assume that such an object has not changed because in a program > that has undefined behaviour, all bets are off. [...] We need to be careful about what is being asserted here. There are cases where a compiler may not assume that a const object has not changed, despite the rule that assigning to a const object is undefined behavior: #include typedef union { const int foo; int bas; } Foobas; int main(){ Foobas fb = { 0 }; printf( " fb.foo is %d\n", fb.foo ); fb.bas = 7; printf( " fb.foo is %d\n", fb.foo ); return 0; } The object fb.foo is indeed a const object, but an access of fb.foo must not assume that it retains its original value after the assignment to fb.bas.