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
}