Avviso C26403
Reimpostare o eliminare in modo esplicito un
owner<T>
puntatore 'variable' (r.3)
I puntatori proprietario sono come puntatori univoci: possiedono una risorsa esclusivamente e gestiscono il rilascio della risorsa o i relativi trasferimenti ad altri proprietari. Questo controllo verifica che un puntatore proprietario locale gestisca correttamente la risorsa tramite tutti i percorsi di esecuzione in una funzione. Se la risorsa non è stata trasferita a un altro proprietario o non è stata rilasciata in modo esplicito, il controllo avvisa e punta alla dichiarazione della variabile del puntatore.
Per altre informazioni, vedere Linee guida di base di C++.
Osservazioni:
Attualmente questo controllo non fornisce il percorso esatto che non riesce a rilasciare la risorsa. Questo comportamento può essere migliorato nelle versioni future. Potrebbe essere difficile trovare la posizione esatta per una correzione. L'approccio migliore consiste nel cercare di sostituire puntatori semplici in funzioni complesse con puntatori univoci per evitare eventuali rischi.
Il controllo può eliminare una funzione eccessivamente complessa per non bloccare l'analisi del codice. In genere, la complessità delle funzioni deve essere mantenuta al di sotto di una soglia ragionevole. È possibile prendere in considerazione l'aggiunta di un controllo della complessità locale al modulo Linee guida di base C++ se è presente una richiesta chiara. Questa limitazione è applicabile ad altre regole sensibili al flusso di dati.
L'avviso può essere generato in casi chiaramente falsi positivi in cui la memoria viene eliminata solo dopo il controllo Null di un puntatore. Questi falsi positivi sono il risultato di una limitazione corrente dell'API dello strumento, ma potrebbe essere migliorata in futuro.
Nome dell'analisi del codice: RESET_OR_DELETE_OWNER
Esempio
Pulizia mancante durante la gestione degli errori:
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;