Aviso C26400

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

Comentários

Essa verificação ajuda a impor a *regra I.11: Nunca transfira a propriedade por um ponteiro bruto (T*), que é um subconjunto da regra R.3: Um ponteiro bruto (um T*) não é proprietário. Especificamente, ela avisa sobre qualquer chamada para operator new, o que salva seu resultado em uma variável de tipo de ponteiro bruto. Ela também avisa sobre 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, confira as Diretrizes Principais do C++.

A maneira mais fácil de corrigir esse aviso é usar a declaração auto se o recurso for atribuído imediatamente na declaração de variável. Se essa correção não for possível, sugerimos que você use o tipo gsl::owner<T>. As declarações auto inicializadas com o operador new são "proprietárias" porque presumimos que o resultado de qualquer alocação seja implicitamente um ponteiro do proprietário. Transferimos essa suposição para a variável auto e a tratamos 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, ele aponta para um lugar onde o código vaza uma noção explícita de propriedade (e talvez o próprio recurso).

Atualmente, essa regra verifica apenas variáveis locais. Se você atribuir uma alocação a um parâmetro formal, variável global, membro de classe e assim por diante, ela não será sinalizada. A cobertura apropriada desses cenários está planejada para trabalhos futuros.

Nome da análise de código: NO_RAW_POINTER_ASSIGNMENT

Exemplo 1: Alocação simples

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

Exemplo 2: Alocação simples (corrigida com gsl::owner<T>)

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

Exemplo 3: Alocação simples (corrigida com auto)

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