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.