Sdílet prostřednictvím


Upozornění C26437

Neprokrývejte.

C++ Core Guidelines: ES.63: Nevykrývejte řez

Jazyk umožňuje řezy a lze je považovat za zvláštní případ nebezpečného implicitního přetypování . I když se to dělá záměrně a nemá vést k okamžitým problémům, je stále důrazně nedoporučujeme. Znesnadňuje změnu kódu vynucením dodatečných požadavků na související datové typy. Platí to zejména v případě, že typy jsou polymorfní nebo zahrnují správu prostředků.

Poznámky

Toto pravidlo upozorňuje nejen na explicitní přiřazení, ale také na implicitní řezy. K implicitní dělení dochází, když se výsledek vrátí z aktuální funkce nebo když se data předají jiným funkcím.

Pravidlo také označí případy, kdy přiřazení neobsahuje skutečné řezy dat (například pokud jsou typy prázdné nebo neprovádí žádné nebezpečné manipulace s daty). Tato upozornění by měla být stále opravena, aby se zabránilo nežádoucím regresím, pokud se datové typy nebo chování v budoucnu změní.

Příklad

V dalším příkladu kódu čteme id_ex, ale volající funkce získá jen řez objektu:

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

Pokud chcete tento problém vyřešit, aktualizujte funkci tak, aby používala správné typy:

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