Warning C26823

Dereferenziare un puntatore potenzialmente 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 potrebbe essere Null nel punto in cui viene dereferenziato, genera l'avviso C26823. Le cause comuni includono un valore restituito possibilmente Null, percorsi del flusso di controllo che si uniscono dopo che un percorso imposta il puntatore su Null o una chiamata che può modificare il puntatore tramite il relativo indirizzo. È possibile abilitare C26822 per segnalare solo i dereferenziazioni in cui il puntatore è noto per essere null. Questo controllo supporta anche le annotazioni SAL e gsl::not_null per descrivere le invarianti del codice.

Esempio

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
}

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