Pro Linux 5.18 se plánuje přesunutí kódu do aktuálnější verze C, aby se vyřešily různé problémy. 

Co je Linux a k čemu slouží?

Během procesu vývojářskou diskuzi linuxového jádra o al téma souboru záplaty pro opravu zranitelností of Spectre v kódu pro práci s propojenými seznamy, vyjasnilo se pro mnoho vývojářů je to problém by se dal vyřešit snadněji, kdyby byl povolen v kódu jádra C que odpovídá novější verzi normy. 

V současnosti musí kód přidaný do jádra Linuxu odpovídat specifikaci ANSI C (C89), která byla vytvořena v roce 1989.

To je důvod, proč problém související se Spectrem v kódu bylo, protože se pokračoval v používání iterátoru definované samostatně za smyčkou.

Navzdory své obecně rychlé povaze se projekt jádra opírá o řadu starších nástrojů. Zatímco kritici se rádi zaměřují na rozsáhlé používání e-mailu v komunitě, možná významnějším anachronismem je použití verze standardu jazyka C z roku 1989 pro kód jádra, standardu, který byl kodifikován před zahájením projektu jádra před více než 30 lety. Vypadá to, že tato dlouhodobá praxe by mohla skončit, jakmile jádro 5.18, očekávané v květnu tohoto roku.

Je to zmíněno makro se používá k iteraci prvků propojeného seznamu, a protože iterátor smyčky je předán tomuto makru, je definován mimo samotnou smyčku a zůstává dostupný po cyklu. Použití standardu C99 by vývojářům umožnilo definovat proměnné pro smyčku v bloku for(), což by problém vyřešilo bez vymýšlení řešení.

Bohužel v jádře je několik míst, kde je seznam
iterátor se používá po smyčce, která se při takové změně přeruší. naštěstí
existuje skript use_after_iter.cocci, který lze použít k jejich identifikaci
umístění kódu. Musel jsem trochu upravit skript, protože snižuje false
pozitiva v původním případě použití, ale jsou relevantní pro tento patch.

Velké množství nahlášených umístění kódu používá pouze iterátor seznamu po
cyklu, pokud došlo k předčasnému ukončení (break/goto), a proto nejsou
relevantní.

Pro jeho část, Linus Torvalds s myšlenkou souhlasil abychom mohli implementovat podporu pro novější specifikace a dále navrhli přejít na jádro 5.18 a používat standard C11, vydaný v roce 2011.

Poté, při předběžném ověření, montáž na GCC a Clang v novém režimu proběhla bez odchylky. Pokud kvůli rozsáhlejšímu testování nenastanou nepředvídatelné problémy, skripty pro sestavení jádra 5.18 změní volbu '–std=gnu89' na '–std=gnu11 -Wno-shift-negative-value'.

Linusovi Torvaldsovi se patch moc nelíbil a neviděl, jak souvisí se zranitelností spekulativního spouštění. Poté, co Koschel dále vysvětlil situaci, Torvalds souhlasil, že „toto je jen normální chyba, prostá a jednoduchá“ a řekl, že by měla být opravena bez ohledu na větší sérii. Pak se ale ponořil do skutečného zdroje problému: že iterátor předaný seznamu procházení makra musí být deklarován v rozsahu mimo samotnou smyčku:

Hlavním důvodem, proč se tento druh nespekulativní chyby může vyskytnout, je to, že jsme historicky neměli „deklarování proměnných v cyklech“ ve stylu C99. List_for_each_entry() – a všechny ostatní – tedy zásadně vždy odfiltruje poslední položku HEAD ze smyčky, jednoduše proto, že jsme nemohli deklarovat proměnnou iterátoru v samotné smyčce.

Za zmínku také stojí byla zvážena možnost použití standardu C17, ale v tomto případě by bylo nutné zvýšit minimální podporovanou verzi GCC, protože zahrnutí podpory pro C11 odpovídá aktuálním požadavkům na verzi GCC (5.1).

Konečně pokud máte zájem o tom vědět více, můžete zkontrolovat podrobnosti v následující odkaz.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Za data odpovídá: AB Internet Networks 2008 SL
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.