Linux 5.18 ir paredzēts pārvietot kodu uz jaunāku C versiju, lai atrisinātu dažādas problēmas. 

Kas ir Linux un kam tas paredzēts?

Procesa laikā izstrādātāju diskusija no Linux kodola par unl tēma par ielāpus, lai novērstu ievainojamības Spectre kodā, lai strādātu ar saistītajiem sarakstiem, kļuva skaidrs daudziem izstrādātājiem šī problēma varētu atrisināt vieglāk, ja tika atļauts kodola kodā C que atbilst jaunākai standarta versijai. 

Un šobrīd Linux kodolam pievienotajam kodam ir jāatbilst ANSI C (C89) specifikācijai, kas tika izveidota 1989. gadā.

Tas ir iemesls, kāpēc problēma, kas saistīta ar Spectre kodā bija tāpēc, ka sturpināja izmantot iteratoru definēts atsevišķi pēc cilpas.

Neskatoties uz tā ātro raksturu, kodola projekts balstās uz vairākiem vecākiem rīkiem. Lai gan kritiķiem patīk koncentrēties uz kopienas plašo e-pasta izmantošanu, iespējams, nozīmīgāks anahronisms ir C valodas standarta 1989. gada versijas izmantošana kodola kodam — standarts, kas tika kodificēts pirms kodola projekta sākuma pirms vairāk nekā 30 gadiem. Šķiet, ka šī ilgstošā prakse varētu beigties, tiklīdz kodols 5.18, kas paredzēts šī gada maijā.

Tas ir minēts makro tiek izmantots, lai atkārtotu saistītā saraksta elementus, un tā kā cilpas iterators tiek nodots šim makro, tas tiek definēts ārpus pašas cilpas un paliek pieejams pēc cilpas. Izmantojot C99 standartu, izstrādātāji varētu definēt mainīgos cilpas for() blokā, kas atrisinātu problēmu, neizgudrojot risinājumus.

Diemžēl kodolā ir vairākas vietas, kurās ir saraksts
iterators tiek izmantots pēc cilpas, kas pārtrauc šādas izmaiņas. par laimi
ir skripts use_after_iter.cocci, ko var izmantot, lai to identificētu
kodu atrašanās vietas. Man bija nedaudz jāpielāgo skripts, jo tas samazina viltus
pozitīvas lietas sākotnējā lietošanas gadījumā, taču tās attiecas uz šo ielāpu.

Daudzas norādītās koda atrašanās vietas pēc tam izmanto tikai saraksta iteratoru
ciklu, ja bija agrīna izeja (break/goto), un tāpēc tie nav
atbilstošs.

No savas puses, Linuss Torvalds piekrita idejai lai varētu ieviest atbalstu jaunākajām specifikācijām, kā arī ieteica pāriet uz kodolu 5.18, lai izmantotu C11 standartu, kas tika izdots 2011. gadā.

Pēc tam, veicot iepriekšēju pārbaudi, montāža GCC un Clang jaunajā režīmā pagāja bez novirzēm. Ja vien plašākas pārbaudes dēļ nerodas neparedzētas problēmas, 5.18 kodola veidošanas skripti mainīs opciju “–std=gnu89” uz “–std=gnu11 -Wno-shift-negative-value”.

Linusam Torvaldam ielāps ļoti nepatika, un viņš nesaskatīja, kā tas ir saistīts ar spekulatīvām izpildes ievainojamībām. Tomēr pēc tam, kad Košels sīkāk izskaidroja situāciju, Torvalds piekrita, ka "šī ir tikai parasta kļūda, vienkārša un vienkārša" un teica, ka tā ir jālabo neatkarīgi no lielākās sērijas. Bet tad viņš iedziļinājās patiesajā problēmas avotā: ka iterators, kas tika nodots sarakstam, šķērsošanas makro ir jādeklarē tvērumā ārpus pašas cilpas:

Galvenais iemesls, kāpēc var rasties šāda veida ne-spekulatīvas kļūdas, ir tas, ka vēsturiski mums nebija C99 stila "mainīgos deklarēt cilpās". Tātad list_for_each_entry() un visi pārējie pamatā vienmēr filtrē pēdējo HEAD ierakstu no cilpas, jo mēs nevarējām deklarēt iteratora mainīgo pašā cilpā.

Ir arī vērts to pieminēt tika apsvērta iespēja izmantot C17 standartu, bet šajā gadījumā būtu nepieciešams palielināt minimāli atbalstīto GCC versiju, jo atbalsta iekļaušana C11 atbilst pašreizējām prasībām GCC versijai (5.1).

Beidzot ja jūs interesē uzzināt vairāk par to, sīkāku informāciju varat pārbaudīt šī saite.


Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: AB Internet Networks 2008 SL
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.