Aracılığıyla paylaş


Uyarı C26459

'%function%' adlı ve '%position%' konumunda bir ham işaretçi parametresi olan ve güvenli olmayan bir STL işlevi çağırdınız; bu, geçirilen değerlerin doğru olup olmadığını denetlemek için çağıranı kullanıyor. Aralığınızı gsl::span içinde sarmalamayı ve bir span yineleyicisi olarak geçirmeyi (stl.1) göz önünde bulundurun

Açıklamalar

Sınır dışı yazma işlemleri, uzaktan kod yürütme güvenlik açıklarının önde gelen nedenlerinden biridir. Bunun bir çözümü, gibi gsl::spansınır denetlenen veri yapılarını kullanmaktır. Bu uyarı, Standart Şablon Kitaplığı (STL) algoritmalarının çıkış aralıkları olarak ham işaretçiler üzerinde çalıştığı durumları tanımlar. Ham işaretçiler sınır denetlenmiyor. Güvenlik açıklarını önlemek için kullanın gsl::span .

Kod analizi adı: NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Örnek

Aşağıdaki kod, sağlanan depolama alanının ötesinde herhangi bir sınır denetimi ve copy_if yazma olmadığından tanımsız davranışı gösterir.

void f()
{
    std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
    int mydestinationArr[7] = { 10, 20, 80 };

    std::copy_if(myints.begin(), myints.end(), mydestinationArr, [](int i) { return !(i<0); }); // Warning: C26459
}

Uyarıyı düzeltmek için çıkış aralığının sınırların işaretli olduğundan emin olmak için kullanın gsl::span :

void f()
{
    std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
    int mydestinationArr[7] = { 10, 20, 80 };
    gsl::span<int> mySpan{mydestinationArr};

    std::copy_if(myints.begin(), myints.end(), mySpan.begin(), [](int i) { return !(i<0); }); // No warning
}