Avvertenza C26822

Dereferenziazione di un puntatore nullo 'variable' (lifetime.1)

Osservazioni

La dereferenziazione di un puntatore Null è un problema frequente in C e C++. Il motore di analisi include diversi controlli per gestire tali problemi. Per un confronto, vedere questo post di blog. Quando il motore di analisi determina che un puntatore è Null nel punto in cui viene dereferenziato, genera l'avviso C26822. Ad esempio, il puntatore potrebbe essere assegnato nullptrin modo esplicito o la dereferenziazione potrebbe verificarsi in un ramo che stabilisce che il puntatore è Null. È anche possibile abilitare C26823 per segnalare i dereferenziazioni in cui un puntatore potrebbe essere Null. Questo controllo supporta anche le annotazioni SAL e gsl::not_null per descrivere le invarianti del codice.

Esempio

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 
} 

Per risolvere questo avviso, assicurarsi che nel codice non sia presente alcuna dereferenziazione del puntatore Null, potenzialmente aggiungendo controlli Null. Nel caso in cui il codice sia stato trovato corretto, i risultati falsi positivi possono spesso essere corretti usando gsl::not_null o annotazioni SAL. Di seguito sono riportati alcuni esempi su come usare alcune di queste annotazioni:

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