Ostrzeżenie C26400
Nie przypisuj wyniku alokacji lub wywołania funkcji z wartością zwracaną
owner<T>
do nieprzetworzonego wskaźnika, użyjowner<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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla