Linux 5.18 versijos kodą planuojama perkelti į naujesnę C versiją, kad būtų išspręstos įvairios problemos. 

Kas yra Linux ir kam jis skirtas?

Proceso metu kūrėjų diskusija „Linux“ branduolio apie irl rinkinio tema pataisos pažeidžiamumui ištaisyti Spectre kode, kad galėtumėte dirbti su susietais sąrašais, tapo aišku daugeliui kūrėjų tai yra problema būtų galima lengviau išspręsti, jei buvo leista branduolio kode C que atitinka naujesnę standarto versiją. 

Ir būtent šiuo metu prie Linux branduolio pridedamas kodas turi atitikti ANSI C (C89) specifikaciją, kuri buvo suformuota 1989 m.

Štai kodėl su Spectre susijusi problema kode buvo todėl, kad sir toliau naudojo iteratorių apibrėžta atskirai po ciklo.

Nepaisant iš esmės greito pobūdžio, branduolio projektas remiasi daugybe senesnių įrankių. Nors kritikai mėgsta sutelkti dėmesį į platų bendruomenės el. pašto naudojimą, galbūt reikšmingesnis anachronizmas yra 1989 m. C kalbos standarto versijos naudojimas branduolio kodui, standartas, kuris buvo kodifikuotas prieš pradedant branduolio projektą daugiau nei prieš 30 metų. Panašu, kad ši ilgametė praktika gali baigtis vos tik 5.18 branduolys, kurio tikimasi šių metų gegužę.

Minima, kad makrokomanda naudojama susieto sąrašo elementams kartoti, ir kadangi ciklo iteratorius perduodamas šiai makrokomandai, jis apibrėžiamas už pačios kilpos ribų ir lieka pasiekiamas po ciklo. Naudojant C99 standartą, kūrėjai galėtų apibrėžti ciklo kintamuosius bloke for(), o tai išspręstų problemą nerandant sprendimų.

Deja, branduolyje yra kelios vietos, kuriose pateikiamas sąrašas
iteratorius naudojamas po ciklo, kuris nutrūksta dėl tokio pakeitimo. Laimei
yra scenarijus use_after_iter.cocci, kuris gali būti naudojamas tokiai identifikuoti
kodų vietos. Turėjau šiek tiek pritaikyti scenarijų, nes jis sumažina melą
teigiamų dalykų pradiniame naudojimo atveju, tačiau jie yra svarbūs šiam pataisymui.

Daugybė kodo vietų, apie kurias pranešta, naudoja tik sąrašo iteratorių
ciklas, jei buvo ankstyvas išėjimas (pertrauka/goto), todėl jų nėra
Aktualus.

Savo ruožtu, Linusas Torvaldsas pritarė minčiai kad būtų galima įdiegti naujesnių specifikacijų palaikymą ir toliau siūlė pereiti prie 5.18 branduolio, kad būtų naudojamas C11 standartas, išleistas 2011 m.

Po to, atliekant išankstinį patikrinimą, montavimas prie GCC ir Clang nauju režimu praėjo be nukrypimų. Nebent dėl ​​išsamesnio testavimo kiltų nenumatytų problemų, 5.18 branduolio kūrimo scenarijai pakeis parinktį „–std=gnu89“ į „–std=gnu11 -Wno-shift-negative-value“.

Linusui Torvaldsui šis pleistras labai nepatiko ir jis nematė, kaip jis susijęs su spekuliacinio vykdymo pažeidžiamumu. Tačiau po to, kai Koschelis išsamiau paaiškino situaciją, Torvaldsas sutiko, kad „tai tik įprasta klaida, paprasta ir paprasta“, ir pasakė, kad ji turėtų būti ištaisyta, nepaisant didesnės serijos. Bet tada jis priėjo prie tikrojo problemos šaltinio: kad iteratorius, perduotas sąrašui, perėjimo makrokomandos turi būti deklaruojamos apimtyje, esančioje už pačios ciklo ribų:

Pagrindinė priežastis, dėl kurios gali atsirasti tokio tipo nespekuliacinės klaidos, yra ta, kad istoriškai neturėjome C99 stiliaus „deklaruoti kintamuosius kilpose“. Taigi list_for_each_entry() – ir visi kiti – iš esmės visada filtruoja paskutinį HEAD įrašą iš ciklo, nes negalėjome deklaruoti iteratoriaus kintamojo pačioje cikle.

Taip pat verta tai paminėti buvo svarstoma galimybė naudoti standartą C17, tačiau šiuo atveju reikėtų padidinti minimalų palaikomą GCC versiją, nes C11 palaikymo įtraukimas atitinka dabartinius GCC versijos reikalavimus (5.1).

Pagaliau jei norite sužinoti daugiau apie tai, išsamią informaciją galite patikrinti sekanti nuoroda.


Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Už duomenis atsakingas: AB Internet Networks 2008 SL
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.