Condividi tramite


Avviso C26411

Il parametro 'parameter' è un riferimento al puntatore univoco e non viene mai riassegnato o reimpostato, usare T* o T& invece (r.33)

Quando si passa un puntatore univoco a una funzione per riferimento, implica che la relativa risorsa può essere rilasciata o trasferita all'interno della funzione. Se la funzione usa il parametro solo per accedere alla risorsa, è possibile passare un puntatore non elaborato o un riferimento. Per altre informazioni, vedere C++ Core Guidelines rule R.33: Take a unique_ptr widget& parameter to express that a function reseats the widget.For more information, see C++ Core Guidelines rule R.33: Take a unique_ptr<widget>& parameter to express that a function reseats the widget.

Osservazioni:

  • Le limitazioni dell'avviso C26410 sono applicabili anche qui.

  • L'euristica da rilevare release o reset accedere al puntatore univoco è ingenuo. Vengono rilevate solo chiamate agli operatori di assegnazione e alle funzioni denominate reset (senza distinzione tra maiuscole e minuscole). Ovviamente, questo rilevamento non copre tutti i possibili casi di modifiche del puntatore intelligente. Ad esempio, non rileva std::swapo nessuna funzione specialeconst in un puntatore intelligente personalizzato. Si prevede che questo avviso generi molti falsi positivi sui tipi personalizzati e in alcuni scenari che gestiscono puntatori univoci standard. Ci aspettiamo di migliorare l'euristica man mano che implementiamo più controlli incentrati sui puntatori intelligenti.

  • Il fatto che i puntatori intelligenti sono spesso modelli comportano una limitazione interessante. Il compilatore non è necessario per elaborare il codice del modello nei modelli, se non viene usato. Nel codice che usa in modo limitato le interfacce del puntatore intelligente, il controllo può produrre risultati imprevisti. Il controllo non è in grado di identificare correttamente la semantica del tipo di modello, perché alcune funzioni potrebbero non essere mai usate. Per lo standard std::unique_ptr, questa limitazione viene attenuata riconoscendo il nome del tipo. Questa analisi potrebbe essere estesa in futuro per coprire puntatori intelligenti più noti.

  • Le espressioni lambda che eseguono acquisizioni implicite per riferimento possono causare avvisi sorprendenti sui riferimenti a puntatori univoci. Attualmente vengono segnalati tutti i parametri di riferimento acquisiti nelle espressioni lambda, indipendentemente dal fatto che vengano reimpostati o meno. Una versione futura può estendere l'euristica per correlare i campi lambda e i parametri lambda.

Nome dell'analisi del codice: NO_REF_TO_UNIQUE_PTR

Esempio: Informazioni di riferimento non necessarie

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);
}