LLVM төсөл нь C++ хэл дээр буфер аюулгүй ажиллах чадварыг хөгжүүлдэг

LLVM төслийн хөгжүүлэгчид чухал ач холбогдолтой C++ төслүүдийн аюулгүй байдлыг бэхжүүлэх, буфер хэт ихэссэнээс үүссэн алдааг арилгах арга хэрэгслийг бий болгоход чиглэсэн хэд хэдэн өөрчлөлтийг санал болгов. Энэхүү ажил нь буфертэй аюулгүй ажиллах боломжийг олгодог хөгжүүлэлтийн загвар гаргах, libc++ функцуудын стандарт номын сангийн аюулгүй байдлыг сайжруулах гэсэн хоёр чиглэлд чиглэгддэг.

C++-д санал болгож буй аюулгүй програмчлалын загвар нь нүцгэн заагчийг удирдахын оронд буфертэй ажиллахдаа стандарт номын сангаас өгсөн ангиудыг ашиглах явдал юм. Жишээлбэл, std::array, std::vector болон std::span ангиудыг ашиглахыг санал болгож байгаа бөгөөд тэдгээр нь хязгаараас гадуур хуваарилагдсан санах ойг ажиллуулах хугацааны шалгалтын хамт нэмнэ.

Clang дахь аюултай програмчлалын практикуудтай тэмцэхийн тулд "cppcoreguidelines-pro-bounds-pointer-arithmetic" тугийг ашиглах үед clang-tidy-ийн linter анхааруулгатай адил бүх заагч арифметик үйлдлүүд дээр хөрвүүлэгчийн анхааруулга өгөхийг санал болгож байна. хувилбар LLVM 16. Ийм сэрэмжлүүлгийг идэвхжүүлэхийн тулд clang-д тусдаа туг нэмж оруулах бөгөөд энэ нь анхдагчаар идэвхгүй байдаг.

libc++-д нэмэлт хатуужуулсан хамгаалалтын горимыг хэрэгжүүлэхээр төлөвлөж байгаа бөгөөд үүнийг идэвхжүүлсэн үед ажиллах үед тодорхойгүй үйлдэл хийхэд хүргэдэг зарим нөхцөл байдлыг олж авах болно. Жишээлбэл, std::span болон std::вектор ангиудад гаднах хандалтыг хянах бөгөөд энэ тохиолдолд програм гацах болно. Хөгжүүлэгчид ийм өөрчлөлтийг нэмэх нь libc++-ийг C++ стандартад нийцүүлэх болно гэж үзэж байгаа, учир нь тодорхойгүй зан үйлийн тохиолдлуудыг хэрхэн шийдвэрлэхийг номын сангийн хөгжүүлэгчид хариуцдаг бөгөөд энэ нь бусад зүйлсээс гадна тодорхойгүй зан үйлийг эвдрэл гэж тайлбарлаж болох юм. гарах програм.

libc++ дахь ажиллах цагийн шалгалтыг тус тусад нь оруулах боломжтой ангилалд хуваахаар төлөвлөж байна. Илүү төвөгтэй ажиллагаа эсвэл ABI-ийн өөрчлөлтөд хүргэдэггүй зарим санал болгож буй шалгалтууд libc++-ийн аюулгүй горимд аль хэдийн хэрэгжсэн байна.

Нэмж дурдахад, кодыг засах хэрэгсэл бэлтгэхээр төлөвлөж байгаа бөгөөд энэ нь хувьсагчдыг контейнер дээрх нүцгэн заагчаар сольж, контейнер заагчийг шууд орлуулах боломжгүй нөхцөлд (жишээлбэл, "хэрэв (массив_заагч)") өөр зохицуулагчийг ашиглах боломжийг олгоно. бүтцийг "if (span.data ()") болгож хувиргаж болно. Тохируулга нь зөвхөн локал хувьсагчид төдийгүй заагч бүхий төрлийн параметрүүдэд бас хэрэглэгдэх боломжтой.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх