Home / News / Linux elimina la storica funzione strncpy dopo 6 anni di lavoro e centinaia di patch

Linux elimina la storica funzione strncpy dopo 6 anni di lavoro e centinaia di patch

Con Linux 7.2 viene rimossa definitivamente la funzione strncpy dal kernel. Dopo sei anni di refactoring, gli sviluppatori hanno optato per API più sicure e specifiche per ridurre errori e vulnerabilità legate alla gestione delle stringhe.

Linux elimina la storica funzione strncpy dopo 6 anni di lavoro e centinaia di patch

Una delle operazioni più comuni nella programmazione a basso livello è la copia di stringhe e blocchi di memoria. Proprio per questo motivo, sorprende che una funzione presente da decenni nel linguaggio C possa trasformarsi in una fonte continua di errori. Con Linux 7.2 si conclude un’attività di bonifica del codice del kernel durata circa sei anni e ha visto oltre 360 modifiche distribuite tra sottosistemi, driver e architetture hardware differenti.

La decisione è dovuta a problemi concreti che gli sviluppatori del kernel hanno affrontato per anni: la manutenzione del codice di Linux coinvolge migliaia di contributori e oltre 30 milioni di righe di codice; eliminare un’API radicata richiede quindi una revisione meticolosa e progressiva. La rimozione definitiva di una funzione è un passaggio da svolgere con la massima cautela.

Negli ultimi anni, il progetto Linux ha introdotto numerose iniziative dedicate all’hardening del codice, alla prevenzione delle vulnerabilità di memoria e alla riduzione delle superfici d’attacco. L’abbandono di strncpy() si inserisce in questo contesto.

Perché strncpy era considerata una funzione problematica su Linux

L’implementazione storica di strncpy() fu pensata per gestire campi a lunghezza fissa, come quelli utilizzati nei vecchi filesystem Unix o in strutture dati che richiedevano un riempimento con byte nulli. Il comportamento effettivo però risulta controintuitivo: se la stringa sorgente supera la dimensione specificata, strncpy() copia i byte richiesti ma non garantisce la presenza del carattere terminatore NUL. Il risultato è una sequenza di caratteri che può sembrare una stringa C valida senza esserlo realmente.

Quando altre funzioni assumono invece la presenza del terminatore, il rischio di leggere memoria oltre i limiti previsti aumenta sensibilmente. Esiste poi un secondo problema meno evidente ma altrettanto importante: il riempimento automatico dell’area di destinazione. Se la stringa sorgente è più corta della dimensione richiesta, strncpy() azzera tutti i byte rimanenti. In alcune situazioni questa caratteristica è utile, ma in molti casi produce semplicemente lavoro aggiuntivo per la CPU, con un impatto inutile sulle prestazioni.

Nel kernel, dove alcune operazioni sono eseguite milioni di volte al secondo, questi dettagli rivestono un’importanza cruciale.

6 anni di refactoring e oltre 360 modifiche

La scomparsa di strncpy() non è avvenuta improvvisamente. Gli sviluppatori hanno dovuto analizzare ogni utilizzo presente nel sorgente del kernel e capire quale fosse l’intenzione originale del programmatore. Il problema era che la stessa funzione veniva impiegata per molteplici attività: copiare stringhe terminate dal carattere NUL, gestire dati binari di lunghezza fissa, riempire i buffer con byte aggiuntivi (padding) ed eseguire semplici operazioni di copia della memoria.

Secondo i dati pubblicati dagli sviluppatori coinvolti nel progetto, la rimozione ha richiesto circa 362 commit distribuiti nell’arco di 6 anni. L’ultimo passaggio ha eliminato sia l’API principale sia le implementazioni specifiche mantenute da alcune architetture, tra cui x86, PowerPC, Alpha, m68k e Xtensa.

Ogni sostituzione ha costretto i manutentori a rendere esplicito il comportamento desiderato. Eliminare completamente strncpy() dal kernel riduce una categoria di errori che gli sviluppatori consideravano ricorrenti. Molte API storiche sopravvivono per compatibilità, ma non sempre rappresentano la scelta migliore per i nuovi progetti.

Il fatto che una funzione sia presente negli standard del linguaggio non implica necessariamente che sia adatta agli attuali requisiti di sicurezza e affidabilità. Per un progetto come Linux, che costituisce il cuore di server, dispositivi embedded, infrastrutture cloud e supercomputer, interventi onerosi come quello svolto sulla funzione strncpy() a posteriori giustificano ampiamente lo sforzo.