Durante la transición de Firefox a zlib-rs, los desarrolladores encontraron un error en la CPU de Intel

La organización Trifecta Tech Foundation, que desarrolla proyectos como ntpd-rs, sudo-rs, zlib-rs y bzip2-rs, informó sobre la transición de Firefox al uso de la biblioteca zlib-rs para la compresión y descompresión utilizando el método gzip. Además de proteger contra problemas derivados de errores en el manejo de la memoria, el cambio de zlib a zlib-rs resultó en un notable aumento del rendimiento: en las pruebas realizadas, la aceleración fue de entre 3.3 y 32.5 veces en operaciones individuales de decodificación, y de entre 2.7 y 10.86 veces en la decodificación de flujos continuos.

La biblioteca zlib-rs se utilizó en el lanzamiento de Firefox 151, pero después de su integración, algunos usuarios enfrentaron un problema que causaba un cierre inesperado debido a exceder los límites permitidos. Se ha señalado que en el código en Rust el problema provocó una parada de emergencia, mientras que en C una situación similar habría resultado en una corrupción de datos indetectable sin detener la operación. Como solución, en el lanzamiento 151.0.1 se volvió al uso de la antigua biblioteca zlib.

La primera manifestación del problema se notó durante las pruebas de las primeras versiones hace más de un año, pero no se pudo reproducir en los sistemas de los desarrolladores. Finalmente, después de un año de pruebas en usuarios de versiones beta, se decidió activar zlib-rs en el lanzamiento de Firefox 151. Después de una nueva serie de informes de problemas y un análisis de patrones, se determinó que la falla fue causada por un error en el microcódigo de la CPU Intel basado en la microarquitectura Raptor Lake de 13 y 14 generaciones, relacionado con el uso de un registro incorrecto.

El problema surgió porque el generador de código LLVM utilizó la instrucción "mov byte ptr [rsi + rdi + 1], ch" al escribir en memoria los resultados de codificación de Huffman. Al ejecutar esta instrucción en la CPU Raptor Lake, en lugar de los 8-15 bits del registro RCX, correspondientes al registro CH especificado en la instrucción, se escribían en memoria los bits 0-7, correspondientes al registro CL. Al preparar la versión de Firefox 152, se evitó el error y se trasladó el parche al conjunto principal de zlib-rs. La generación de la instrucción problemática se observó en LLVM 22 (en la rama en desarrollo LLVM 23 no se genera).

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster