Ano. Ale na render stanici nikdo browser nebude otevírat.
Prostě univerzální záplata není a nebude.
Buď vám jde o bezpečí a vypnete SMT a nebo vám jde o MT výkon a máte SMT=ON. Naštěstí tyto požadavky jdou málokdy proti sobě. Až na provozovatele cloudu.
Win11 se snaží o oboje, tak zahodili podporu ZEN 1. Linux se s tím bude muset poprat.
15. 8. 2023, 08:16 editováno autorem komentáře
Chytání takové exception jsou možná desetitisíce cyklů - žádná VM to takto nedělá. Dělení je samo o sobě celkem nákladná operace, takže nějaký jcc se tam úplně ztratí. Navíc moderní compiler na x86 bude preferovat 32-bit division, takže může klidně vygenerovat i další skok, který se rozhodne mezi 32-bit a 64-bit dělením (clang to takto třeba dělá).
No, jsou tu dvě možnosti:
a. O něco rychlejší běžný provoz za cenu poněkud pomalého (řádově pomalejšího) handlování chyby.
b. O něco pomalejší běžný provoz a rychlejší handlování chyby.
Nevím, jak se rozhodli tvůrci kterých kompilátorů, ale budu-li považovat dělení nulou za vzácný jev, jehož optimalizace nemá takovou prioritu, dává mi A smysl.
Super, takze namiesto toho aby sa korektne vyhodila nejaka chyba tak isto ako sa deje v matematike - je to nedefinovany stav. Tak sa radsej vyhodi konkretne cislo - 0. Preco sa nevyhodi Int32.Min, alebo Max, alebo Int64.Min, alebo Max? Su v ARMe skryte dalsie taketo matematicke omyly s ktorymi treba ratat pri pisani kodu?
To je ale úplně jedno. Z hlediska moderního návrhu CPU je nejlepší minimalizovat výjimky tohoto typu. FPU exceptions už taky nikdo nepoužívá, protože tu máme SIMD, maskování a další věci...
Pokud dělám VM, tak ta podmínka tam stejně musí být, protože odchytávat signál kvůli dělení nikdo nechce. A pokud používám jazyk jako C, kde to bude undefined behavior, tak stačí použít sanitizer nebo do kódu přidat assert.
V CPU tuto funkci prostě už nikdo nepotřebuje, je to naprosto zbytečné.
Takze o tom, co dela CPU a SW nemas paru ze? Ono se totiz na deleni nulo muze snadno dojit ... delenim nenulou. Jednoduse proto, ze nekde neco pretece. A ten tvuj uplne neskodnej vysledek ... tedy nula = vse bezi dal, jen nekde neco (treba jaderna elektrarna) vybuchne.
A vazeni, presne takto dnes vypadaji ti, co se zovou programatory. Vubec netusi co cini.
Jako že v jaderné elektrárně se budou spoláhat na to, že CPU zachytí integer division by zero? CPU vygeneruje exception, a co pak? Mohl bys to tu rozepsat, když tomu tak rozumíš?
Nevim kolik toho v životě udělals ty, ale já ti garantuju, že zrovna u těchto věcí ty kontroly budou úplně všude a k tomu dělení nulou nikdy nedojde právě kvůli tomu, že ty hodnoty budou zkontrolované 10x, a obě!
Dělení 0 je undefined behavior - žádný C/C++ kód se nemůže spoléhat na to, co CPU udělá, protože každá architektura má vlastní chování. Portabilní kód si vstupy prostě musí kontrolovat a ne čekat na to, že CPU něco udělá v takovém případě. Ve většině SW když k tomuto dojde, tak ten proces končí.
Zadny vyvojar, ktery alespon tusi jak veci maji fungovat, neocekava, ze mu cokoli na deleni nulou vrati bez dalsiho 0.
A chci videt, jak kontrolujes ze x/(y/z) ... nebude deleni nulou. y,z <> 0 a presto to deleni nulou klidne byt muze. Coz bys vedel, kdybys aspon tusil, jak pocitace zachazeji s cisly.
Dik za potvrzeni, ze o programovani nemas ani nejmensi paru.
I kdyby to byla jen dve cisla, nic to na veci nemeni, ten priklad jsem uvedl aby to nema tvar pochopila, ale zjevne zbytecne.
10/x ... x je cele cislo.
Co ze se stane, kdyz na vstupu zadam 0,1 ??? Aha, ve tvym pripade bude vysledek 0. Protoze 100% aplikaci ten vstup veme jako nenulovy, ze ... ale protoze to pak preda do toho celociselnyho intu ... tak se to orizne ... na 0.
A vysledek deleni bude tedy zcela spravne ... 0 ze? lol. A raketa nam leti misto k obloze k zemi ...
Presne totez se stane, kdyz vydelim neco velkym cislem, vysledek nebude 0, ale pocitac to jako 0 pouzije.
Nemluve o tom, ze zadny vypocet neni o dvou cislech a zadna aplikace nekontroluje jednotlive mezivysledky, protoze to ani technicky nejde, i jednoduchy vypocet by trval radove milionkrat dele.
A presne proto se ocekava, ze kdyz dojde na deleni nulou, neco vrati chybu.
Apropos, kdybys mel poneti o databazich, tak defakto totez se tyka null. Je 1 > null nebo < null ???
Jelikoz v jadernych alektrarnach narozdil od tebe vedi, ze se SW ani HW neda verit, tak tam maji zcela analogove rucne ovladane ventily, kteryma se to da cele vypnout.
a tak jasne, ze by to ocekavat mohl... ale je to podminka navic, takze ve vysledku pomalejsi kod.... asi si dokazu predstavit, ze bezne se to neresi... ale zrovna u skutecne kritickych vecich bych si tu zdanlive nadbytecnou kontrolu predstavit dokazal... vse co pisete je naprogramovatelne a neni to co do implementace slozity... a v zasade ani nikoliv neobvykly, ze? Ono u skutecne kritickych veci porovnavate vystupy z defacto i ruznych platforem a kdyz se "to" neshodne, mate z toho vyjimku/mimoradnou udalost... a to ze tohle nejaci "pehapeckari" nedelaji fakt neni validni argument, ze? :D
Jedno to teda rozhodne neni.
Ak si vrstva podomnou (to jest HW) stvara psie kusy o ktorych ja nemam paru pretoze logicky ocakavam nieco ine (tu to bude exception), rovnako ako to ocakava 99.999% programatorov.
To ze niekto bol lenivy to urobit naporiadok aj ked komplikovane, a rozhodol sa s tym radsej vym**at tym ze vrati nezmysel (tu je to ta nula), tak to urcite nie som nadseny z takej architektury.
To sme opet v dobe kedy napr intel mal FDIV bug, ked vracal pri deleni floatov zle vysledky (resp prvych par cislic bolo spravnych ale potom presnost vysledku isla do kopru).
Az z toho vznikol vtedy vtip:
Je sutaz kde dva procesory, Intel a AMD sutazia kto je lepsi. Rozhodca povie otazku - kolko je 2+2?
Intel v tom okamihu bleskurychle zahlasi 5. AMD o moment neskor odveti 4, a nasledne hovori intelu - vies ze 2+2 ma byt 4 a nie 5, tvoja odpoved je nespravna. Intel odveti: To je mozno pravda ze som povedal zly vysledok, ale ta rychlost!
No, a ak takto vyzera ten preslaveny ARM, tak to nie dakujem, zostanem radsej u X86/64.
Mám pocit, že hodně lidí v této diskuzi nechápe rozdíl mezi HW a programovacím jazykem. Pokud používáš C++, tak dělení nulou je UB. Pokud jiný jazyk, který tu operaci specifikuje, tak se můžeš spolehnout na kontroly, které tam přidá compiler toho jazyka.
Tím bych tu diskuzi ukončil, nemám čas se hádat s lidma, co toto nechápou a navíc tu řešit nějaké hloupé paralely s jinou chybou, která s tímto vůbec nesouvisí.
BTW jen pro doplnění: ARM a RISC-V jdou úplně stejnou cestou, doporučil bych si o tom něco přečíst.