abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 21:33 | Nová verze

Sway, dlaždicový (tiling) správce oken pro Wayland kompatibilní s i3, byl vydán ve verzi 1.4. Do vývoje se zapojilo 52 vývojářů. Přehled novinek na GitHubu. Zdůraznit lze podporu VNC (wayvnc) nebo částečnou podporu Mate panelu.

Ladislav Hagara | Komentářů: 4
včera 19:55 | Nová verze

Dokumentační tým LibreOffice vydává aktualizovanou příručku pro LibreOffice Math pro verzi LibreOffice 6.4. Update příručky provedl ruský dobrovolník Roman Kuzněcov. Český překladatelský tým hledá další překladatele pro překlad příruček, detaily na wiki.

Zdeněk Crhonek | Komentářů: 0
včera 19:00 | Zajímavý projekt

CutiePi Shell (GitHub) je nové open source uživatelské rozhraní pro mobilní zařízení vytvořené pro tablet CutiePi postavený na Raspberry Pi.

joejoe | Komentářů: 0
včera 11:44 | Nová verze

Vyšla nová verze nástroje pro správu diskových oddílů GParted a distribuce GParted Live, která obsahuje tento a další nástroje pro zálohování či obnovu dat. GParted 1.1.0 aktualizuje překlady a opravuje chyby včetně v např. přesunu uzamknutých šifrovaných oddílů LUKS, výpočtu velikosti souborového systému JFS či rozpoznávání členů ATARAID a jejich stavu. GParted Live 1.1.0-1 pak obsahuje novou verzi GParted, Linux 5.4.13 a vůbec novější balíčky z Debianu Sid.

Fluttershy, yay! | Komentářů: 0
včera 09:55 | Zajímavý článek

Jiří Eischmann se v příspěvku /e/: Android bez Googlu na starém telefonu na svém blogu podělil o zkušenosti s mobilním operačním systémem /e/ (Wikipedie) na telefonu Samsung Galaxy S4 Mini: Pokud hledáte pro svůj androidí telefon systém bez závislosti na Googlu, je to asi ta nejlepší volba.

Ladislav Hagara | Komentářů: 10
21.1. 18:55 | Nová verze

Po roce vývoje od vydání verze 4.0 a více než 7 400 změnách byla vydána nová stabilní verze 5.0 softwaru, který vytváří aplikační rozhraní umožňující chod aplikací pro Microsoft Windows také pod GNU/Linuxem, Wine (Wikipedie). Z novinek lze zdůraznit moduly ve formátu PE, podporu více monitorů, reimplementaci XAudio2 anebo podporu Vulkanu 1.1. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 1
21.1. 15:11 | Zajímavý článek

Michal Altair Valášek publikoval na svém blogu návod MQTT server do kapsy: Mosquitto na Orange Pi Zero na postavení vlastního MQTT (MQ Telemetry Transport) serveru s brokerem Mosquitto postaveného na ARM klonu Debianu Armbian na jednodeskovém počítači za deset dolarů Orange Pi Zero a zabezpečeného pomocí TLS certifikátů od Let's Encrypt a uživatelských jmen a hesel.

Ladislav Hagara | Komentářů: 3
20.1. 17:11 | Nová verze

Vyšlo Pharo 8.0. Přináší lepší nástroje pro refactoring či spoluráci s Gitem. Pharo je programovací jazyk a vývojové prostředí s řadou pokročilých vlastností.

Pavel Křivánek | Komentářů: 5
20.1. 13:11 | Pozvánky

Ak pracujete na zaujímavom projekte, zaujíma Vás špecifická téma alebo sa vyznáte o novinkách a trendoch vo svete Pythonu, zdieľajte to s ostatnými. Možnosť prihlásiť sa so svojou témou na PyConSK 2020 je otvorená do 31. 1. 2020.

… více »
RicCo386 | Komentářů: 0
20.1. 10:55 | Komunita

