Поделиться через


Предупреждение 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 в собственных функциях. Явный приведение к типу разложенного указателя предотвращает предупреждение, но не предотвращает ошибку кода.