Partilhar via


Aviso C26400

Não atribua o resultado de uma alocação ou uma chamada de função com um owner<T> valor de retorno a um ponteiro bruto, use owner<T> em vez disso (i.11)

Observações

Esta verificação ajuda a impor a *regra I.11: Nunca transferir a propriedade por um ponteiro bruto (T*), que é um subconjunto da regra R.3: Um ponteiro bruto (um T*) não é proprietário. Especificamente, ele avisa em qualquer chamada para operator new, que salva seu resultado em uma variável do tipo ponteiro bruto. Ele também avisa em chamadas para funções que retornam gsl::owner<T> se seus resultados forem atribuídos a ponteiros brutos. A ideia é que você deve declarar claramente a propriedade dos recursos de memória. Para obter mais informações, consulte as Diretrizes principais do C++.

A maneira mais fácil de corrigir esse aviso é usar auto a declaração se o recurso for atribuído imediatamente na declaração da variável. Se essa correção não for possível, sugerimos que você use o tipo gsl::owner<T>. As auto declarações inicializadas com operador new são "proprietários" porque assumimos que o resultado de qualquer alocação é implicitamente um ponteiro proprietário. Transferimos este pressuposto para a variável e tratamo-la auto como owner<T>.

Se essa verificação sinalizar uma chamada para uma função que retorna owner<T>, pode ser uma indicação de um bug legítimo no código. Basicamente, aponta para um lugar onde o código vaza uma noção explícita de propriedade (e talvez o próprio recurso).

Atualmente, esta regra verifica apenas variáveis locais. Se você atribuir uma alocação a um parâmetro formal, variável global, membro da classe e assim por diante, ela não será sinalizada. Está prevista uma cobertura adequada de tais cenários para trabalhos futuros.

Nome da análise de código: NO_RAW_POINTER_ASSIGNMENT

Exemplo 1: Atribuição simples

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

Exemplo 2: Atribuição simples (fixada com gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

Exemplo 3: Atribuição simples (fixada com auto)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK