Aviso C26485

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

Comentários

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

C26481 e C26485 vêm das regras de Perfil de Segurança de Limites. Essas regras foram implementadas na primeira versão do Verificador de Diretrizes Principais do C++. Elass 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 para o decaimento da matriz para o ponteiro 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 usem parâmetros de ponteiro, mas não gerenciam informações de limites. O uso dessas funções geralmente é propenso a erros. Prefira chamadas da biblioteca padrão do C++ para funções da biblioteca de runtime do 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 do bug.