Advertencia C26485

Expresión 'array-name': no hay ninguna matriz para el descomposición del puntero (bounds.3).

Comentarios

Al igual que C26481, esta comprobación ayuda a aplicar la regla C++ Core GuidelinesI.13: No pasar una matriz como un único puntero. La regla detecta los lugares en los que se pierde la información del tipo de matriz estática por la degradación a un puntero básico. Los zstring tipos y czstring no se excluyen.

Las advertencias C26481 y C26485 proceden de las reglas de perfil de seguridad de límites. Estas reglas se implementaron en la primera versión del comprobador de C++ Core Guidelines. Son aplicables a la categoría de punteros básicos, ya que ayudan a evitar el uso no seguro de estos punteros.

Ejemplo

Este ejemplo tiene como resultado dos advertencias sobre la degradación de matriz a puntero en la llamada a 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;
}

Para solucionar este problema, evite las llamadas que toman parámetros de puntero, pero que no administran la información de límites. El uso de estas funciones suele ser propenso a errores. Es mejor usar las llamadas de la biblioteca estándar de C++ a las funciones de la biblioteca en tiempo de ejecución de C. Considere la posibilidad de usar gsl::span o std::vector en sus propias funciones. Una conversión explícita al tipo de puntero degradado impide la advertencia, pero no impide el código con errores.