Avviso C26437
Non filtrare.
Linee guida di base di C++: ES.63: Non filtrare
Il linguaggio consente il sezionamento e può essere considerato come un caso speciale di un cast implicito pericoloso. Anche se viene fatto intenzionalmente e non comporta problemi immediati, è ancora altamente sconsigliato. Rende il codice più difficile da modificare, forzando requisiti aggiuntivi sui tipi di dati correlati. È particolarmente vero se i tipi sono polimorfici o implicano la gestione delle risorse.
Osservazioni:
Questa regola avvisa non solo sulle assegnazioni esplicite, ma anche sul sezionamento implicito. Il sezionamento implicito si verifica quando un risultato viene restituito dalla funzione corrente o quando i dati vengono passati ad altre funzioni.
La regola contrassegna anche i casi in cui un'assegnazione non comporta il sezionamento dei dati reali, ad esempio se i tipi sono vuoti o non apportano modifiche pericolose ai dati. Tali avvisi devono comunque essere corretti per evitare eventuali regressioni indesiderate se i tipi di dati o i comportamenti cambiano in futuro.
Esempio
Nell'esempio di codice successivo si legge id_ex
, ma il chiamante della funzione otterrà solo una sezione dell'oggetto :
struct id {
int value;
};
struct id_ex : id {
int extension;
};
bool read_id(stream &s, id &v) {
id_ex tmp{};
if (!s.read(tmp.value) || !s.read(tmp.extension))
return false;
v = tmp; // C26437
return true;
}
Per risolvere il problema, aggiornare la funzione per usare i tipi corretti:
// ...
bool read_id(stream &s, id_ex &v) {
// ...