Udostępnij za pośrednictwem


Ostrzeżenie C26485

Wyrażenie "array-name": brak tablicy do rozkładu wskaźnika (granice.3).

Uwagi

Podobnie jak C26481, ta kontrola pomaga wymusić regułę wytycznych podstawowych języka C++ I.13: Nie przekazuj tablicy jako pojedynczego wskaźnika. Reguła wykrywa miejsca, w których informacje o typie tablicy statycznej są tracone z rozkładu do nieprzetworzonego wskaźnika. Typy zstring i czstring nie są wykluczone.

C26481 i C26485 pochodzą z reguł profilu bezpieczeństwa granic. Te reguły zostały zaimplementowane w pierwszej wersji podstawowego narzędzia do sprawdzania wytycznych dotyczących języka C++. Mają zastosowanie do kategorii nieprzetworzonych wskaźników, ponieważ pomagają uniknąć niebezpiecznego używania nieprzetworzonych wskaźników.

Przykład

W tym przykładzie są wyświetlane dwa ostrzeżenia dotyczące rozkładu tablicy w wywołaniu metody 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;
}

Aby rozwiązać ten problem, unikaj wywołań, które przyjmują parametry wskaźnika, ale nie zarządzaj informacjami o granicach. Korzystanie z takich funkcji jest często podatne na błędy. Preferuj standardowe wywołania biblioteki języka C++ do funkcji biblioteki środowiska uruchomieniowego języka C. Rozważ użycie gsl::span funkcji lub std::vector we własnych funkcjach. Jawne rzutowanie do rozkładanego typu wskaźnika uniemożliwia ostrzeżenie, ale nie zapobiega kodowi usterek.