Megosztás:


Figyelmeztetés C26437

Ne szeletelje.

C++ alapvető irányelvek: ES.63: Ne szeletelje

A nyelv lehetővé teszi a szeletelést , és egy veszélyes implicit szereposztás különleges eseteként tekinthető meg. Még ha szándékosan teszik is, és nem okoz azonnal problémákat, akkor is erősen nem ajánlott. Ez megnehezíti a kód módosítását azáltal, hogy további követelményeket kényszerít a kapcsolódó adattípusokra. Különösen igaz, ha a típusok polimorfikusak, vagy erőforrás-kezelést igényelnek.

Megjegyzések

Ez a szabály nem csak explicit hozzárendelésekre, hanem implicit szeletelésre is figyelmeztet. Implicit szeletelés akkor történik, ha a rendszer visszaad egy eredményt az aktuális függvényből, vagy amikor adatokat ad át más függvények számára.

A szabály megjelöli azokat az eseteket is, amikor a hozzárendelés nem jár valós adatszűréssel (például ha a típusok üresek, vagy nem okoznak veszélyes adatmanipulációt). Ezeket a figyelmeztetéseket továbbra is ki kell javítani, hogy megakadályozzák a nemkívánatos regressziókat, ha az adattípusok vagy viselkedések a jövőben megváltoznak.

példa

A következő kód példában elolvassuk id_ex, de a függvény hívója csak az objektum egy szeletét kapja meg:

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

A probléma megoldásához frissítse a függvényt a megfelelő típusok használatára:

// ...
bool read_id(stream &s, id_ex &v) {
// ...