Pentru Linux 5.18 este planificată mutarea codului la o versiune mai actuală de C pentru a rezolva diverse probleme. 

Ce este Linux și pentru ce este?

În timpul procesului de discuție pentru dezvoltatori a nucleului linux despre șil tema unui set de patch-uri pentru a remedia vulnerabilitățile de Spectre în cod pentru a lucra cu liste legate, a devenit clar pentru mulți dezvoltatori că problema ar putea fi rezolvată mai ușor dacă a fost permis în codul kernelului C que se conformează cu o versiune mai nouă a standardului. 

Și este că în prezent codul adăugat la Linux Kernel trebuie să respecte specificația ANSI C (C89), care a fost creată în 1989.

De aceea problema legată de Spectre în cod a fost pentru că sam continuat să folosesc un iterator definite separat după buclă.

În ciuda naturii sale în general rapide, proiectul kernel se bazează pe o serie de instrumente mai vechi. În timp ce criticilor le place să se concentreze asupra utilizării extensive a e-mailului de către comunitate, un anacronism posibil mai semnificativ este utilizarea versiunii din 1989 a standardului limbajului C pentru codul nucleului, un standard care a fost codificat înainte ca proiectul kernel să înceapă acum peste 30 de ani. Se pare că această practică de lungă durată s-ar putea încheia de îndată ce kernel-ul 5.18, așteptat în luna mai a acestui an.

Se menționează că o macrocomandă este utilizată pentru a itera elementele listei legate, și din moment ce iteratorul buclei este transmis acestei macrocomenzi, este definit în afara buclei în sine și rămâne disponibil după buclă. Folosirea standardului C99 ar permite dezvoltatorilor să definească variabile pentru bucla în blocul for(), ceea ce ar rezolva problema fără a inventa soluții alternative.

Din păcate, există mai multe locații în nucleu în care se află lista
iteratorul este folosit după bucla care se întrerupe la o astfel de modificare. din fericire
există script-ul use_after_iter.cocci care poate fi folosit pentru a identifica astfel
locații de cod. A trebuit să adaptez puțin scenariul, deoarece reduce falsul
pozitive în cazul de utilizare inițial, dar acestea sunt relevante pentru acest patch.

O mare varietate de locații de cod raportate utilizează doar iteratorul de listă după
ciclul dacă a existat o ieșire timpurie (break/goto) și, prin urmare, nu sunt
relevante.

La rândul său, Linus Torvalds a fost de acord cu ideea pentru a putea implementa suport pentru specificațiile mai noi și a sugerat în continuare trecerea la kernel-ul 5.18 pentru a utiliza standardul C11, lansat în 2011.

După aceea, în timpul verificării preliminare, montarea la GCC și Clang în noul mod a trecut fără abatere. Cu excepția cazului în care apar probleme neprevăzute din cauza testării mai extinse, scripturile de construire a nucleului 5.18 vor schimba opțiunea „–std=gnu89” în „–std=gnu11 -Wno-shift-negative-value”.

Lui Linus Torvalds nu i-a plăcut foarte mult patch-ul și nu a văzut cum are legătură cu vulnerabilitățile de execuție speculative. Cu toate acestea, după ce Koschel a explicat în continuare situația, Torvalds a fost de acord că „acesta este doar un bug normal, simplu și simplu” și a spus că ar trebui remediat indiferent de seria mai mare. Dar apoi a cercetat sursa reală a problemei: că iteratorul trecut la macrocomenzile de traversare a listei trebuie declarat într-un domeniu în afara buclei în sine:

Principalul motiv pentru care poate apărea acest tip de eroare non-speculative este că istoricul nu aveam „declararea variabilelor în bucle” în stil C99. Deci list_for_each_entry() - și toate celelalte - în mod fundamental filtrează întotdeauna ultima intrare HEAD din buclă, pur și simplu pentru că nu am putut declara variabila iteratoare în bucla în sine.

De asemenea, merită menționat faptul că a fost luată în considerare posibilitatea utilizării standardului C17, dar în acest caz ar fi necesară creșterea versiunii minime acceptate de GCC, deoarece includerea suportului pentru C11 este conformă cu cerințele actuale pentru versiunea GCC (5.1).

În cele din urmă dacă sunteți interesat să aflați mai multe despre asta, puteți verifica detaliile în următorul link.


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: AB Internet Networks 2008 SL
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.