Partilhar via


Advertência C26429

Símbolo nunca é testado para nulidade, ele pode ser marcado como gsl::not_null.

Diretrizes principais do C++: F.23: Use a not_null<T> para indicar que "null" não é um valor válido

É uma prática comum usar asserções para impor suposições sobre a validade de valores de ponteiro. O problema é que as asserções não expõem suposições através da interface (como em tipos de retorno ou parâmetros). As asserções também são mais difíceis de manter e manter em sincronia com outras alterações de código. A recomendação é usar gsl::not_null a Biblioteca de Suporte de Diretrizes para marcar recursos que nunca devem ter um valor nulo. A regra USE_NOTNULL ajuda a identificar locais que omitem verificações para nulo e, portanto, podem ser atualizados para uso gsl::not_null.

Observações

A lógica da regra requer que o código cancele a referência de uma variável de ponteiro para que uma verificação nula (ou imposição de um valor não nulo) seja justificada. Assim, os avisos são emitidos apenas se os ponteiros forem desreferenciados e nunca testados para nulo.

A implementação atual lida apenas com ponteiros simples (ou seus aliases) e não deteta ponteiros inteligentes, embora gsl::not_null também possa ser aplicada a ponteiros inteligentes.

Uma variável é marcada como verificada como nula quando é usada nos seguintes contextos:

  • como uma expressão de símbolo em uma condição de ramo, por exemplo, if (p) { ... };
  • operações lógicas não bitwise;
  • operações de comparação em que um operando é uma expressão constante que é avaliada como zero.

A regra não tem rastreamento completo de fluxo de dados. Pode produzir resultados incorretos nos casos em que são utilizadas verificações indiretas (por exemplo, quando uma variável intermédia detém um valor nulo e é posteriormente utilizada numa comparação).

Nome da análise de código: USE_NOTNULL

Exemplo

Expectativa oculta:

using client_collection = gsl::span<client*>;
// ...
void keep_alive(const connection *connection)   // C26429
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];               // C26429
        client->send_heartbeat();
        // ...
    }
}

Expectativa oculta esclarecida por gsl::not_null:

using client_collection = gsl::span<gsl::not_null<client*>>;
// ...
void keep_alive(gsl::not_null<const connection*> connection)
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];
        client->send_heartbeat();
        // ...
    }
}