Upozornění C26485
Výraz 'array-name': Žádné pole pro rozkládající ukazatel (hranice.3).
Poznámky
Stejně jako C26481 vám tato kontrola pomůže vynutit pravidlo C++ Core Guidelines I.13: Nepředávejte pole jako jediný ukazatel. Pravidlo zjistí místa, kde dojde ke ztrátě informací o statickém typu pole z rozkladu na nezpracovaný ukazatel. Typy zstring
a czstring
typy nejsou vyloučeny.
C26481 a C26485 pocházejí z pravidel bezpečnostních profilů hranic. Tato pravidla byla implementována v první verzi nástroje C++ Core Guidelines Checker. Vztahují se na kategorii nezpracovaných ukazatelů, protože pomáhají vyhnout se nebezpečnému použití nezpracovaných ukazatelů.
Příklad
Výsledkem této ukázky jsou dvě upozornění pro matici, která se zkazí v volání 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;
}
Pokud chcete tento problém vyřešit, vyhněte se voláním, která přebírají parametry ukazatele, ale nespravují informace o hranicích. Použití těchto funkcí je často náchylné k chybám. Upřednostněte volání standardní knihovny jazyka C++ do funkcí knihovny modulu runtime jazyka C. Zvažte použití gsl::span
nebo std::vector
použití vlastních funkcí. Explicitní přetypování na rozkládající se typ ukazatele zabrání upozornění, ale nezabrání kódu chyby.