Udostępnij za pośrednictwem


Ostrzeżenie C26400

Nie przypisuj wyniku alokacji lub wywołania funkcji z wartością zwracaną owner<T> do nieprzetworzonego wskaźnika, użyj owner<T> zamiast tego (i.11)

Uwagi

Ta kontrola pomaga wymusić regułę I.11: Nigdy nie przenosi własności przez nieprzetworzony wskaźnik (T*), który jest podzbiorem reguły R.3: nieprzetworzony wskaźnik (T*) nie jest właścicielem. W szczególności ostrzega przy każdym wywołaniu metody operator new, co zapisuje wynik w zmiennej typu nieprzetworzonego wskaźnika. Ostrzega również o wywołaniach funkcji, które zwracają gsl::owner<T> , jeśli ich wyniki są przypisane do nieprzetworzonych wskaźników. Chodzi o to, że należy wyraźnie określić własność zasobów pamięci. Aby uzyskać więcej informacji, zobacz podstawowe wytyczne dotyczące języka C++.

Najprostszym sposobem naprawienia tego ostrzeżenia jest użycie auto deklaracji, jeśli zasób jest przypisany natychmiast w deklaracji zmiennej. Jeśli ta poprawka nie jest możliwa, zalecamy użycie typu gsl::owner<T>. Deklaracje auto zainicjowane za pomocą operatora new są "właścicielami", ponieważ zakładamy, że wynik każdej alokacji jest niejawnie wskaźnikiem właściciela. Przenosimy to założenie do zmiennej auto i traktujemy ją jako owner<T>.

Jeśli ta funkcja sprawdzania flaguje wywołanie funkcji zwracającej owner<T>wartość , może to wskazywać na wiarygodną usterkę w kodzie. Zasadniczo wskazuje miejsce, w którym kod przecieka jawnie pojęcie własności (a może sam zasób).

Ta reguła sprawdza obecnie tylko zmienne lokalne. Jeśli przypiszesz alokację do parametru formalnego, zmiennej globalnej, składowej klasy itd., nie zostanie oflagowana. Odpowiednie pokrycie takich scenariuszy jest planowane na przyszłe prace.

Nazwa analizy kodu: NO_RAW_POINTER_ASSIGNMENT

Przykład 1. Prosta alokacja

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

Przykład 2. Prosta alokacja (stała z gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

Przykład 3: Prosta alokacja (stała z auto)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK