Udostępnij za pośrednictwem


Ostrzeżenie C26411

Parametr "parameter" jest odwołaniem do unikatowego wskaźnika i nigdy nie jest ponownie przypisywany lub resetowany, należy użyć T* lub T& zamiast niego (r.33)

Po przekazaniu unikatowego wskaźnika do funkcji przy użyciu odwołania oznacza to, że jego zasób może zostać zwolniony lub przeniesiony wewnątrz funkcji. Jeśli funkcja używa swojego parametru tylko do uzyskiwania dostępu do zasobu, można bezpiecznie przekazać nieprzetworzone wskaźniki lub odwołanie. Aby uzyskać więcej informacji, zobacz C++ Core Guidelines rule R.33: Take a unique_ptr widget¶meter to express that a function reseats the widget (Reguła wytycznych podstawowych języka C++ R.33: Take a unique_ptr<widget>& parameter to express that a function reseats the widget.

Uwagi

  • Ograniczenia dotyczące ostrzeżenia C26410 mają zastosowanie również tutaj.

  • Heurystyka wykrywania release lub reset uzyskiwania dostępu do unikatowego wskaźnika jest naiwna. Wykrywamy tylko wywołania operatorów przypisania i funkcji o nazwie reset (bez uwzględniania wielkości liter). Oczywiście to wykrywanie nie obejmuje wszystkich możliwych przypadków modyfikacji inteligentnego wskaźnika. (Na przykład nie wykrywa std::swapani żadnej specjalnej funkcji innej niż wconst niestandardowym inteligentnym wskaźniku). Oczekujemy, że to ostrzeżenie może spowodować wygenerowanie wielu wyników fałszywie dodatnich dla typów niestandardowych, a w niektórych scenariuszach dotyczących standardowych unikatowych wskaźników. Spodziewamy się poprawy heurystyki, ponieważ wdrażamy więcej kontroli skoncentrowanych na inteligentnych wskaźnikach.

  • Fakt, że inteligentne wskaźniki są często szablonami, wiąże się z interesującym ograniczeniem. Kompilator nie jest wymagany do przetwarzania kodu szablonu w szablonach, jeśli nie jest używany. W kodzie, który ogranicza korzystanie z inteligentnych interfejsów wskaźnika, sprawdzanie może spowodować nieoczekiwane wyniki. Kontroler nie może prawidłowo zidentyfikować semantyki typu szablonu, ponieważ niektóre funkcje nigdy nie mogą być używane. W przypadku standardu std::unique_ptrto ograniczenie jest ograniczane przez rozpoznawanie nazwy typu. Ta analiza może zostać rozszerzona w przyszłości w celu pokrycia bardziej znanych inteligentnych wskaźników.

  • Wyrażenia lambda, które wykonują niejawne odwołania do przechwytywania po odwołaniu, mogą prowadzić do zaskakujących ostrzeżeń dotyczących odwołań do unikatowych wskaźników. Obecnie wszystkie przechwycone parametry odwołania w wyrażeniach lambda są zgłaszane, niezależnie od tego, czy są resetowane, czy nie. Przyszłe wydanie może rozszerzyć heurystyczną na skorelowane pola lambda i parametry lambda.

Nazwa analizy kodu: NO_REF_TO_UNIQUE_PTR

Przykład: niepotrzebne odwołanie

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}