Partilhar via


Advertência C26411

O parâmetro «parâmetro» é uma referência a um ponteiro único e nunca é reatribuído ou reposto, utilizado T* ou T& substituído (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 C++ Core Guidelines rule R.33: Take a unique_ptr<widget>& parameter para expressar que uma função recoloca o widget.

Observações

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

  • A heurística para detetar release ou reset acessar o ponteiro exclusivo é ingênua. Detetamos apenas chamadas para operadores de atribuição e para funções nomeadas reset (sem distinção entre maiúsculas e minúsculas). Obviamente, essa deteção não cobre todos os casos possíveis de modificações de ponteiro inteligente. (Por exemplo, ele não deteta std::swap, ou qualquer não-funçãoconst especial 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 que ponteiros inteligentes são muitas vezes modelos traz uma limitação interessante. O compilador não é obrigado a 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, porque algumas funções podem nunca ser usadas. Para a norma std::unique_ptr, essa limitação é atenuada pelo reconhecimento do nome do tipo. Esta análise pode ser alargada 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);
}