Compartilhar 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 de proprietário local mantém corretamente seu recurso em 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, confira as Diretrizes Principais do C++.

Comentários

  • Atualmente, essa verificação não fornece o caminho exato que não libera o recurso. Esse comportamento poderá ser aprimorado 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 poderá descartar uma função excessivamente complicada para não bloquear a análise de código. Em geral, a complexidade das funções deve ser mantida sob algum limite razoável. Podemos considerar a adição de uma verificação de complexidade local ao módulo C++ Core Guidelines se houver uma demanda clara por ela. Essa limitação é aplicável a outras regras sensíveis ao fluxo de dados.

  • O aviso pode ser disparado 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 ausente 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;