Per Linux 5.18 è previsto lo spostamento del codice in una versione più aggiornata di C per risolvere vari problemi. 

Che cos'è Linux ea cosa serve?

Durante il processo di discussione degli sviluppatori del kernel Linux circa el tema di una serie di patch per correggere le vulnerabilità di Spectre nel codice per lavorare con elenchi collegati, è diventato chiaro per molti sviluppatori che il problema potrebbe essere risolto più facilmente se era consentito nel codice del kernel C que è conforme a una versione più recente dello standard. 

Ed è che attualmente il codice aggiunto al kernel Linux deve essere conforme alla specifica ANSI C (C89), che è stata costituita nel 1989.

Ecco perché il problema relativo allo Spettro nel codice era perché sHo continuato a usare un iteratore definito separatamente dopo il ciclo.

Nonostante la sua natura generalmente veloce, il progetto del kernel si basa su una serie di strumenti meno recenti. Mentre i critici amano concentrarsi sull'uso estensivo della posta elettronica da parte della comunità, un anacronismo forse più significativo è l'uso della versione del 1989 dello standard del linguaggio C per il codice del kernel, uno standard che è stato codificato prima che il progetto del kernel iniziasse oltre 30 anni fa. Sembra che quella pratica di vecchia data possa finire non appena il kernel 5.18, previsto per maggio di quest'anno.

Si è detto che una macro viene utilizzata per scorrere gli elementi dell'elenco collegato, e poiché l'iteratore del ciclo viene passato a questa macro, viene definito al di fuori del ciclo stesso e rimane disponibile dopo il ciclo. L'uso dello standard C99 consentirebbe agli sviluppatori di definire variabili per il ciclo nel blocco for(), che risolverebbe il problema senza inventare soluzioni alternative.

Sfortunatamente, ci sono più posizioni nel kernel in cui l'elenco
iterator viene utilizzato dopo il ciclo che si interrompe su tale modifica. fortunatamente
c'è lo script use_after_iter.cocci che può essere usato per identificarlo
posizioni del codice. Ho dovuto adattare un po' la sceneggiatura perché riduce il falso
positivi nel caso d'uso originale, ma quelli sono rilevanti per questa patch.

Un'ampia varietà di posizioni di codice segnalate utilizza l'iteratore di elenco solo dopo
il ciclo se c'è stata un'uscita anticipata (break/goto) e quindi non lo sono
pertinenziale.

D'altro canto, Linus Torvalds era d'accordo con l'idea per poter implementare il supporto per le specifiche più recenti e ha inoltre suggerito di passare al kernel 5.18 per utilizzare lo standard C11, rilasciato nel 2011.

Successivamente, durante la verifica preliminare, il montaggio su GCC e Clang nella nuova modalità è passato senza deviazioni. A meno che non sorgano problemi imprevisti a causa di test più estesi, gli script di build del kernel 5.18 cambieranno l'opzione '–std=gnu89' in '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds non ha gradito molto la patch e non ha visto come fosse correlata alle vulnerabilità di esecuzione speculativa. Tuttavia, dopo che Koschel ha spiegato ulteriormente la situazione, Torvalds ha convenuto che "questo è solo un bug normale, chiaro e semplice" e ha affermato che dovrebbe essere risolto indipendentemente dalle serie più grandi. Ma poi ha approfondito la vera fonte del problema: che l'iteratore passato alle macro di attraversamento dell'elenco deve essere dichiarato in un ambito esterno al ciclo stesso:

Il motivo principale per cui può verificarsi questo tipo di errore non speculativo è che storicamente non avevamo "dichiara variabili in loop" in stile C99. Quindi list_for_each_entry() - e tutti gli altri - fondamentalmente filtrano sempre l'ultima voce HEAD fuori dal ciclo, semplicemente perché non possiamo dichiarare la variabile iteratore nel ciclo stesso.

Vale anche la pena menzionarlo è stata considerata la possibilità di utilizzare lo standard C17, ma in questo caso sarebbe necessario aumentare la versione minima supportata di GCC, poiché l'inclusione del supporto per C11 è conforme ai requisiti attuali per la versione GCC (5.1).

Infine se sei interessato a saperne di più, puoi controllare i dettagli nel file seguente link


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile del trattamento: AB Internet Networks 2008 SL
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.