Per Linux 5.18 es planeja moure el codi a una versió més actual de C amb la finalitat de resoldre diversos problemes 

Què és Linux i per a què serveix

Durant el procés de la discussió per part dels desenvolupadors del Kernel de Linux sobre el tema d'un conjunt de pegats per corregir les vulnerabilitats de Spectre al codi per treballar amb llistes enllaçades, va quedar clar per a molts desenvolupadors que el problema podria resoldre's amb més facilitat si es permetés al kernel codi C qui s'ajusti a una versió més nova de l'estàndard. 

I és que actualment el codi agregat al Kernel de Linux ha de complir l'especificació ANSI C (C89), que es va formar el 1989.

És per això que el problema relacionat amb Spectre en el codi es va deure que si va continuar usant un iterador definit per separat després del cicle.

Tot i la seva naturalesa generalment ràpida, el projecte kernel es basa en una sèrie d'eines antigues. Si bé als crítics els agrada enfocar-se en l'ús extensiu del correu electrònic per part de la comunitat, un anacronisme possiblement més significatiu és l'ús de la versió del 1989 de l'estàndard de llenguatge C per al codi del nucli, un estàndard que va ser codificat abans que el projecte del kernel comencés fa més de 30 anys. Sembla que aquesta pràctica de llarga data podria acabar tan aviat com el nucli 5.18, que s'espera per al maig d'aquest any.

S'esmenta que es fa servir una macro per iterar sobre els elements de la llista vinculada, i atès que l'iterador de cicle es passa a aquesta macro, es defineix fora del mateix bucle i roman disponible després del bucle. L'ús de l'estàndard C99 permetria als desenvolupadors poder definir variables per al bucle al bloc for(), cosa que resoldria el problema sense inventar solucions alternatives.

Malauradament, hi ha diverses ubicacions al nucli on la llista
iterator es fa servir després del cicle que es trenca amb aquest canvi. Afortunadament
existeix l'script use_after_iter.cocci que es pot fer servir per identificar tals
ubicacions de codi. Vaig haver d'adaptar una mica el guió ja que redueix les falses
positius en el cas dús original, però aquests són rellevants per a aquest pegat.

Una gran varietat d'ubicacions de codis informats només usen l'iterador de llista després de
el cicle si hi va haver una sortida anticipada (break/goto) i per tant no són
pertinent.

Per la seva banda, Linus Torvalds va estar d'acord amb la idea de poder implementar el suport per a les especificacions més noves i a més d'això va suggerir moure's al nucli 5.18 per utilitzar l'estàndard C11, publicat el 2011.

Després, durant la verificació preliminar, el muntatge a GCC i Clang en la nova manera va passar sense desviacions. Tret que sorgeixin problemes imprevistos a causa de proves més exhaustives, els scripts de compilació del nucli 5.18 canviaran l'opció '–std=gnu89' a '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds no li va agradar gaire el pegat i no va veure com es relacionava amb les vulnerabilitats d'execució especulativa. Tot i això, després que Koschel expliqués més la situació, Torvalds va estar d'acord que «aquest és només un error normal, simple i planament» i va dir que s'hauria de solucionar independentment de la sèrie més gran. Però després es va endinsar a la font real del problema: que l'iterador passat a les macros de recorregut de llista s'ha de declarar en un àmbit fora del mateix bucle:

La raó principal per la qual pot passar aquest tipus d'error no especulatiu és que històricament no teníem “declarar variables en bucles” a l'estil C99. Així que list_for_each_entry() – i tots els altres – fonamentalment sempre filtren la darrera entrada HEAD fora del cicle, simplement perquè no vam poder declarar la variable iteradora al cicle mateix.

També cal esmentar que es va considerar la possibilitat d'utilitzar l'estàndard C17, però en aquest cas caldria augmentar la versió mínima suportada de GCC, ja que la inclusió de suport per a C11 s'ajusta als requisits actuals per a la versió GCC (5.1).

Finalment si estàs interessat en poder conèixer més a l'respecte, Pots consultar els detalls al següent enllaç.


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: AB Internet Networks 2008 SL
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.