Rust 1.81 թողարկում. Rust Core ինտեգրման խոչընդոտներ Linux

Հրապարակվել է Rust 1.81 ընդհանուր նշանակության ծրագրավորման լեզվի թողարկումը, որը հիմնադրվել է Mozilla նախագծի կողմից, սակայն այժմ մշակվել է Rust Foundation անկախ ոչ առևտրային կազմակերպության հովանու ներքո: Լեզուն կենտրոնանում է հիշողության անվտանգության վրա և ապահովում է աշխատանքի բարձր զուգահեռականության հասնելու միջոցներ՝ միաժամանակ խուսափելով աղբահանող սարքից և գործարկման ժամանակից (աշխատանքի ժամանակը կրճատվում է մինչև ստանդարտ գրադարանի հիմնական սկզբնավորումը և պահպանումը):

Rust-ի հիշողության մշակման մեթոդները ծրագրավորողին փրկում են ցուցիչները մանիպուլյացիայի ժամանակ սխալներից և պաշտպանում են խնդիրներից, որոնք առաջանում են ցածր մակարդակի հիշողության հետ աշխատելու պատճառով, ինչպիսիք են հիշողության տարածք մուտք գործելը այն ազատվելուց հետո, չվերաբերվող ցուցիչները, բուֆերի գերակատարումները և այլն: Գրադարաններ բաշխելու, կառուցումներ տրամադրելու և կախվածությունները կառավարելու համար նախագիծը մշակում է Cargo փաթեթի կառավարիչը: Crates.io պահոցն աջակցվում է գրադարանների հոսթինգի համար:

Հիշողության անվտանգությունն ապահովվում է Rust-ում կոմպիլյացիայի ժամանակ՝ հղումների ստուգման, օբյեկտի սեփականության մասին հաշվառման, օբյեկտների կյանքի ժամկետների (շրջանակների) հետևելու և կոդի կատարման ընթացքում հիշողության հասանելիության ճշգրտության գնահատման միջոցով: Rust-ը նաև ապահովում է պաշտպանություն ամբողջ թվերի արտահոսքից, պահանջում է փոփոխական արժեքների պարտադիր սկզբնավորում նախքան օգտագործումը, ստանդարտ գրադարանում ավելի լավ է լուծում սխալները, լռելյայն կիրառում է անփոփոխ հղումների և փոփոխականների հայեցակարգը, առաջարկում է ուժեղ ստատիկ մուտքագրում՝ տրամաբանական սխալները նվազագույնի հասցնելու համար:

