Path: csiph.com!3.us.feeder.erje.net!feeder.erje.net!news.linkpendium.com!news.linkpendium.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: David Brown Newsgroups: comp.compilers Subject: Re: Bounds checking, Optimization techniques and undefined behavior Date: Thu, 9 May 2019 09:19:23 +0200 Organization: A noiseless patient Spider Lines: 59 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <19-05-074@comp.compilers> References: <19-04-021@comp.compilers> <19-04-023@comp.compilers> <19-04-037@comp.compilers> <19-04-039@comp.compilers> <19-04-042@comp.compilers> <19-04-044@comp.compilers> <19-04-047@comp.compilers> <19-05-004@comp.compilers> <19-05-006@comp.compilers> <19-05-016@comp.compilers> <19-05-020@comp.compilers> <19-05-024@comp.compilers> <19-05-025@comp.compilers> <19-05-028@comp.compilers> <19-05-029@comp.compilers> <19-05-034@comp.compilers> <19-05-045@comp.compilers> <19-05-061@comp.compilers> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="63993"; mail-complaints-to="abuse@iecc.com" Keywords: standards, errors, comment Posted-Date: 09 May 2019 11:28:50 EDT X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Content-Language: en-GB Xref: csiph.com comp.compilers:2309 On 08/05/2019 10:03, David Brown wrote: > > [I'm looking at C11 and don't see where it says you can't cast away > const. What am I missing? I agree any approach here is ugly and we're > near the limits of what you can say in C. -John] > 6.7.3p6 : """ If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. """ Consider this code: int v = 10; const int c = 20; void change(const int * p, int n) { *(int*) p = n; } int foo(int a) { change(&v, a); // OK change(&c, a); // Usually compiles, but NOT OK return c; } You can cast away const (via pointers), but if the original declaration of the object was const, it is undefined behaviour. Compiling this with gcc x86 and optimisation (with ), you get this: change: mov DWORD PTR [rdi], esi ret foo: mov DWORD PTR v[rip], edi mov eax, 20 mov DWORD PTR c[rip], edi ret c: .long 20 v: .long 10 Although the call "change(&c, a)" attempts to modify "c" (which will likely cause a fault on many systems), the compiler assumes the value of "c" is still 20 for the return. [Oh, look at that. Tried it with clang, did the same thing returning a constant 20. -John]