6 декември, 2024

Rust 1.45 включва решение на проблем, който потенциално стабилизира функции, използвани от популярната Web Framework Rocket. Това е известен проблем с неопределеното поведение, когато предава номер с плаваща точка към цяло число. По-конкретно, следният фрагмент на код, макар и компилиран без грешки, има неопределено поведение в Rust 1.44 поради cast (като) на стойност с floating point от 300 до 8-битово неопределено цяло число, което може да представлява само цели стойности, състоящи се между 0 и 255:

fn cast(x: f32) -> u8 {
x as u8
}
fn main() {
let f = 300.0;
let x = cast(f);
println!("x: {}", x);
}

Проблемът е свързан с инструкцията за fptoui на LLVM, която генерира неправилна стойност, когато се използва в горния случай. Rust предоставя на опасната ключова дума, за да маркира кодови блокове, където искате да спрете гаранциите за Rust. Показаният по-горе фрагмент съдържа опасен код, въпреки че не е маркиран като опасен.

Отне няколко години на екипа на Rust да отстрани този проблем, главно поради факта, че не беше ясно как правилно да се справи с него. В крайна сметка те решиха да се превърнат в безопасен оператор, което означава, че прекалено големи floats се прехвърлят на максимално представимото цяло число, твърде малки floats и NaN се прехвърлят на 0.

Rust 1.45 също добавя поддръжка за извикване на процедурни макроси на три нови места, т.е. като част от израз, в рамките на съвпадение на модел или като изявление. Процедурните макроси бяха разширени в Rust 1.30, за да се даде възможност за дефиниране на макроси, подобни на функция, тоест макроси, които приличат на функции. Например, следният фрагмент дефинира SQL макроси, които генерират дървото на синтаксиса Rust, необходимо за анализиране на SQL оператор.

Като се има предвид популярността на Rocket, екипът на Rust работи усилено за стабилизиране на някои от тях, докато Rocket премахна други. В резултат на тези усилия, все още не е пусната Rocket 0.5, която ще бъде първата версия на Rocket, която може да компилира със стабилен Rust.

Освен споменатото тук, Rust 1.45 включва много допълнителни стабилизации и поправки. Не пропускайте официалните бележки за изданието за пълни подробности.

Тагове: , , , , , , ,