Mozilla.cz informuje (en), že Firefox Preview (kódově Fenix) se blíží svému prvnímu ostřejšímu vydání. Tento zcela nový prohlížeč pro Android nahradí zítra 21. ledna noční verze stávajícího Firefoxu pro Android (kódově Fennec).

Ladislav Hagara | Komentářů: 18
Zdají se vám sny s IT tématikou?
 (9%)
 (1%)
 (13%)
 (17%)
 (53%)
 (7%)
Celkem 253 hlasů
 Komentářů: 10, poslední 18.1. 16:18
Rozcestník

Kompilátory jsou příliš chytré

21.6.2010 11:00 | Přečteno: 2750× | Programování | Výběrový blog

Optimalizace, které umí dnešní kompilátory, jsou občas k neuvěření. Stále častěji se setkávám s případy, kdy mi právě optimalizace pořádně lezou na nervy. Pak o tom zpravidla napíšu vzteklý blogpost. Následující triviální příklad mi připadá celkem zajímavý. Někdo se mi vysměje, že se tak samozřejmé záležitosti divím. Pro někoho to naopak bude přínosné varování.

Dejme tomu, že vytvořím následující prasečí kód. Připusťme dále, že jsem naivní trouba, který si myslí, že takový kód vypíše 255 z.

#include <stdio.h>

int main() {
        char c = 0;
        while (++c) putchar('z');
}

Tak jo, první pokus...

$ gcc -O3 -march=native -S -o overflow1.s overflow.c

Nuže, podívejme se na while cyklus:

.L2:
        movq    stdout(%rip), %rsi
        movl    $122, %edi
        call    _IO_putc
        jmp     .L2

Není těch z nějak moc??? Manuálová stránka GCC otázky kolem overflow vysvětluje velmi jasně — nezbude, než se z ní poučit a zkusit to jinak:

$ gcc -O3 -fno-strict-overflow -march=native -S -o overflow2.s overflow.c
.L2:
        movq    stdout(%rip), %rsi
        movl    $122, %edi
        call    _IO_putc
        decb    %bl
        jne     .L2

Teprve teď to bude fungovat tak, jak bylo původně zamýšleno.

Přetečení v této podobě je bezesporu prasárna, jakou by nikdo neměl zkoušet. Faktem ale zůstává, že ve spoustě algoritmů z oblasti algebry se s přetečením počítá a v takovém případě optimalizace dovede světa neznalému programátorovi pořádně vypálit rybník.

       

Hodnocení: 79 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

21.6.2010 12:10 mektige
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Překladače umí překvapit... Tady je pěkná prezentace s příklady jejich chytristik: http://dl.fefe.de/optimizer-isec.pdf
21.6.2010 12:18 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
gcc pro AVR umí taky pěkný věci. Onehdá jsem jenom nevěřícně koukal na kód, kterej vypadal nějak takhle:
add r18, r18
add r18, r18
mov r19, r18
add r18, r18
add r19, r18
add r19, r18
; ... zde instrukce, které výsledek přičtou k indexovacímu registru
Kdyby někoho zajímalo, co to je, tak tenhle kód provádí násobení 20 (za předpokladu, že výsledek nebude větší než 255). Tedy něco, co se efektivněji udělá kódem:
ldi r19, 20
mul r18, r19 ; 2 tiky
; ... zde instrukce, které výsledek přičtou k indexovacímu registru
eor r1, r1
Samotné násobení tedy překladač vyrobí o polovinu delší, než by stačilo. A viděl jsem i "zajímavější" věci, které dokázal překladač vymyslet...
Quando omni flunkus moritati
21.6.2010 12:30 Actuator | blog: actuator
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
A není to první řešení náhodou rychlejší?
21.6.2010 12:31 Actuator | blog: actuator
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Ééé jsem slepej, 2 tiky, už vidím ...
21.6.2010 12:39 Vskutečnosti Saýc | skóre: 7
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

A urcite netrva mul dele? Na AVR na kterem jsme pracovali ve skole trval snad 18 taktu, ale byla to nejaka divna varianta.

