Path: csiph.com!weretis.net!feeder6.news.weretis.net!news.misty.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: Thomas Koenig Newsgroups: comp.compilers Subject: Re: what is defined, was for or against equality Date: Sat, 8 Jan 2022 09:31:06 -0000 (UTC) Organization: news.netcologne.de Lines: 69 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <22-01-032@comp.compilers> References: <17d70d74-1cf1-cc41-6b38-c0b307aeb35a@gkc.org.uk> <22-01-016@comp.compilers> <22-01-018@comp.compilers> <22-01-020@comp.compilers> <22-01-027@comp.compilers> Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="51668"; mail-complaints-to="abuse@iecc.com" Keywords: standards, optimize Posted-Date: 08 Jan 2022 13:11:52 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:2808 Spiros Bousbouras schrieb: > On Thu, 6 Jan 2022 16:43:05 -0000 (UTC) > Thomas Koenig wrote: >> David Brown schrieb: >> >> > There is no need to memorize undefined behaviours for a language - >> > indeed, such a thing is impossible since everything not defined by a >> > language standard is, by definition, undefined behaviour. (C and C++ >> > are not special here - the unusual thing is just that their standards >> > say this explicitly.) >> >> This is a rather C-centric view of things. The Fortran standard >> uses a different model. >> >> There are constraints, which are numbered. Any violation of such >> a constraint needs to be reported by the compiler ("processor", >> in Fortran parlance). If it fails to do so, this is a bug in >> the compiler. >> >> There are also phrases which have "shall" or "shall not". If this >> is violated, this is an error in the program. Catching such a >> violation is a good thing from quality of implementation standpoint, >> but is not required. Many run-time errors such as array overruns >> fall into this category. > > This seems to me exactly like the C model. What difference do you see ? First, I see a difference in result. Highly intelligent and knowledgable people argue vehemently if a program should be able to use undefined behavior or not, and lot of vitriol is directed against compiler writers who use the assumption that undefined behavior cannot happen in their compilers for optimization, especially if it turns out that existing code was broken and no longer works after a compiler upgrade (Just read a few of Linus Torvald's comments on that matter). I see C conflating two separate concepts: Programm errors and behavior that is outside the standard. "Undefined behavior is always a programming error" does not work; that would make #include #include int main() { char a[] = "Hello, world!\n"; write (1, a, strlen(a)); return 0; } not more and not less erroneous than int main() { int *p = 0; *p = 42; } whereas I would argue that there is an important difference between the two. If the C standard replaced "the behavior is undefined" with "the program is in error, and the subsequent behavior is undefined" or something along those lines, the discussion would be much muted. (Somebody may point out to me that this what the standard is actually saying. If so, that would sort of reinforce my argument that it should be clearer :-)