Арганізацыя Trifecta Tech Foundation, якая развівае такія праекты, як ntpd-rs, sudo-rs, zlib-rs і bzip2-rs, распавяла аб пераходзе Firefox на выкарыстанне бібліятэкі zlib-rs для сціску і распакаванні з выкарыстаннем метаду gzip. Акрамя абароны ад праблем, выкліканых памылкамі пры працы з памяццю, пераход з zlib на zlib-rs прывёў да прыкметнага павышэння прадукцыйнасці - у праведзеных тэстах паскарэнне склала ад 3.3 да 32.5 разоў пры адзінкавых аперацыях дэкадавання і ад 2.7 да 10.86 разоў пры дэкадаванні бесперапыннага.
Бібліятэка zlib-rs была задзейнічана ў выпуску Firefox 151, але пасля яе інтэграцыі некаторыя карыстачы сутыкнуліся з праблемай, якая прыводзіла да аварыйнага завяршэння з-за выхаду за дапушчальныя межы. Адзначаецца, што ў кодзе на мове Rust праблема прыводзіла да аварыйнага прыпынку, у той час як у Сі падобная сітуацыя прывяла б да незаўважнага пашкоджання дадзеных без прыпынку працы. У якасці рашэння ў выпуску 151.0.1 было вернутае выкарыстанне старой бібліятэкі zlib.
Першая праява праблемы была заўважана падчас тэставанняў ранніх зборак больш гады таму, але на сістэмах распрацоўнікаў яе не атрымоўвалася прайграць. У канчатковым рахунку, пасля года тэставання на карыстачах бэта-выпускаў было вырашана актываваць zlib-rs у рэлізе Firefox 151. Пасля новай серыі справаздач аб праблемах і разбору заканамернасці было высветлена, што збой выкліканы памылкай у мікракодзе CPU Intel на базе мікраархітэктуры Raptor Lake 13 і 14.
Праблема ўзнікала з-за таго, што генератар кода LLVM выкарыстаў інструкцыю "mov byte ptr [rsi + rdi + 1], ch" пры запісе ў памяць вынікаў кадавання Хаффмана. Пры выкананні дадзенай інструкцыі на CPU Raptor Lake замест 8-15 бітаў з рэгістра RCX, якія адпавядаюць паказанаму ў інструкцыі рэгістра CH, у памяць запісваліся біты 0-7, якія адпавядаюць рэгістра CL. Пры падрыхтоўцы выпуску Firefox 152 памылка была ўхіленая абыходным шляхам і патч перанесены ў асноўны склад zlib-rs. Генерацыя праблемнай інструкцыі заўважана ў LLVM 22 (у змешчанай у распрацоўцы галінцы LLVM 23 яна не генеруецца).
Крыніца: opennet.ru