stativ avatar 21.6.2010 13:04 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Tak tak, většině procesorů násobení trvá docela dlouho, extrém je x86, kde to trvá klidně 80 taktů. Co jsem ve škole pracovali s nějakým Hitachi tak tam to trvalo asi 20 taktů. Rozhodně by se ale to násobení dalo napsat efektivněji pomocí bitových posunů (např. jeden registr posunout o 4 bity doleva, jeden o 1 bit a sečíst.).
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
21.6.2010 13:36 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Rozhodně by se ale to násobení dalo napsat efektivněji pomocí bitových posunů (např. jeden registr posunout o 4 bity doleva, jeden o 1 bit a sečíst.)
Pokud dobře počítám, tak tohle by násobilo 18. A bitový posun trvá stejně dlouho jako add, takže výsledek by byl stejný s tím, co vyrobí překladač.

Quando omni flunkus moritati
stativ avatar 21.6.2010 14:12 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Pokud dobře počítám, tak tohle by násobilo 18.
Máš pravdu, nějak jsem se nedopočítal.

A bitový posun trvá stejně dlouho jako add, takže výsledek by byl stejný s tím, co vyrobí překladač.
Určitě? Tohle jsou 3 instrukce + mov, kdežto v tom ukázkovém kódu jich vidím 5 + mov.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
21.6.2010 14:16 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Určitě? Tohle jsou 3 instrukce + mov
AVR umí posun jenom o jednu pozici.
Quando omni flunkus moritati
stativ avatar 21.6.2010 15:08 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Aha, to jsem nevěděl.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
21.6.2010 13:30 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
18 taktů? Jsi si jistý, že to bylo AVR (ne AVR32)? Nejdelší instrukce, které má AVR, trvají 4 tiky (volání a návrat z podprogramů, návrat z přerušení); mul má určitě 2.
Quando omni flunkus moritati
Josef Kufner avatar 21.6.2010 13:42 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
A nemohlo to být třeba kvůli tomu, že těsně předtím tam bylo ještě jiné násobení a pipeline by musela čekat než se uvolní násobička?
Hello world ! Segmentation fault (core dumped)
21.6.2010 13:49 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
AVR ;-)
Quando omni flunkus moritati
Josef Kufner avatar 21.6.2010 13:57 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Neíkej, že by tak krásný procesor neměl pipeline...
Hello world ! Segmentation fault (core dumped)
21.6.2010 13:59 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Nemá, v tomhle smyslu dělá akorát to, že při zpracovávání jedné instrukce přednačítá další z programové paměti.
Quando omni flunkus moritati
Josef Kufner avatar 21.6.2010 14:34 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Aha, tak to pak jo.
Hello world ! Segmentation fault (core dumped)
21.6.2010 21:35 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Tak jenom pro úplnost (koukl jsem se do poznámek): ten kód nahoře se ve skutečnosti počítá v 16 bitech, takže těch instrukcí pro sčítání je 12 , kdežto kód s násobičkou se v podstatě nemění

Další pěkné případy dělají tohle

C kód:
unsigned char *j;
unsigned char a;

j = sdev->out_hlavicka; /* out_hlavicka je char[3] */
for (a = 3; a; a--) 
    *(j++) = b;
Očekával bych kód
adiw r26, 0x15 ; indexovací registr ukazující na začátek struct sdev
               ; se posune na prvek out_hlavicka
st X+, r18     ; hodnota v r18 se zkopíruje do tří po sobě 
st X+, r18     ; jdoucích pozic
st X+, r18
Ve skutečnosti ovšem překladač vyplodí toto:
adiw r26, 0x15 ; posun indexovacího registru
st X, r18
sbiw r26, 0x15 ; návrat na začátek struktury
adiw r26, 0x16 ; abychom se hned vrátili zpátky o byte dál
st X, r18
sbiw r26, 0x16
adiw r26, 0x17
st X, r18
adiw i sbiw jsou dvoutikové, takže osm tiků zbytečně navíc

No a nejhezčí na konec - kód, který kopíruje jeden buffer v paměti jinam:
movw r30, r10 ; r10:r11 obsahuje adresu bufferu, ze kterého se kopíruje,
              ; nahraje se do r30:r31