Հիմնական նորամուծությունները.

  • Հիմնական::error::Error հատկանիշը, որը սահմանում է ցուցադրվող սխալի նկարագրությունները, կայունացվել է: Փոփոխությունը թույլ է տալիս օգտագործել սխալի մեկ հատկանիշ տարբեր գրադարաններում՝ անկախ միջավայրից, ներառյալ այն գրադարաններում, որոնք կապված չեն ստանդարտ գրադարանի հետ՝ օգտագործելով «#![no_std]» հատկանիշը:
  • Ստանդարտ գրադարանի կայուն և անկայուն տեսակավորման գործառույթները տեղափոխվել են նոր ալգորիթմներ օգտագործելու համար, որոնք ցույց են տալիս ավելի բարձր արագություն և ավելի կարճ կոմպիլյացիայի ժամանակներ: Տեսակավորման նոր ալգորիթմների ներդրումն ապահովում է սխալ սահմանված Ord տեսակների հայտնաբերումը և սխալի (խուճապի) ելքը նման դեպքերում պատահական խմբավորված տվյալների փոխարեն:
  • The linter-ը իրականացնում է ստուգման նոր մակարդակ «ակնկալում» («#[expect(lint)]»), որը թույլ է տալիս ստուգել, ​​որ ստուգումը կատարվել է և նախազգուշացում տալ, եթե ստուգումը չի կատարվել (իրականացման սխալի կամ ստուգման անջատման պատճառով): Օրինակ՝ Clippy-ի միջոցով undocumented_unsafe_blocks ստուգումն օգտագործելու համար կոդերի բազան տեղափոխելիս կարող եք նշել «#[expect(clippy::undocumented_unsafe_blocks)]»՝ համոզվելու, որ բոլոր անապահով բլոկները փաստաթղթավորված են միգրացիայի ընթացքում: Clippy-ը նաև իրականացնում է clippy::allow_attributes և clippy::allow_attributes_without_reason ստուգումներ, որոնք հեշտացնում են «#[allow]» ատրիբուտները «#[expect(lint)]-ով փոխարինելը։
  • Ներդրվել է մատիտի մակարդակի փոփոխման պատճառը փաստագրելու հնարավորությունը, որը նոր մշակողներին տրամադրում է տեղեկատվություն որոշակի ստուգում ավելացնելու պատճառների մասին, որը ցուցադրվում է որպես կոմպիլյատորի հաղորդագրություն: Օրինակ՝ #![մերժել(clippy::float_arithmetic, reason = «չկա ապարատային float աջակցություն»)]
  • API-ի նոր մասը տեղափոխվել է կայուն կատեգորիա, ներառյալ մեթոդները և հատկությունների իրականացումը կայունացվել են.
    • հիմնական::սխալ
    • հուշում::assert_unchecked
    • fs::կա
    • AtomicBool::fetch_not
    • Տևողությունը՝:abs_diff
    • IoSlice::advance
    • IoSlice::advance_slices
    • IoSliceMut::advance
    • IoSliceMut::advance_slices
    • PanicHookInfo
    • PanicInfo::հաղորդագրություն
    • PanicMessage

    «const» հատկանիշը, որը որոշում է այն ցանկացած համատեքստում օգտագործելու հնարավորությունը հաստատունների փոխարեն, օգտագործվում է գործառույթներում.

    • char::from_u32_unchecked (գործառույթ)
    • char::from_u32_unchecked (մեթոդ)
    • CStr::count_bytes
    • CStr::from_ptr

    std::panic::PanicInfo տեսակը վերանվանվել է std::panic::PanicHookInfo (հին անվան ֆունկցիոնալությունը պահպանվում է, բայց հաջորդ տարբերակից դրա օգտագործումը կհանգեցնի նախազգուշացման): Այս դեպքում core::panic::PanicInfo-ը կմնա այնպիսին, ինչպիսին կա, բայց կմշակվի որպես առանձին տեսակ: Տիպերի առանձնացումը թույլ կտա նրանց մեջ կիրառել տարբեր մեթոդներ, որոնք հատուկ են կատարմանը snd-ի և no_std-ի համատեքստում:

  • Անցումը C-unwind ABI-ին («արտաքին «C-unwind»») ավարտված է, որը տարբերվում է ABI-ից առանց «-unwind» վերջածանցի («արտաքին «C»»)՝ պահպանելով անվտանգ վարքագիծ, եթե ծրագրի խափանման կամ C++ ոճի բացառության պատճառով սկսված լուծարման գործընթացը հատում է ABI-ի սահմանը, երբ բացառություն է բացառության լեզվով: այլ ծրագրավորման լեզվի կոդի հետ կապված փաթեթ): Rust 1.81-ից ի վեր «արտաքին «C» ABI-ին հնարավորություն է տրվել վթարի ենթարկվել չբռնված արձակման ժամանակ:
  • Աջակցության երրորդ մակարդակն իրականացվել է i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32s հարթակների համար: -espidf, xtensa- esp2s32-espidf. Երրորդ մակարդակը ներառում է հիմնական աջակցություն, բայց առանց ավտոմատացված թեստավորման, պաշտոնական կառուցումների հրապարակման կամ ստուգելու, թե արդյոք կոդը կարելի է կառուցել:
  • Իրականացվել է loongarch64-unknown-linux-musl և arm64ec-pc-windows-msvc թիրախային հարթակների աջակցության երկրորդ մակարդակը: Աջակցության երկրորդ մակարդակը ներառում է հավաքման երաշխիք:
  • Համար Linux-LoongArch հարթակի վրա գտնվող համակարգերը ապահովված են ամբողջական գործիքակազմով և պրոֆիլավորիչով։
  • Ուղղվել է std::process::Command-ի խոցելիությունը (CVE-2024-43402), որը ազդում էր միայն հարթակի վրա։ Windows և վերացնում է նախկինում շտկված BatBadBut խոցելիության շահագործման շրջանցիկ լուծումը, որը ենթադրում էր հատուկ նիշերի մշակում Command::arg և Command::args կանչերի օգտագործման ժամանակ, որոնք նախատեսված են արգումենտներ ուղղակիորեն փոխանցելու գործընթացին՝ առանց դրանք հրամանի մեկնաբանի կողմից մշակելու: Իրականում, bat և cmd սկրիպտները գործարկելիս գործարկվում էր cmd.exe գործընթացը, որն ունի իր սեփական տրամաբանությունը արգումենտները բաժանելու համար: Շրջանցումը հիմնված է այն փաստի վրա, որ Windows հեռացնում է սկզբնական բացատները և կետերը ուղիներից, այսինքն՝ «.bat.» ընդլայնմամբ ֆայլը մշակվում է որպես «.bat»:

