Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O tipo de expressão 'expr' já
gsl::not_nullé . Não teste a nulidade (f.23)
Diretrizes do C++ Core: F.23: use um <>T para indicar que "nulo" não é um valor válido
O tipo gsl::not_null de marcador da Biblioteca de Suporte de Diretrizes é usado para indicar claramente valores que nunca são ponteiros nulos. Isso causará uma falha grave se a suposição não for válida em tempo de execução. Portanto, obviamente, não há necessidade de verificar se há null se uma expressão for avaliada como um resultado do tipo gsl::not_null.
Comentários
Como gsl::not_null ela mesma é uma classe de wrapper de ponteiro fino, a regra realmente rastreia variáveis temporárias que contêm resultados de chamadas para o operador de conversão sobrecarregado (que retorna objetos de ponteiro contidos). Essa lógica torna essa regra aplicável a expressões que envolvem variáveis e, eventualmente, têm um resultado do gsl::not_null tipo. No entanto, atualmente ele ignora expressões que contêm chamadas de função que retornam gsl::not_null.
A heurística atual para verificações nulas detecta os seguintes contextos:
- uma expressão de símbolo em uma condição de ramificação, por exemplo
if (p) { ... }; - operações lógicas não bit a bit;
- operações de comparação em que um operando é uma expressão constante que é avaliada como zero.
Nome da análise de código: DONT_TEST_NOTNULL
Exemplo
Verificações nulas desnecessárias revelam lógica questionável:
class type {
public:
template<class T> bool is() const;
template<class T> gsl::not_null<const T*> as() const;
//...
};
class alias_type : public type {
public:
gsl::not_null<const type*> get_underlying_type() const;
gsl::not_null<const type*> get_root_type() const
{
const auto ut = get_underlying_type();
if (ut) // C26431
{
const auto uat = ut->as<alias_type>();
if (uat) // C26431, also incorrect use of API!
return uat->get_root_type();
return ut;
}
return this; // Alias to nothing? Actually, dead code!
}
//...
};
Verificações nulas desnecessárias revelam lógica questionável, retrabalhada:
//...
gsl::not_null<const type*> get_root_type() const
{
const auto ut = get_underlying_type();
if (ut->is<alias_type>())
return ut->as<alias_type>()->get_root_type();
return ut;
}
//...