ld r24, Z+    ; Z je r30:r31, inkrementuje se
movw r10, r30 ; nové Z se uloží zpět do r10:r11
movw r30, r12 ; totéž pro cílovou adresu uloženou v r12:r13
st Z+, r24    ; kam se hodnota v r24 uloží
movw r12, r30 ; a nový ukazatel se vrátí do r12:r13
subi r16, 0x01 ; dekrementace počítadla a skok, pokud
sbci r17, 0x00 ; není nulové
brne .-22
Správný postup je tohle:
   mov ZL, r10 ; jeden ukazatel do Z
   mov XL, r12 ; druhý ukazatel do X
1: ld r24, Z+
   st X+, r24
   subi r16, 0x01
   sbci r17, 0x00
   brne 1b
movw je taky dvoutiková, takže překladač každý průchod cyklem prodlužuje o osm tiků a zdvojnásobuje tak dobu, za jakou se cyklus vykoná.

Zkrátka a dobře překladači se tady nedá věřit, přičemž o verzi 4 gcc to platí víc než o verzi 3.
Quando omni flunkus moritati
21.6.2010 12:56 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Nepocita se v tech alogritmech z algebry s pretecenim bezznamenkovych cisel?
21.6.2010 14:07 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Presne tak, znamenkove preteceni neni garantovane (preteceni vede k nedefinovanemu stavu), neznamenkove ano.

Holt to chce proste znat standard.
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
Grunt avatar 21.6.2010 13:55 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Nechápu. Na tom by mělo být něco divného?
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
21.6.2010 14:10 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Ono je ted strasne moderni delat ze sebe blbce pres blog. Ja kdyz jsem narazil na podobnou vec, kterou jsem neznal tak jsem se s tim maximalne pobavil se zkusenejsim kamaradem, ktery mi rekl ze jsem kreten a ze si mam precist standard.
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
Grunt avatar 21.6.2010 14:18 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Nač standard? Bohatě stačí i manuálová stránka.

-fstrict-overflow

Allow the compiler to assume strict signed overflow rules, depending on the language being compiled. For C (and C++) this means that overflow when doing arithmetic with signed numbers is undefined, which means that the compiler may assume that it will not happen. This permits various optimizations. For example, the compiler will assume that an expression like "i + 10 > i" will always be true for signed "i". This assumption is only valid if signed overflow is undefined, as the expression is false if "i + 10" overflows when using twos complement arithmetic. When this option is in effect any attempt to determine whether an operation on signed numbers will overflow must be written carefully to not actually involve overflow.

This option also allows the compiler to assume strict pointer semantics: given a pointer to an object, if adding an offset to that pointer does not produce a pointer to the same object, the addition is undefined. This permits the compiler to conclude that "p + u > p" is always true for a pointer "p" and unsigned integer "u". This assumption is only valid because pointer wraparound is undefined, as the expression is false if "p + u" overflows using twos complement arithmetic.

See also the -fwrapv option. Using -fwrapv means that integer signed overflow is fully defined: it wraps. When -fwrapv is used, there is no difference between -fstrict-overflow and -fno-strict-overflow for integers. With -fwrapv certain types of overflow are permitted. For example, if the compiler gets an overflow when doing arithmetic on constants, the overflowed value can still be used with -fwrapv, but not otherwise.

The -fstrict-overflow option is enabled at levels -O2, -O3, -Os.

Jestli je to i ve standardu, tak jen o to víc.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
22.6.2010 05:26 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

