Partilhar via


Aviso C26485

Expressão 'array-name': Nenhuma conversão de matriz para ponteiro (bounds.3).

Observações

Como C26481, esta verificação ajuda a impor a regra I.13 das Diretrizes Principais do C++: Não passar uma matriz como um único ponteiro. A regra deteta locais onde as informações de tipo de matriz estática são perdidas ao converter para um ponteiro bruto. Os tipos zstring e czstring não são excluídos.

C26481 e C26485 vêm das regras do Perfil de Segurança de Limites . Essas regras foram implementadas na primeira versão do C++ Core Guidelines Checker. Eles são aplicáveis à categoria de ponteiros brutos, pois ajudam a evitar o uso inseguro de ponteiros brutos.

Exemplo

Este exemplo resulta em dois avisos sobre o decaimento de matrizes para ponteiros na chamada para 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 resolver esse problema, evite chamadas que usam parâmetros de ponteiro, mas não gerenciam informações de limites. O uso de tais funções é muitas vezes propenso a erros. Prefira chamadas da biblioteca padrão do C++ às funções da biblioteca de tempo de execução de C. Considere usar gsl::span ou std::vector em suas próprias funções. Uma conversão explícita para o tipo de ponteiro deteriorado impede o aviso, mas não impede o código com bugs.