Partilhar via


Aviso C26403

Redefinir ou excluir explicitamente uma owner<T> 'variável' de ponteiro (r.3)

Os ponteiros de proprietário são como ponteiros exclusivos: eles possuem um recurso exclusivamente e gerenciam a liberação do recurso ou suas transferências para outros proprietários. Essa verificação valida se um ponteiro proprietário local mantém corretamente seu recurso através de todos os caminhos de execução em uma função. Se o recurso não foi transferido para outro proprietário ou não foi liberado explicitamente, o verificador avisa e aponta para a declaração da variável de ponteiro.

Para obter mais informações, consulte as Diretrizes principais do C++.

Observações

  • Atualmente, essa verificação não fornece o caminho exato que não consegue liberar o recurso. Esse comportamento pode ser melhorado em versões futuras. Pode ser difícil encontrar o local exato para uma correção. A melhor abordagem é tentar substituir ponteiros simples em funções complexas por ponteiros exclusivos para evitar riscos.

  • A verificação pode descartar uma função excessivamente complicada para não bloquear a análise de código. De um modo geral, a complexidade das funções deve ser mantida abaixo de um limiar razoável. Podemos considerar adicionar uma verificação de complexidade local ao módulo C++ Core Guidelines se houver uma demanda clara para ele. Esta limitação é aplicável a outras regras sensíveis ao fluxo de dados.

  • O aviso pode disparar em casos claramente falsos positivos em que a memória é excluída somente após a verificação nula de um ponteiro. Esses falsos positivos são o resultado de uma limitação atual da API da ferramenta, mas ela pode ser melhorada no futuro.

Nome da análise de código: RESET_OR_DELETE_OWNER

Exemplo

Limpeza em falta durante o tratamento de erros:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;