A právě o manuálové stránce jsem se v zápisu zmínil. Je na tom něco špatně?

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
21.6.2010 15:36 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Ono je ted strasne moderni delat ze sebe blbce pres blog.
takze ten kdo nezna specifikaci do detailu je blbec. jinak clanek jako upozorneni na (neobvyklou) chybu, kterou muze udelat kazdy, je imho dobry napad.
Ja kdyz jsem narazil na podobnou vec, kterou jsem neznal tak jsem se s tim maximalne pobavil se zkusenejsim kamaradem, ktery mi rekl ze jsem kreten a ze si mam precist standard.
mas zvlastni kamarady.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
21.6.2010 16:01 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Kdyby kolega napsal, ze to byla jeho chyba zpusobena neznalosti standardu, tak je to v poradku. Bohuzel on ten incident podava tak, ze za to muzou kompilatory a jejich optimalizace.
Marek Bernát avatar 21.6.2010 16:29 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Ťažko to mohol napísať, ak o tom nevedel. Za druhé, treba si z blogu zobrať podstatu a nebazírovať na názoroch autora, tie nie sú až tak dôležité a môžu sa deň odo dňa zmeniť (v princípe). Navyše tu vznikla celkom zaujímavá diskusia o nejakom procesore, ktorý som dodnes nepoznal. Takže blog má u mňa palec hore.

physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
21.6.2010 16:52 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

V tomto vlakne se bavime o tom, dela-li ze sebe kolega Andrej blbce, takze je nutne "bazirovat" na nazorech autora. Kdyby blog upozornoval na to, ze znamenkove preteceni je nedefinovane chovani, tak by to bylo v poradku. Jenze on ten text vyzniva tak, ze je to sice trochu prasarnicka, ale jinak je kod v poradku a chyba je v optimalizujicich kompilatorech.

Marek Bernát avatar 21.6.2010 17:03 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Ešte raz: ak o tom nevedel, ťažko to mohol písať tak, ako to chcete. Písal to tak, ako si myslel, že to je. Súhlasím, že si mal o tom niečo viac zistiť, kým napísal blog. Ale určite by som ho kvôli tomu neoznačoval za blbca.

physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
21.6.2010 19:18 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Osobne si myslim ze mezi vyrazy "XY ze sebe dela blbce" a "XY je blbec" je vyrazny semanticky rozdil. Navic tohle je tak desne proflaknuta vec (google rad poradi).
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
Marek Bernát avatar 21.6.2010 22:05 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Mno neviem, pre mňa sú tie výrazy skoro ekvivalentné. Ničmenej, ak ti dobre rozumiem, tak pre teba výraz "dělat ze sebe blbce" je práve to, čo spravil Andrej (tj. drobná chyba z neznalosti). To potom ok, s tým nemám problém.

Že je to prefláknuté je irelevantné. Buď o tom vieš, alebo nie :-)

physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
22.6.2010 06:01 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Abych řekl pravdu, křiklouny typu „přečti si standard a nepruď“ jsem více méně čekal. Přesto si dovolím doplnit několik poznámek:

  1. Kolik uživatelů kompilátoru C má prostudovaný standard? Kdyby ho znali všichni, nemusel bych o tomto psát, že ano.
  2. K tomuto příspěvku a k některým příspěvkům níže bych asi přidal řečnickou otázku: Kde tvrdím, že ten kód je v pořádku? V mém blogpostu to nevidím.
  3. I kdyby byl tentýž kód založený na bezznaménkovém přetečení, které se přeloží správně, stále bych ho neoznačil (z hlediska čitelnosti) za „v pořádku“.
  4. Kód nevznikl tak, že bych něco takového sám od sebe vytvořil a pak se divil. :-D Zkoušel jsem cca třicet různých cyklů (ne vždy v souladu se standardem) a zajímalo mě, jak si GCC poradí například
    • s alokací registrů a s paměťovými referencemi na proměnné (lokální, globální, globální static, členy struktur, volatile, ...).
    • s optimalizací přístupu k proměnným a s přeuspořádáním instrukcí přes volání funkcí (lokálních, dobře známých (putchar()) či neznámých (z dynamických knihoven)).
    Některé výsledky mě překvapily, jiné jsem očekával. Každopádně se vsadím, že mnozí z těch, kteří tu předvádějí bohatýrské řeči ve stylu „jo, hochu, kdybys tak znal standard...“, by asi taktéž ve spoustě situací neměli příliš jasno.
  5. Cílem blogpostu je upozornit na jednu z rizikových situací, kdy kompilace dopadne při -O0 a -O1 jinak než při -O2 a -O3. Není to chyba kompilátoru (nestandardní kód -> nedefinovaný výsledek), ale zas tak samozřejmé mi to nepřipadá.
  6. Že je celá situace popsaná v manuálové stránce, to můj blogpost říká zcela výslovně. Nevím, proč si někdo myslí, že tuto záležitost považuji za bug v kompilátoru nebo co.

