programmatūra · 6 min · 16.07.2026

Rust 1.97 ieslēdz v0 simbolu kodēšanu pēc noklusējuma — veci atkļūdotāji vairs neatšifrē nosaukumus

Rust 1.97.0 iznāca 9. jūlijā, un kompilators tagad simbolu nosaukumus binārajā failā ieraksta pēc paša Rust shēmas, ko sauc par v0. Līdz šim tas aizņēmās C++ Itanium ABI kodēšanu. Praktiskās sekas: vecāki atkļūdotāji un profilatori šos nosaukumus vairs neatšifrē pareizi, tāpēc, atverot bināru gdb vai perf, funkciju vietā var parādīties gari, nesalasāmi simbolu virknējumi.

Pati shēma nav jaunums. Tā pieejama kopš versijas 1.59, kas iznāca 2022. gadā, un līdz 2025. gada novembrim slēpās aiz nightly karodziņa. Tagad tā ir noklusējums stabilajā laidienā. Rust jaunas versijas iznāk ik pēc sešām nedēļām, un šis laidiens satur pāris izmaiņu, kas skars gan CI konveijerus, gan atkļūdošanas rīkus.

Kāpēc mainās simbolu kodēšana

Simbolu kodēšana (angliski name mangling) ir tas, kā kompilators funkciju un tipu nosaukumus pārvērš par unikālām virknēm objektu failā. Linkerim vajag plakanu, unikālu nosaukumu katrai funkcijai, tāpēc std::vec::Vec::<i32>::push pārtop par vienu ASCII virkni. Itanium ABI tapa C++ vajadzībām, un tas nepārnesa daļu Rust informācijas — piemēram, ģenērisko parametru konkrētās vērtības pazuda vai sajaucās, un divi atšķirīgi ģenēriskie izsaukumi varēja saņemt neatšķiramus simbolus. Rust komanda raksta, ka v0 šīs vērtības saglabā un novērš vecās shēmas neviennozīmības.

v0 nosaukumi izskatās citādi. Tie sākas ar _R, tajos ir garuma prefiksi ceļa segmentiem, un tie kodē ģenēriskos argumentus. Tieši tāpēc rīkam ir jāzina jaunā gramatika, lai simbolu atšifrētu atpakaļ salasāmā formā. Jauns gdb to dara automātiski; vecāks tā vietā parāda pašu _R virkni.

Jauninot uz v0, daļa rīku — īpaši vecākas gdb, perf un citu profilatoru versijas — simbolus var neatšifrēt un parādīt tos neapstrādātā veidā.

Ja tavs build skripts parsē simbolu nosaukumus vai tu paļaujies uz konkrētu atkļūdotāja versiju, to vērts pārbaudīt pirms jaunināšanas. Veco Itanium shēmu joprojām var ieslēgt, bet tikai nightly kompilatorā — stabilajā laidienā tās vairs nav.

build.warnings aizstāj -Dwarnings

Otra izmaiņa skar ikvienu, kam CI prasa būvējumu bez brīdinājumiem. Līdz šim izplatītākais paņēmiens bija RUSTFLAGS=-Dwarnings. Problēma ir tā, ka Cargo RUSTFLAGS vērtību ieskaita katras kompilācijas pirkstu nospiedumā. Uzstādi to lokāli, un kešs, ko izveidoja būvējums bez tā, kļūst nederīgs; noņem to, un kešs krītas atkal. Izstrādātājs, kas pārslēdzas starp lokālo darbu un CI komandu, katru reizi pārkompilē visu koku no nulles.

1.97.0 nostabilizē Cargo konfigurāciju build.warnings. To var ierakstīt Cargo.toml failā vai padot ar vides mainīgo CARGO_BUILD_WARNINGS. Vērtības ir allow, warn (noklusējums) un deny. Kešs paliek neskarts, tāpēc deny CI konveijerā vairs nemaksā ar lieku pārbūvi. Cargo dokumentācija to iesaka tieši kā aizvietotāju vecajam -Dwarnings paņēmienam.

Linkera ziņas un lockfile ceļš

Linkera izvade tagad pēc noklusējuma parādās kā brīdinājumi. Agrāk daļa linkera ziņu vienkārši pazuda, un problēmas atklājās vēlāk. Ja šīs ziņas traucē, tās var apklusināt ar jauno linker_messages lint noteikumu Cargo.toml failā.

Nostabilizēts arī resolver.lockfile-path, ar ko var norādīt, kur atrodas lockfile atkarību risināšanas laikā. Tas noder, kad pirmkoda mape ir tikai lasāma un Cargo tur nedrīkst rakstīt — piemēram, dažos konteinerizētos vai reproducējamos būvējumos.

Jaunās API un valodas izmaiņas

Standarta bibliotēkā nostabilizētas vairākas bitu operācijas veselajiem skaitļiem: isolate_highest_one(), isolate_lowest_one(), highest_one(), lowest_one() un bit_width(). Tās ļauj strādāt ar atsevišķiem bitiem, neizmantojot rokas maskēšanu.

Papildus:

  • Default tips priekš RepeatN iteratora;
  • Copy priekš ffi::FromBytesUntilNulError;
  • Send priekš std::fs::File uz UEFI platformas;
  • char::is_control tagad izsaucams const kontekstā.

Valodas pusē expr_2021 makro fragmenta specifikators nostabilizēts visos izdevumos. Kompilators pievieno pēc noklusējuma izslēgtu dead_code_pub_in_binary lint, kas norāda uz neizmantotiem pub elementiem binārajos krateros — tur publiskā redzamība neko nedod. Tāpat tipi Result<T, Uninhabited> un ControlFlow<Uninhabited, T> tagad must_use pārbaudē tiek uzskatīti par vienādiem ar T.

Ko darīt pirms jaunināšanas

Ja projekts paļaujas uz atkļūdotāju vai profilatoru, vispirms pārliecinies, ka tā versija saprot v0 simbolus. gdb to atbalsta jau vairākus laidienus, taču vecākas iepakotās versijas dažās distribūcijās var atpalikt. Tas pats attiecas uz perf, valgrind un komandām, kas simbolu atšifrēšanai lieto rustfilt — pārbaudi, ka rīki ir svaigā versijā, pirms paļaujies uz to izvadi ražošanas atkļūdošanā.

CI konveijeros vērts nomainīt RUSTFLAGS=-Dwarnings pret ierakstu Cargo.toml failā. Sadaļā [build] pievieno warnings = "deny"; lokāli to var pārrakstīt ar CARGO_BUILD_WARNINGS=warn, ja nevēlies, ka brīdinājums pārtrauc būvējumu izstrādes laikā. Tā kešs paliek viens un tas pats abās vidēs. Jaunināt var ar rustup update stable, un iepriekšējo uzvedību joprojām dabū ar rustup default 1.96, ja kāds rīks vēl nav gatavs v0.

Simbolu shēmas maiņa neietekmē skrējuma ātrumu un neprasa koda izmaiņas — tā maina tikai to, kas ierakstīts binārā faila simbolu tabulā. Lielākajai daļai projektu jauninājums paies nemanāmi. Sāpes jutīs tie, kam atkļūdošanas un profilēšanas ķēde balstās uz vecākiem rīkiem vai pašu rakstītiem skriptiem, kas simbolu virknes parsē tieši.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie