Предупреждение C26485
Выражение "array-name": нет массива для распада указателя (bounds.3).
Замечания
Как и C26481, эта проверка помогает применить правило основных рекомендаций C++I.13: не передавать массив в виде одного указателя. Правило обнаруживает места, в которых сведения о типе статического массива теряются от распада до необработанного указателя. zstring
Типы и czstring
типы не исключаются.
C26481 и C26485 приходят из правил профиля безопасности Границ. Эти правила были реализованы в первом выпуске средства проверки основных рекомендаций C++ . Они применимы к категории необработанных указателей, так как они помогают избежать небезопасного использования необработанных указателей.
Пример
Этот пример приводит к двум предупреждениям для разложения указателя массива в вызове 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;
}
Чтобы устранить эту проблему, избегайте вызовов, которые принимают параметры указателя, но не управляют сведениями о границах. Использование таких функций часто подвержено ошибкам. Предпочитайте вызовы стандартной библиотеки C++ к функциям библиотеки среды выполнения C. Рассмотрите возможность использования gsl::span
или std::vector
в собственных функциях. Явный приведение к типу разложенного указателя предотвращает предупреждение, но не предотвращает ошибку кода.