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