Aracılığıyla paylaş


Uyarı C26485

'dizi-adı' ifadesi: İşaretçi bozulmasına yönelik dizi yok (sınır.3).

Açıklamalar

C26481 gibi, bu denetim de C++ Çekirdek Yönergeleri kuralı I.13: Bir diziyi tek bir işaretçi olarak geçirmeme kuralını zorunlu kılmaya yardımcı olur. Kural, statik dizi türü bilgilerinin bozulmadan ham işaretçiye kaybolduğu yerleri algılar. zstring ve czstring türleri hariç tutulmaz.

C26481 ve C26485, Sınır Güvenliği Profili kurallarından gelir. Bu kurallar C++ Çekirdek Kılavuz Denetleyicisi'nin ilk sürümünde uygulandı. Ham işaretçilerin güvenli olmamasını önlemeye yardımcı olduklarından ham işaretçiler kategorisi için geçerlidir.

Örnek

Bu örnek, çağrısında işaretçi bozulmasına yönelik dizi için iki uyarıya neden olur memcpy.

// c26485_bad.cpp
// compile using:
// set Esp.Extensions=CppCoreCheck.dll
// cl /W4 /EHsc /permissive- /analyze /analyze:plugin EspXEngine.dll /analyze:ruleset "%VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets\CppCoreCheckBoundsRules.ruleset" c26485_bad.cpp
#include <cstring>
constexpr int array_length = 10;

int main() noexcept
{
    int const from_array[array_length] = { 4, 3, 2, 1, 0, 9, 8, 7, 6, 5 };
    int to_array[array_length] = {};

    if (nullptr != memcpy(to_array, from_array, sizeof(int) * array_length))
        return 0;
    return 1;
}

Bu sorunu gidermek için, işaretçi parametrelerini alan ancak sınır bilgilerini yönetmeyen çağrılardan kaçının. Bu tür işlevlerin kullanımı genellikle hataya açıktır. C++ standart kitaplık çağrılarını C çalışma zamanı kitaplığı işlevlerine tercih edin. veya std::vector işlevlerini kendi işlevlerinizde kullanmayı gsl::span göz önünde bulundurun. Çürümüş işaretçi türüne açık bir atama uyarıyı engeller, ancak buggy kodunu engellemez.