Compartilhar via


Aviso C26459

Você chamou uma função STL '%function% com um parâmetro de ponteiro bruto na posição '%position%' que pode não ser seguro. Isso depende do chamador para verificar se os valores passados estão corretos. Considere colocar o intervalo entre gsl::span e passar como um iterador span (stl.1)

Comentários

Gravações fora do limite são uma das principais causas de vulnerabilidades de execução remota de código. Uma solução é usar estruturas de dados marcadas por limites, como gsl::span. Esse aviso identifica casos em que algoritmos STL (Biblioteca de Modelos Padrão) operam em ponteiros brutos como intervalos de saída. Ponteiros brutos não são limites verificados. Para evitar vulnerabilidades, use gsl::span em vez disso.

Nome da análise de código: NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Exemplo

O código a seguir demonstra um comportamento indefinido porque não há nenhuma verificação de limites e gravações copy_if além do armazenamento fornecido.

void f()
{
    std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
    int mydestinationArr[7] = { 10, 20, 80 };

    std::copy_if(myints.begin(), myints.end(), mydestinationArr, [](int i) { return !(i<0); }); // Warning: C26459
}

Para corrigir o aviso, use gsl::span para verificar se o intervalo de saída está marcado:

void f()
{
    std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
    int mydestinationArr[7] = { 10, 20, 80 };
    gsl::span<int> mySpan{mydestinationArr};

    std::copy_if(myints.begin(), myints.end(), mySpan.begin(), [](int i) { return !(i<0); }); // No warning
}