L'organizzazione Trifecta Tech Foundation, che sviluppa progetti come ntpd-rs, sudo-rs, zlib-rs e bzip2-rs, ha parlato della transizione di Firefox all'uso della libreria zlib-rs per la compressione e la decompressione utilizzando il metodo gzip. Oltre a proteggere da problemi causati da errori nella gestione della memoria, il passaggio da zlib a zlib-rs ha comportato un notevole aumento delle prestazioni: nei test condotti, l'accelerazione è stata compresa tra 3,3 e 32,5 volte per operazioni di decodifica singole, e tra 2,7 e 10,86 volte per la decodifica di un flusso continuo.
La libreria zlib-rs è stata utilizzata nella versione di Firefox 151, ma dopo la sua integrazione alcuni utenti hanno riscontrato un problema che portava a crash dovuti a un accesso oltre i limiti consentiti. Si segnala che nel codice Rust il problema causava l'arresto anomalo, mentre in C una situazione simile avrebbe portato a danni ai dati senza fermare l'esecuzione. Come soluzione, nella versione 151.0.1 è stato ripristinato l'uso della vecchia libreria zlib.
Il primo manifestarsi del problema è stato osservato durante i test delle versioni preliminari oltre un anno fa, ma non è stato possibile riprodurlo sui sistemi degli sviluppatori. Alla fine, dopo un anno di test con gli utenti delle versioni beta, è stato deciso di attivare zlib-rs nella versione di Firefox 151. Dopo una nuova serie di rapporti sui problemi e un'analisi dei modelli, è stato scoperto che il guasto era causato da un errore nel microcodice delle CPU Intel basate sull'architettura Raptor Lake di 13 e 14 generazione, relativo all'uso di un registro errato.
Il problema è sorto perché il generatore di codice LLVM utilizzava l'istruzione «mov byte ptr [rsi + rdi + 1], ch» per scrivere in memoria i risultati della codifica di Huffman. Quando quest'istruzione veniva eseguita sulla CPU Raptor Lake, invece di 8-15 bit dal registro RCX, corrispondenti al registro CH specificato nell'istruzione, venivano scritti in memoria i bit 0-7, corrispondenti al registro CL. Durante la preparazione della versione di Firefox 152, l'errore è stato risolto tramite una soluzione alternativa e la patch è stata trasferita nel pacchetto principale di zlib-rs. La generazione dell'istruzione problematica è stata notata in LLVM 22 (nella versione in sviluppo di LLVM 23 non viene generata).
Fonte: opennet.ru
