Udostępnij za pośrednictwem


Ostrzeżenie C26403

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;