Uwaga
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.
Resetowanie lub jawne usuwanie
owner<T>
wskaźnika "zmienna" (r.3)
Wskaźniki właściciela są takie jak unikatowe wskaźniki: są właścicielami zasobu wyłącznie i zarządzają wydaniem zasobu lub jego transferami do innych właścicieli. To sprawdzenie sprawdza, czy wskaźnik właściciela lokalnego prawidłowo utrzymuje swój zasób za pośrednictwem wszystkich ścieżek wykonywania w funkcji. Jeśli zasób nie został przeniesiony do innego właściciela lub nie został jawnie wydany, kontroler ostrzega i wskazuje deklarację zmiennej wskaźnika.
Aby uzyskać więcej informacji, zobacz podstawowe wytyczne dotyczące języka C++.
Uwagi
Obecnie ta kontrola nie daje dokładnej ścieżki, która nie może zwolnić zasobu. To zachowanie może zostać ulepszone w przyszłych wersjach. Znalezienie dokładnej lokalizacji poprawki może być trudne. Lepszym rozwiązaniem jest próba zastąpienia zwykłych wskaźników w złożonych funkcjach unikatowymi wskaźnikami, aby uniknąć ryzyka.
Sprawdzanie może odrzucić zbyt skomplikowaną funkcję, aby nie blokować analizy kodu. Ogólnie rzecz biorąc, złożoność funkcji powinna być utrzymywana pod pewnym rozsądnym progiem. Możemy rozważyć dodanie lokalnego sprawdzania złożoności do modułu Podstawowe wytyczne języka C++, jeśli istnieje wyraźne zapotrzebowanie na to. To ograniczenie dotyczy innych reguł, które są wrażliwe na przepływ danych.
Ostrzeżenie może zostać wyzwolone w wyraźnie fałszywie dodatnich przypadkach, w których pamięć jest usuwana dopiero po sprawdzeniu wartości null wskaźnika. Te fałszywie dodatnie wyniki są wynikiem bieżącego ograniczenia interfejsu API narzędzia, ale może zostać ulepszone w przyszłości.
Nazwa analizy kodu: RESET_OR_DELETE_OWNER
Przykład
Brak czyszczenia podczas obsługi błędów:
gsl::owner<int*> sequence = GetRandomSequence(); // C26403
try
{
StartSimulation(sequence);
}
catch (const std::exception& e)
{
if (KnownException(e))
return; // Skipping the path which deletes the owner.
ReportException(e);
}
delete [] sequence;