Advertência C26823

Desreferenciar um ponteiro possivelmente nulo 'variável' (lifetime.1)

Remarks

Desreferenciar um ponteiro nulo é um problema frequente em C e C++. O motor de análise inclui várias verificações para lidar com estes problemas. Para uma comparação, veja este artigo no blogue. Quando o motor de análise determina que um ponteiro pode ser nulo no ponto em que é desreferenciado, emite o aviso C26823. As causas comuns incluem um possível valor de retorno nulo, caminhos de controlo-fluxo que se fundem após um caminho definir o ponteiro como nulo, ou uma chamada que pode modificar o ponteiro através do seu endereço. Podes ativar o C26822 para reportar apenas desreferências quando o ponteiro é sabido ser nulo. Esta verificação também suporta anotações SAL e gsl::not_null para descrever invariantes do código.

Exemplo

void invalidate(int **pp);
void condition_null_dereference_invalidated(int* p)
{
    if (p)
        return;

    invalidate(&p);
    // The call above could reset the value of `p`, thus the low confidence warning.
    *p = 5; // warning: C26823
}

Para resolver este aviso, certifique-se de que não há desreferenciação de ponteiros nulos no código, potencialmente adicionando verificações de nulo. Caso o código tenha sido considerado correto, os falsos positivos podem frequentemente ser corrigidos usando gsl::not_null ou anotações SAL. Abaixo estão alguns exemplos de como usar algumas dessas anotações:

_Notnull_ int *get_my_ptr(); 
gsl::not_null<int *> get_my_ptr2(); 

void local_analysis(int *p) { 
    _Analysis_assume_(p != nullptr); 
    *p = 42; 
} 

void local_analysis2(_In_ int *p) { 
    int a = *p; 
}