Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Stefan Reuther Newsgroups: de.alt.folklore.computer Subject: Re: Epische Computer-Fails Date: Mon, 23 Sep 2024 18:02:59 +0200 Lines: 40 Message-ID: References: <92dprk-jcm.ln1@news.martinen.de> <10i7sk-51q.ln1@news.informatik.uni-stuttgart.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net 60judnRy5czRee8foOh2JwTfoJ6p/GcFEXA7t0YyyTo/r2B+fy Cancel-Lock: sha1:LgKWDqo2HsyUvkoPXFGM2oilIYk= sha256:OmBBiCTlplspK3W8jhqGBcem8QbhKKlnILX9EO2/lE4= User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 Hamster/2.1.0.1538 In-Reply-To: <10i7sk-51q.ln1@news.informatik.uni-stuttgart.de> Xref: csiph.com de.alt.folklore.computer:46341 Am 23.09.2024 um 09:29 schrieb Christian Corti: > Stefan Reuther wrote: >> Wer, wenn nicht der C-Standard, definiert denn, wann ein Compiler >> fehlerhaft ist? > > Du gehst gerade am Thema vorbei. Nein. > Aktuell reden wir über den Optimierer, der fehlerhaft arbeitet, und > nicht darüber, was ein Überlauf produziert. Wenn -O0 und -O2 so > grundsätzlich verschiedene Ergebnisse liefern, stimmt was nicht. "gcc -O0" und "gcc -O2" sind aus Sicht des C-Standards zwei verschiedene Implementierungen der Programmiersprache C. Und für beide definiert der C- bzw. C++-Standard, ob sie korrekt arbeiten. Es ist die normalste Sache der Welt, seit Jahrzehnten, dass sich Code mit "-O0" and mit "-O2" anders verhält. Ein Klassiker in C++ ist: #include struct foo { static const int bar = 17; }; int main() { std::vector v; v.push_back(foo::bar); } ("undefined reference to 'foo::bar'" mit -O0, kein Problem mit -O2.) Ein Äquivalent in C wäre void foo(); int main() { void (*p) = foo; } Stefan