A vůbec, chce to klid. Nebo rovnou -Wstrict-overflow.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
22.6.2010 09:10 R
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
-Wstrict-overflow nefunguje (GCC 4.4.4)
22.6.2010 10:14 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Nefunguje? Co tím chtěl básník říci?

$ gcc -O3 -Wstrict-overflow -march=native -S -o overflow.s overflow.c
overflow.c: In function ‘main’:
overflow.c:5:8: warning: assuming signed overflow does not occur when simplifying conditional to constant

Třeba je to verzí GCC, co já vím...

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/usr --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-gnu-unique-object --enable-lto --enable-plugin --disable-multilib --disable-libstdcxx-pch --with-system-zlib --with-ppl --with-cloog --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
Thread model: posix
gcc version 4.5.0 20100520 (prerelease) (GCC)
ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
23.6.2010 14:24 R
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
$ gcc -O3 -Wstrict-overflow -march=native -S -o overflow.s overflow.c
$
$ gcc -v
Reading specs from /usr/lib/gcc/i486-slackware-linux/4.4.4/specs
Target: i486-slackware-linux
Configured with: ../gcc-4.4.4/configure --prefix=/usr --libdir=/usr/lib --enable-shared --enable-bootstrap --enable-languages=ada,c,c++,fortran,java,objc --enable-threads=posix --enable-checking=release --with-system-zlib --with-python-dir=/lib/python2.6/site-packages --disable-libunwind-exceptions --enable-__cxa_atexit --enable-libssp --with-gnu-ld --verbose --with-arch=i486 --target=i486-slackware-linux --build=i486-slackware-linux --host=i486-slackware-linux
Thread model: posix
gcc version 4.4.4 (GCC)
24.6.2010 04:22 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

Tak buď ve starší verzi příslušné varování chybí, nebo starší verze tu optimalizaci nepoužila a nebylo tedy před čím varovat.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
24.6.2010 12:37 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
RTFM: "This option is only active when -fstrict-overflow is active"
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
24.6.2010 15:59 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

RTFM: "The -fstrict-overflow option is enabled at levels -O2, -O3, -Os."

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
22.6.2010 10:11 Martin Doucha | skóre: 23 | blog: Yet another blog
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Že je celá situace popsaná v manuálové stránce, to můj blogpost říká zcela výslovně. Nevím, proč si někdo myslí, že tuto záležitost považuji za bug v kompilátoru nebo co.
Protože tak vyznívá název článku a ten více méně definuje kontext pro celý zbytek textu, například hranici mezi sarkasmem a vážně myšleným textem.
Marek Bernát avatar 21.6.2010 16:29 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

+1, chcel som napísať niečo v podobnom duchu.

physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
hajma avatar 21.6.2010 14:22 hajma | skóre: 27 | blog: hajma | Říčany
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Sun Studio to zkompiluje korektne
21 promarněných znaků
24.6.2010 12:38 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Vsechny kompilatory (i to co to nezkompiluji) to kompiluji korektne. Protoze korektne v tomto pripade = libovolne.
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
21.6.2010 18:51 JS
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré
Mozna se pletu, ale u -O3 je napsano, ze zapina optimalizace, ktere mohou za jistych okolnosti menit semantiku kodu. To si staci pamatovat a je to v pohode.
22.6.2010 06:08 Andrej | skóre: 47 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Kompilátory jsou příliš chytré

V tomto konkrétním případě to pro -O2 dopadne stejně, takže tentokrát problém není v -O3. Problém je v tom, že ten kód není korektní (jak už se někteří místní experti nechali slyšet) :-D a výsledek tedy není jasně definovaný.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.