Compartilhar via


Aviso C26411

O parâmetro 'parâmetro' é uma referência ao ponteiro único e nunca é reatribuído ou redefinido, use T* ou T& em vez disso (r.33)

Quando você passa um ponteiro exclusivo para uma função por referência, isso implica que seu recurso pode ser liberado ou transferido dentro da função. Se a função usa seu parâmetro apenas para acessar o recurso, é seguro passar um ponteiro bruto ou uma referência. Para obter mais informações, consulte Regra R.33 das diretrizes principais do C++: use um parâmetro unique_ptr<widget& para expressar que uma função substitui o widget>.

Comentários

  • As limitações do aviso C26410 também são aplicáveis neste caso.

  • A heurística para detectar acesso release ou reset ao ponteiro exclusivo é confiável. Detectamos apenas chamadas para operadores de atribuição e para funções nomeadas reset (que não diferenciam maiúsculas de minúsculas). Obviamente, essa detecção não abrange todos os casos possíveis de modificações de ponteiro inteligente. (Por exemplo, ele não detecta std::swap ou qualquer função especial que não seja const em um ponteiro inteligente personalizado). Esperamos que esse aviso possa produzir muitos falsos positivos em tipos personalizados e, em alguns cenários, lidar com ponteiros exclusivos padrão. Esperamos melhorar a heurística à medida que implementamos mais verificações focadas em ponteiros inteligentes.

  • O fato de ponteiros inteligentes serem geralmente modelos traz uma limitação interessante. O compilador não é necessário para processar o código do modelo em modelos se ele não for usado. No código que faz uso limitado de interfaces de ponteiro inteligente, o verificador pode produzir resultados inesperados. O verificador não pode identificar corretamente a semântica do tipo de modelo, pois algumas funções podem nunca ser usadas. Para o padrão std::unique_ptr, essa limitação é atenuada reconhecendo o nome do tipo. Essa análise pode ser estendida no futuro para abranger ponteiros inteligentes mais conhecidos.

  • Expressões lambda que fazem captura implícita por referência podem levar a avisos surpreendentes sobre referências a ponteiros exclusivos. Atualmente, todos os parâmetros de referência capturados em lambdas são relatados, independentemente de serem redefinidos ou não. Uma versão futura pode estender a heurística para correlacionar campos lambda e parâmetros lambda.

Nome da análise de código: NO_REF_TO_UNIQUE_PTR

Exemplo: referência desnecessária

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}