Pre Linux 5.18 sa plánuje presunúť kód do aktuálnejšej verzie C, aby sa vyriešili rôzne problémy. 

Čo je Linux a na čo slúži?

Počas procesu diskusia vývojárov linuxového jadra o al téma súboru záplaty na opravu slabých miest of Spectre v kóde na prácu s prepojenými zoznamami, vyjasnilo sa pre mnohých vývojárov je to problém by sa dalo vyriešiť jednoduchšie, keby bol povolený v kóde jadra C que zodpovedá novšej verzii normy. 

V súčasnosti musí kód pridaný do jadra Linuxu spĺňať špecifikáciu ANSI C (C89), ktorá bola vytvorená v roku 1989.

To je dôvod, prečo problém súvisiaci so Spectre v kódexe bolo preto, že se pokračoval v používaní iterátora definované samostatne po slučke.

Napriek svojej všeobecne rýchlej povahe sa kernelový projekt spolieha na množstvo starších nástrojov. Zatiaľ čo kritici sa radi sústreďujú na rozsiahle používanie e-mailu v komunite, možno ešte významnejším anachronizmom je použitie verzie štandardu jazyka C z roku 1989 pre kód jadra, štandardu, ktorý bol kodifikovaný pred začatím projektu jadra pred viac ako 30 rokmi. Zdá sa, že táto dlhodobá prax by sa mohla skončiť hneď, ako jadro 5.18, očakávané v máji tohto roku.

Je to spomenuté makro sa používa na iteráciu prvkov prepojeného zoznamu, a keďže sa tomuto makru odovzdá iterátor slučky, je definovaný mimo samotnej slučky a zostáva dostupný aj po slučke. Použitie štandardu C99 by umožnilo vývojárom definovať premenné pre cyklus v bloku for(), čím by sa problém vyriešil bez vymýšľania riešení.

Bohužiaľ, v jadre je viacero umiestnení, kde je zoznam
iterátor sa používa po slučke, ktorá sa preruší pri takejto zmene. Našťastie
existuje skript use_after_iter.cocci, ktorý sa dá použiť na ich identifikáciu
umiestnenia kódu. Scenár som musel trochu prispôsobiť, pretože znižuje nepravdu
pozitíva v pôvodnom prípade použitia, ale tie sú relevantné pre túto opravu.

Veľké množstvo nahlásených umiestnení kódu používa iba iterátor zoznamu po
cyklu, ak došlo k skorému odchodu (break/goto) a preto nie sú
relevantné.

Pre jeho časť, Linus Torvalds s nápadom súhlasil aby bolo možné implementovať podporu pre novšie špecifikácie a ďalej navrhol prechod na jadro 5.18 na používanie štandardu C11, ktorý bol vydaný v roku 2011.

Potom, počas predbežného overenia, montáž na GCC a Clang v novom režime prebehla bez odchýlky. Pokiaľ sa nevyskytnú nepredvídané problémy v dôsledku rozsiahlejšieho testovania, skripty na zostavenie jadra 5.18 zmenia možnosť '–std=gnu89' na '–std=gnu11 -Wno-shift-negative-value'.

Linusovi Torvaldsovi sa patch veľmi nepáčil a nevidel, ako súvisí so špekulatívnymi chybami pri vykonávaní. Keď však Koschel ďalej vysvetlil situáciu, Torvalds súhlasil, že „toto je len normálna chyba, obyčajná a jednoduchá“ a povedal, že by mala byť opravená bez ohľadu na väčšiu sériu. Potom sa však ponoril do skutočného zdroja problému: že iterátor prechádzajúci do zoznamu musí byť deklarovaný v rozsahu mimo samotného cyklu:

Hlavným dôvodom, prečo sa tento druh nešpekulatívnej chyby môže vyskytnúť, je to, že historicky sme nemali „deklarovať premenné v slučkách“ v štýle C99. Takže list_for_each_entry() – a všetky ostatné – v zásade vždy odfiltrujú poslednú položku HEAD zo slučky, jednoducho preto, že sme nemohli deklarovať premennú iterátora v samotnej slučke.

Za zmienku tiež stojí zvažovala sa možnosť použitia normy C17, ale v tomto prípade by bolo potrebné zvýšiť minimálnu podporovanú verziu GCC, keďže zahrnutie podpory pre C11 zodpovedá aktuálnym požiadavkám na verziu GCC (5.1).

Konečne ak máte záujem dozvedieť sa o tom viac, môžete skontrolovať podrobnosti v nasledujúci odkaz.


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Za údaje zodpovedá: AB Internet Networks 2008 SL
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.