Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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;
}