პროგრამირების სამყაროში ხშირად ვხვდებით დებატებს Rust-ისა და C/C++-ის უსაფრთხოების შესახებ. კამათი ხშირად CVE-ების (Common Vulnerabilities and Exposures) რაოდენობის შედარებით იწყება, თუმცა ეს მეთოდი ხშირად მცდარია. მიზეზი კი იმაში მდგომარეობს, თუ როგორ აღიქვამს ეს ენები მეხსიერების უსაფრთხოებას.

რა არის რეალური განსხვავება?

მეხსიერების უსაფრთხოებასთან დაკავშირებული შეცდომები C და C++-ში ხშირად „არასწორი მოხმარების“ კატეგორიას მიეკუთვნება. მაგალითად, თუ ცნობილ ბიბლიოთეკა libcurl-ის ფუნქციას არასწორ პარამეტრს გადავცემთ, პროგრამა შეიძლება ავარიულად დაიხუროს (segfault). თუმცა, ამას არავინ მიიჩნევს ბიბლიოთეკის დაუცველობად, რადგან დეველოპერები ვალდებულნი არიან, კოდი „სწორად“ დაწერონ.

C და C++-ში ასეთი ტიპის შეცდომების რაოდენობა იმდენად დიდია, რომ მათი CVE-ებად აღრიცხვა პრაქტიკულად შეუძლებელი იქნება. შესაბამისად, ამ ენებში CVE-ები ძირითადად მაშინ იქმნება, როდესაც კონკრეტული ფუნქციის გამოყენება თავისთავად არის სახიფათო.

Rust-ის მკაცრი სტანდარტები

Rust-ში სიტუაცია რადიკალურად განსხვავებულია. თუ Rust-ის ბიბლიოთეკაში არსებობს ფუნქცია, რომლის უსაფრთხოდ გამოყენება შეუძლებელია, ეს ავტომატურად ითვლება ბიბლიოთეკის შეცდომად (soundness bug). ეს ნიშნავს, რომ Rust-ის CVE-ები გაცილებით „მკაცრია“.

Rust-ის მთავარი უპირატესობა ისაა, რომ თუ დეველოპერი არ იყენებს unsafe ბლოკს, მეხსიერების უსაფრთხოება გარანტირებულია. თუ პრობლემა მაინც წარმოიქმნება, ეს ან კომპილატორის შეცდომაა, ან ბიბლიოთეკის შიდა ხარვეზი, რომელიც გამოსწორების შემდეგ ავტომატურად ხსნის საფრთხეს ყველა მომხმარებლისთვის.

დასკვნა

Rust-ის პროგრამებში CVE-ების დანახვა არ ნიშნავს, რომ ენა არ არის უსაფრთხო. პირიქით, ეს ნიშნავს, რომ Rust-ის ეკოსისტემა უფრო მკაცრად აკონტროლებს პოტენციურ საფრთხეებს. C/C++-ის შემთხვევაში კი, უსაფრთხოება დიდწილად დამოკიდებულია პროგრამისტის გამოცდილებაზე და მის მიერ „სწორი“ კოდის წერის უნარზე.