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, useowner<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