Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O parâmetro «parâmetro» é uma referência a um ponteiro único e nunca é reatribuído ou reposto, utilizado
T*ouT&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
releaseouresetacessar o ponteiro exclusivo é ingênua. Detetamos apenas chamadas para operadores de atribuição e para funções nomeadasreset(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 detetastd::swap, ou qualquer não-funçãoconstespecial 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);
}