Condividi tramite


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) {
// ...