För Linux 5.18 är det planerat att flytta koden till en mer aktuell version av C för att lösa olika problem. 

Vad är Linux och vad är det till för?

Under processen av utvecklardiskussion av linux-kärnan om ochl tema av en uppsättning av patchar för att åtgärda sårbarheter av Spectre i koden för att arbeta med länkade listor, blev det tydligt för många utvecklare att problemet skulle kunna lösas lättare om var tillåtet i kärnkoden C que överensstämmer med en nyare version av standarden. 

Och det är att för närvarande måste koden som läggs till Linuxkärnan överensstämma med ANSI C (C89)-specifikationen, som bildades 1989.

Det är därför problemet relaterat till Spectre i koden var eftersom se fortsatte att använda en iterator definieras separat efter slingan.

Trots dess generellt snabba natur förlitar sig kärnprojektet på ett antal äldre verktyg. Medan kritiker gillar att fokusera på samhällets omfattande användning av e-post, är en möjligen mer betydande anakronism användningen av 1989 års version av C-språkstandarden för kärnkod, en standard som kodifierades innan kärnprojektet startade för över 30 år sedan. Det ser ut som att den långvariga praxisen kan ta slut så snart som kärnan 5.18, som förväntas i maj i år.

Det nämns det ett makro används för att iterera över elementen i den länkade listan, och eftersom loop-iteratorn skickas till detta makro, definieras den utanför själva loopen och förblir tillgänglig efter loopen. Att använda C99-standarden skulle tillåta utvecklare att definiera variabler för slingan i for()-blocket, vilket skulle lösa problemet utan att hitta på lösningar.

Tyvärr finns det flera platser i kärnan där listan
iterator används efter slingan som bryter vid en sådan förändring. Lyckligtvis
det finns skriptet use_after_iter.cocci som kan användas för att identifiera sådana
kodplatser. Jag var tvungen att anpassa manuset lite då det minskar falskt
positiva i det ursprungliga användningsfallet, men de är relevanta för denna patch.

En stor mängd rapporterade kodplatser använder bara listiteratorn efter
cykeln om det fanns en tidig utgång (paus/goto) och därför inte är det
relevant.

För sin del, Linus Torvalds höll med om idén för att kunna implementera stöd för de nyare specifikationerna och föreslog vidare att gå vidare till kärnan 5.18 för att använda C11-standarden, släppt 2011.

Efter det, under preliminär verifiering, gick monteringen till GCC och Clang i det nya läget utan avvikelse. Såvida inte oförutsedda problem uppstår på grund av mer omfattande testning, kommer 5.18 kärnbyggeskripten att ändra alternativet '–std=gnu89' till '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds gillade inte patchen särskilt mycket och såg inte hur det förknippade med spekulativa exekveringssårbarheter. Men efter att Koschel ytterligare förklarat situationen gick Torvalds med på att "det här bara är en normal bugg, helt enkelt" och sa att det borde fixas oavsett den större serien. Men sedan kom han till den verkliga källan till problemet: att iteratorn som skickades till listtraversalmakron måste deklareras i ett omfång utanför själva loopen:

Den främsta anledningen till att denna typ av icke-spekulativa fel kan uppstå är att vi historiskt sett inte hade "deklarera variabler i loopar" i C99-stil. Så list_for_each_entry() - och alla andra - filtrerar i princip alltid den sista HEAD-posten ut ur loopen, helt enkelt för att vi inte kunde deklarera iteratorvariabeln i själva loopen.

Det är också värt att nämna det möjligheten att använda C17-standarden övervägdes, men i det här fallet skulle det vara nödvändigt att öka den minsta versionen av GCC som stöds, eftersom inkluderingen av stöd för C11 överensstämmer med de nuvarande kraven för GCC-versionen (5.1).

Slutligen om du är intresserad av att veta mer om detkan du kontrollera detaljerna i följande länk.


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för data: AB Internet Networks 2008 SL
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.