Aviso C26822

Desreferenciando uma variável 'variável' de ponteiro nulo (lifetime.1)

Comentários

Desreferenciar um ponteiro nulo é um problema frequente em C e C++. O mecanismo de análise inclui várias verificações para lidar com esses problemas. Para obter uma comparação, consulte esta postagem no blog. Quando o mecanismo de análise determina que um ponteiro é nulo no ponto em que é desreferenciado, ele emite o aviso C26822. Por exemplo, o ponteiro pode ser atribuído nullptrexplicitamente ou a desreferência pode ocorrer em um branch que estabelece que o ponteiro é nulo. Você também pode habilitar o C26823 para relatar desreferências em que um ponteiro pode ser nulo. Essa verificação também dá suporte a anotações de 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 esse aviso, verifique se não há nenhuma desreferência de ponteiro nulo no código, potencialmente adicionando verificações nulas. Caso o código seja considerado correto, os achados de falso positivo geralmente poderão ser corrigidos usando gsl::not_null ou anotações SAL. Há alguns exemplos de como usar algumas dessas anotações abaixo:

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