Warnung C26823

Dereferenzierung eines möglicherweise NULL-Zeigers "variable" (lifetime.1)

Hinweise

Das Dereferenzieren eines Nullzeigers ist ein häufiges Problem in C und C++. Das Analysemodul enthält mehrere Prüfungen zur Behandlung solcher Probleme. Zum Vergleich siehe diesen Blogbeitrag. Wenn das Analysemodul feststellt, dass ein Zeiger an dem Punkt, an dem er dereferenziert wird, null sein kann, gibt es die Warnung C26823 aus. Häufige Ursachen sind ein möglicherweise NULL-Rückgabewert, Kontrollflusspfade, die zusammengeführt werden, nachdem ein Pfad den Zeiger auf NULL gesetzt hat, oder ein Aufruf, der den Zeiger über seine Adresse ändern kann. Sie können C26822 aktivieren, um nur Dereferenzierungen zu melden, bei denen der Zeiger bekanntermaßen null ist. Diese Überprüfung unterstützt auch SAL-Anmerkungen und gsl::not_null , um die Invarianten des Codes zu beschreiben.

Beispiel

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
}

Um diese Warnung zu beheben, stellen Sie sicher, dass im Code keine Dereferenzierung eines Nullzeigers vorhanden ist, z. B. durch Hinzufügen von NULL-Prüfungen. Falls der Code richtig ist, können falsch positive Ergebnisse häufig mithilfe von gsl::not_null oder SAL-Anmerkungen behoben werden. Es gibt einige Beispiele für die Verwendung einiger dieser Anmerkungen unten:

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