Aviso C26822

Desreferenciar um ponteiro nulo 'variable' (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 é nulo no ponto onde é desreferenciado, emite o aviso C26822. Por exemplo, o ponteiro pode ser explicitamente atribuído nullptr, ou a desreferência pode ocorrer num ramo que estabelece que o ponteiro é nulo. Também pode ativar o C26823 para reportar desreferências onde um ponteiro possa ser nulo. Esta verificação também suporta anotações SAL e gsl::not_null para descrever invariantes do código.

Exemplo

void f(int *p) { 
    if (p == nullptr) 
        *p = 42; // warning: C26822
} 

void assign_to_gsl_notnull() { 
    int* p = nullptr; 
    auto q = gsl::make_not_null(p); // C26822 warning 
} 

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; 
}