Za Linux 5.18 je načrtovano premakniti kodo na novejšo različico C, da bi rešili različne težave. 

Kaj je Linux in čemu je namenjen?

Med postopkom oz razprava o razvijalcih jedra linuxa o inl tema niza popravke za odpravljanje ranljivosti Spectre v kodi za delo s povezanimi seznami, postalo je jasno za mnoge razvijalce, da je problem bi bilo lažje rešiti, če je bilo dovoljeno v kodi jedra C que je v skladu z novejšo različico standarda. 

In to je, da mora trenutno koda, dodana jedru Linuxa, ustrezati specifikaciji ANSI C (C89), ki je bila ustanovljena leta 1989.

To je razlog problem, povezan s Spectrom v kodi je bilo zato, ker se še naprej uporabljal iterator določeno ločeno za zanko.

Kljub svoji na splošno hitri naravi se projekt jedra opira na številna starejša orodja. Medtem ko se kritiki radi osredotočajo na obsežno uporabo e-pošte v skupnosti, je morda bolj pomemben anahronizem uporaba različice jezikovnega standarda C iz leta 1989 za kodo jedra, standarda, ki je bil kodificiran, preden se je projekt jedra začel pred več kot 30 leti. Videti je, da bi se ta dolgoletna praksa lahko končala takoj, ko bo jedro 5.18, pričakovano maja letos.

Omenjeno je, da makro se uporablja za ponavljanje elementov povezanega seznama, in ker je iterator zanke posredovan temu makru, je definiran zunaj same zanke in ostane na voljo po zanki. Uporaba standarda C99 bi razvijalcem omogočila, da definirajo spremenljivke za zanko v bloku for(), kar bi rešilo težavo brez izumljanja rešitev.

Na žalost je v jedru več lokacij, kjer je seznam
iterator se uporablja za zanko, ki se ob takšni spremembi prekine. na srečo
obstaja skript use_after_iter.cocci, ki ga je mogoče uporabiti za prepoznavanje takšnih
kodne lokacije. Skript sem moral nekoliko prilagoditi, saj zmanjša napačno vrednost
pozitivne v izvirnem primeru uporabe, vendar so pomembne za ta popravek.

Veliko število prijavljenih lokacij kod uporablja samo iterator seznama
cikel, če je prišlo do predčasnega izhoda (break/goto) in zato niso
ustrezen.

Na svoji strani Linus Torvalds se je strinjal z idejo da bi lahko implementiral podporo za novejše specifikacije in nadalje predlagal prehod na jedro 5.18 za uporabo standarda C11, izdanega leta 2011.

Po tem je med predhodnim preverjanjem montaža na GCC in Clang v novem načinu potekala brez odstopanj. Če zaradi obsežnejšega testiranja ne pride do nepredvidenih težav, bodo skripti za gradnjo jedra 5.18 spremenili možnost »–std=gnu89« v »–std=gnu11 -Wno-shift-negative-value«.

Linusu Torvaldsu popravek ni bil preveč všeč in ni videl, kako je povezan s ranljivostmi pri špekulativni izvedbi. Po tem, ko je Koschel dodatno pojasnil situacijo, se je Torvalds strinjal, da je "to samo običajna napaka, preprosta in preprosta" in dejal, da jo je treba popraviti ne glede na večjo serijo. Potem pa se je poglobil v pravi vir težave: da mora biti iterator, ki je prenesen na makre za prečkanje seznama, deklariran v obsegu zunaj same zanke:

Glavni razlog, zakaj lahko pride do te vrste nešpekulativne napake, je ta, da v preteklosti nismo imeli »deklariranja spremenljivk v zankah« v slogu C99. Torej list_for_each_entry() - in vsi drugi - v osnovi vedno filtrirajo zadnji vnos HEAD iz zanke, preprosto zato, ker nismo mogli deklarirati spremenljivke iteratorja v sami zanki.

Omeniti velja tudi to obravnavana je bila možnost uporabe standarda C17, toda v tem primeru bi bilo treba povečati minimalno podprto različico GCC, saj je vključitev podpore za C11 skladna s trenutnimi zahtevami za različico GCC (5.1).

Končno če vas zanima več o tem, podrobnosti lahko preverite v naslednja povezava.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Odgovoren za podatke: AB Internet Networks 2008 SL
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.