Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dereferencja potencjalnie pustego wskaźnika "variable" (lifetime.1)
Uwagi
Dereferencja wskaźnika NULL jest częstym problemem w językach C i C++. Silnik analizy obejmuje kilka sprawdzeń, aby poradzić sobie z takimi problemami. Aby zapoznać się z porównaniem, zobacz ten wpis w blogu. Gdy silnik analizy ustali, że wskaźnik może mieć wartość null w punkcie, w którym jest dereferencjonowany, emituje ostrzeżenie C26823. Typowe przyczyny obejmują wartość zwracaną mogącą mieć wartość null, ścieżki przepływu sterowania, które łączą się po tym, jak jedna ze ścieżek ustawi wskaźnik na wartość null, lub wywołanie, które może modyfikować wskaźnik za pośrednictwem jego adresu. Można włączyć funkcję C26822, aby zgłaszać tylko dereferencje, w których wskaźnik ma znaną wartość null. Ta kontrola obsługuje również adnotacje SAL oraz gsl::not_null do opisywania niezmienników kodu.
Przykład
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
}
Aby rozwiązać to ostrzeżenie, upewnij się, że w kodzie nie ma dereferencji wskaźnika null, potencjalnie przez dodanie sprawdzeń wartości null. Jeśli kod okazał się poprawny, fałszywe alarmy często można wyeliminować za pomocą gsl::not_null lub adnotacji SAL. Poniżej przedstawiono kilka przykładów użycia niektórych adnotacji:
_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;
}