Նաև ուշագրավ է Վեդսոն Ալմեյդա Ֆիլյոյի հեռանալը «Ռաստ»-ի նախագծի սպասարկողի պաշտոնից։ Linux, ներգրավված է միջուկի ներդրման մեջ Linux Rust լեզվի մշակման գործիքներ։ Վադսոնի հեռանալուց հետո նախագիծը դեռևս ունի երկու սպասարկող՝ Միգել Օխեդան, Rust-for--ի հեղինակը և գլխավոր մշակողը։Linux, և Ալեքս Գեյնորը՝ Python Software Foundation-ի նախկին տնօրենը, ով իր ուշադրությունը կենտրոնացրել է Rust-ի առաջխաղացման վրա: Հեռացող սպասարկողը, որը միացել է նախագծին չորս տարի առաջ, Microsoft-ի աշխատակից է և Rust լեզվով գրված EXT2 ֆայլային համակարգը ներդրող փորձարարական դրայվերի հեղինակը: Ալմեյդայի վերջին աշխատանքը կենտրոնացած է եղել Rust լեզվով ֆայլային համակարգեր մշակելու գործիքներ ստեղծելու վրա: Այս տարի Ալմեյդան ներդրում է ունեցել Rust-for- պահոցում:Linux 17 «կոմիտ» (համեմատության համար՝ Միգել Օխեդան ավելացրել է 53 «կոմիտ»)։

Հեռանալու պատճառը էներգիայի և ոգևորության պակասն է, որը մի ժամանակ առկա էր որոշակի ոչ տեխնիկական անհեթեթություններին արձագանքելու համար: Ալմեյդայի խոսքով՝ մշակողները ստիպված են մեծ էներգիա ծախսել՝ վիճելով աննշան հարցերի շուրջ, որոնք խաթարում են ավելի կարևոր ընդհանուր նպատակը: Ալմեյդան շարունակում է հավատալ, որ միջուկների ապագան հիշողության համար անվտանգ լեզուների օգտագործման մեջ է, և եթե մշակողների համայնքը Linux սա չի հասկանա, ուրեմն Linux կփոխարինվի որևէ այլ միջուկով, ինչպես եղավ Unix-ի հետ իր ժամանակին։

«Ժանգը հանուն» նախագծի կողմնակիցներըLinux անհրաժեշտության առաջ կանգնեց հաղթահարելու փորձառու, երկարամյա միջուկի մշակողների դիմադրությունը, ովքեր նոր լեզու սովորելու անհրաժեշտություն չէին տեսնում: Իր հրաժարականի նամակում Ալմեյդան որպես օրինակ է բերում Ալմեյդայի՝ Քենթ Օվերսթրիթի հետ ներկայացման ժամանակ տեղի ունեցած քննարկումը:Linux «Պահեստավորում, ֆայլային համակարգ, հիշողության կառավարում և BPF գագաթնաժողով» գիրքը նվիրված էր Rust-ի օգտագործմանը ֆայլային համակարգերի մշակման համար: Rust-ի ներդրման ջանքերը քննադատության ենթարկվեցին ext2/ext3/ext4 ֆայլային համակարգերի հեղինակ Թեդ Ցոյի կողմից, ով համեմատեց Rust-ը...Linux բոլորին ստիպելու ընդունել ժանգոտ կրոնը։

