Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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, useowner<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