For Linux 5.18 er det planlagt at flytte koden til en mere aktuel version af C for at løse forskellige problemer. 

Hvad er Linux, og hvad er det til?

Under processen med udvikler diskussion af linux-kernen om ogl tema af et sæt patches til at rette sårbarheder af Spectre i koden for at arbejde med sammenkædede lister, blev det klart for mange udviklere, at problemet kunne løses nemmere hvis var tilladt i kernekoden C que er i overensstemmelse med en nyere version af standarden. 

Og det er, at koden, der er tilføjet til Linux-kernen, i øjeblikket skal overholde ANSI C (C89)-specifikationen, som blev dannet i 1989.

Det er derfor problemet relateret til Spectre i koden var fordi se blev ved med at bruge en iterator defineret separat efter løkken.

På trods af dets generelt hurtige natur, er kerneprojektet afhængigt af en række ældre værktøjer. Mens kritikere kan lide at fokusere på fællesskabets omfattende brug af e-mail, er en muligvis mere væsentlig anakronisme brugen af ​​1989-versionen af ​​C-sprogstandarden til kernekode, en standard, der blev kodificeret før kerneprojektet startede for over 30 år siden. Det ser ud til, at langvarig praksis kan komme til ophør, så snart kernel 5.18, der forventes i maj i år.

Det nævnes det en makro bruges til at iterere over elementerne i den linkede liste, og da sløjfe-iteratoren sendes til denne makro, defineres den uden for selve sløjfen og forbliver tilgængelig efter sløjfen. Brug af C99-standarden ville give udviklere mulighed for at definere variabler for løkken i for()-blokken, hvilket ville løse problemet uden at opfinde løsninger.

Desværre er der flere steder i kernen, hvor listen
iterator bruges efter løkken, der brydes ved sådan en ændring. Heldigvis
der er scriptet use_after_iter.cocci, som kan bruges til at identificere sådanne
kode steder. Jeg var nødt til at tilpasse scriptet lidt, da det reducerer falsk
positive i det oprindelige brugstilfælde, men de er relevante for denne patch.

Et stort udvalg af rapporterede kodeplaceringer bruger kun listeiteratoren efter
cyklussen, hvis der var en tidlig exit (pause/goto), og de er derfor ikke
relevant.

For sin del, Linus Torvalds var enig i ideen for at kunne implementere understøttelse af de nyere specifikationer og foreslog yderligere at flytte på kerne 5.18 for at bruge C11-standarden, udgivet i 2011.

Derefter gik monteringen til GCC og Clang i den nye tilstand under den foreløbige verifikation uden afvigelse. Medmindre der opstår uforudsete problemer på grund af mere omfattende test, vil 5.18-kernebygningsscripts ændre '–std=gnu89'-indstillingen til '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds kunne ikke lide patchen særlig godt og kunne ikke se, hvordan den relaterer sig til spekulative eksekveringssårbarheder. Efter at Koschel yderligere forklarede situationen, var Torvalds dog enig i, at "dette er bare en normal fejl, almindeligt og enkelt" og sagde, at det skulle rettes uanset den større serie. Men så kom han til den egentlige kilde til problemet: at iteratoren, der blev overført til listens traversale makroer, skal erklæres i et omfang uden for selve løkken:

Hovedårsagen til, at denne type ikke-spekulative fejl kan opstå, er, at vi historisk ikke har haft C99-stil "erklære variabler i sløjfer." Så list_for_each_entry() - og alle de andre - filtrerer grundlæggende altid den sidste HEAD-indgang ud af løkken, simpelthen fordi vi ikke kunne erklære iterator-variablen i selve løkken.

Det er også værd at nævne det muligheden for at bruge C17-standarden blev overvejet, men i dette tilfælde ville det være nødvendigt at øge den minimumsunderstøttede version af GCC, da medtagelsen af ​​support til C11 er i overensstemmelse med de nuværende krav til GCC-versionen (5.1).

Endelig hvis du er interesseret i at vide mere om det, kan du kontrollere detaljerne i følgende link.


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for data: AB Internet Networks 2008 SL
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.