Ի պատասխան Ալմեյդայի՝ Rust կոդում օգտագործելու համար C ֆայլային համակարգի միջերեսները փաթաթելու մտադրությանը՝ Թեդ Ցոն ընդգծեց, որ նման փաթաթումը անխուսափելիորեն կհանգեցնի խնդիրների, քանի որ C միջերեսների ցանկացած փոփոխություն և վերամշակում կպահանջի Rust փաթաթան փոխել, և նա չցանկացավ ստանձնել Rust կոդի խնդիրների շտկման և Rust-ի wra վիճակի մոնիտորինգի լրացուցիչ պատասխանատվությունը: C կոդը անընդհատ զարգանում է, և եթե դրա փոփոխությունը խախտում է Rust-ի կապը, այն կխախտի այդ կապի հետ կապված բոլոր ֆայլային համակարգերը:

Թեդը նաև կարծում է, որ մոտ ապագայում Rust-ի կապակցումը կմնա երկրորդական, և որ կապակցումների հետ կապված խնդիրները միայն գլխացավանք կլինեն Rust-for- մշակողների համար։Linux, և ոչ թե միջուկային ֆայլային համակարգերի մշակողների համայնքի համար։ Նշվեց, որ ոչ բոլոր մշակողները մտադիր են սովորել Rust, և, հետևաբար, այլ կոդին ազդող փոփոխություններ կատարելուց հետո, նրանք կկարողանան թարմացնել միայն կախյալ C կոդը, բայց չեն կարողանա շտկել Rust կապակցումները, քանի որ չգիտեն Rust-ը։ SCSI ենթահամակարգի սպասարկող Ջեյմս Բոթոմլին նույնպես միացավ քննարկմանը՝ նշելով, որ որքան շատ իմաստաբանություն է կոդավորվում կապակցումների մեջ, այնքան ավելի փխրուն են դրանք դառնում համաժամեցման առումով։

Միևնույն ժամանակ, Google-ը, որը անցյալ տարի վերաշարադրեց pvmfm-ում օգտագործվող ներկառուցված ծրագիրը վիրտուալ մեքենաներ, գործարկվել է հարթակում Android, կիսվեց իր փորձով՝ աստիճանաբար ներառելով Rust կոդը C կամ C++ լեզվով գրված առկա ներկառուցված ծրագրային ապահովման մեջ: Նա ցույց տվեց, թե ինչպես կարելի է զգալիորեն բարելավել ներկառուցված ծրագրային ապահովման անվտանգությունը՝ ստեղծելով ֆունկցիոնալ առումով նույնական փոխարինող բաղադրիչներ, որոնք գրված են Rust լեզվով: Rust-ը ներդնելիս նա առաջարկեց կենտրոնանալ Rust-ի օգտագործման վրա նոր կոդի և այն կոդի համար, որը կատարում է անվտանգության համար կարևոր գործառույթներ (օրինակ՝ կոդ՝ անվստահելի աղբյուրներից ստացված արտաքին տվյալների մշակման համար): Rust-ը և C կոդը ինտեգրելու համար նա առաջարկեց օգտագործել shim-ներ, որոնք թարգմանում են Rust և C API-ների միջև կանչերը (C API-ն արտահանվում է Rust կոդում օգտագործելու համար և հակառակը), թույլ տալով աստիճանաբար վերաշարադրել API տարրերը Rust-ում:

Source: opennet.ru

Գնեք հուսալի հոստինգ DDoS պաշտպանությամբ կայքերի, VPS VDS սերվերների համար 🔥 Գնեք հուսալի կայքերի հոսթինգ՝ DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster