Ang proyekto ng LLVM ay bumubuo ng mga tool para sa ligtas na pagtatrabaho sa mga buffer sa C++

Ang mga developer ng LLVM project ay nagmungkahi ng ilang pagbabago na naglalayong palakasin ang seguridad ng mission-critical na mga proyektong C++ at magbigay ng paraan upang maalis ang mga error na dulot ng overruns ng mga buffer. Nakatuon ang gawain sa dalawang lugar: pagbibigay ng modelo ng pag-unlad na nagbibigay-daan sa ligtas na pagtatrabaho sa mga buffer, at pagsisikap na palakasin ang seguridad ng libc++ na karaniwang library ng mga function.

Ang iminungkahing ligtas na modelo ng programming para sa C++ ay nagsasangkot ng paggamit ng mga klase na ibinigay ng karaniwang aklatan kapag nagtatrabaho sa mga buffer sa halip na manipulahin ang mga walang laman na pointer. Halimbawa, iminumungkahi na gamitin ang std::array, std::vector at std::span classes, na magdaragdag ng run-time check para sa over-allocated memory.

Upang labanan ang mga mapanganib na kasanayan sa programming sa clang, iminumungkahi na magpakita ng mga babala ng compiler para sa lahat ng mga pagpapatakbo ng pointer arithmetic, katulad ng clang-tidy linter warnings output kapag ginagamit ang flag na "cppcoreguidelines-pro-bounds-pointer-arithmetic", suporta para sa kung saan ay lalabas sa release na LLVM 16. Upang paganahin ang mga ganitong babala, isang hiwalay na bandila ang idadagdag sa clang, hindi aktibo bilang default.

Ito ay binalak na magpatupad ng opsyonal na pinahusay na mode ng proteksyon sa libc++, na, kapag pinagana, ay kukuha ng ilang sitwasyon sa runtime na humahantong sa hindi natukoy na gawi. Halimbawa, sa mga klase ng std::span at std::vector, isang out-of-bounds na memory access ang susubaybayan, at kung matukoy, ang program ay mag-crash. Naniniwala ang mga developer na ang pagdaragdag ng mga naturang pagbabago ay magpapanatili sa libc++ na sumusunod sa mga pamantayan ng C++, dahil ang pagpili kung paano haharapin ang mga kaso ng hindi natukoy na pag-uugali ay nakasalalay sa mga developer ng library, na maaaring, bukod sa iba pang mga bagay, ay itinuturing na hindi natukoy na pag-uugali bilang isang pagkabigo, na nangangailangan ng programa upang wakasan.

Ang mga runtime check sa libc++ ay binalak na hatiin sa mga kategorya na maaaring paganahin nang paisa-isa. Ang ilan sa mga iminungkahing pagsusuri, na hindi humahantong sa pagiging kumplikado ng mga operasyon o pagbabago sa ABI, ay ipinatupad na sa loob ng libc++ safe mode.

Bukod pa rito, pinlano na maghanda ng mga tool para sa pagsasaayos ng code, na nagbibigay-daan sa iyong palitan ang mga variable na may mga bare pointer na may mga container at gumamit ng mga alternatibong handler sa mga sitwasyon kung saan ang container ay hindi maaaring direktang palitan ang pointer (halimbawa, ang "if(array_pointer)" construct ay maaaring i-convert sa β€œif(span.data) ()"). Maaaring ilapat ang mga pagsasaayos hindi lamang sa mga lokal na variable, kundi pati na rin sa mga parameter ng mga uri ng pointer.

Pinagmulan: opennet.ru

Magdagdag ng komento