Avviso C26441
Gli oggetti Guard devono essere denominati (cp.44)
Linee guida di base di C++
CP.44: ricordarsi di assegnare un lock_guard
nome a e unique_lock
Osservazioni:
La libreria standard fornisce blocchi per controllare l'accesso simultaneo alle risorse durante la durata. Quando si dichiara un oggetto lock senza un nome, il compilatore crea un oggetto temporaneo immediatamente distrutto anziché un oggetto che si trova alla fine dell'ambito di inclusione. Pertanto, l'impossibilità di assegnare un oggetto lock a una variabile è un errore che disabilita efficacemente il meccanismo di blocco (perché le variabili temporanee sono temporanee). Questa regola intercetta casi semplici di questo comportamento imprevisto.
Questa diagnostica analizza solo i tipi di std::scoped_lock
blocco standard , std::unique_lock
e std::lock_guard
. Avviso C26444 riguarda altri tipi RAII senza nome.
L'analizzatore analizza solo le semplici chiamate ai costruttori. Le espressioni di inizializzatore più complesse possono causare risultati imprecisi sotto forma di avvisi non corretti. L'analizzatore ignora i blocchi passati come argomenti alle chiamate di funzione o restituiti dalle chiamate di funzione. Non è in grado di determinare se questi blocchi tentano deliberatamente di proteggere la chiamata di funzione o se la durata deve essere estesa. Per fornire una protezione simile per i tipi restituiti da una chiamata di funzione, annotarli con [[nodiscard]]
. È anche possibile annotare i costruttori con [[nodiscard]]
per evitare oggetti senza nome di quel tipo:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
L'analizzatore ignora i blocchi creati come temporaneamente, ma assegnati a riferimenti denominati per estendere la durata.
Nome dell'analisi del codice: NO_UNNAMED_GUARDS
Esempio
In questo esempio manca il nome del blocco con ambito.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
write_line(stream, text);
}
}
Per correggere l'errore, assegnare un nome al blocco, estendendone la durata.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
write_line(stream, text);
}
}