Udostępnij za pośrednictwem


Ostrzeżenie C26437

Nie fragmentuj.

Podstawowe wytyczne dotyczące języka C++: ES.63: Nie wycinka

Język umożliwia fragmentowanie i może być postrzegany jako szczególny przypadek niebezpiecznej niejawnej rzutowania. Nawet jeśli jest to wykonywane celowo i nie prowadzi do natychmiastowych problemów, nadal jest bardzo zniechęcony. Utrudnia to zmianę kodu, wymuszając dodatkowe wymagania dotyczące powiązanych typów danych. Jest to szczególnie istotne, jeśli typy są polimorficzne lub obejmują zarządzanie zasobami.

Uwagi

Ta reguła ostrzega nie tylko o jawnych przydziałach, ale także na niejawnych fragmentowaniach. Niejawne fragmentowanie ma miejsce, gdy wynik zostanie zwrócony z bieżącej funkcji lub gdy dane zostaną przekazane do innych funkcji.

Reguła oznacza również przypadki, w których przypisanie nie obejmuje fragmentowania rzeczywistych danych (na przykład jeśli typy są puste lub nie robią żadnych niebezpiecznych manipulacji danymi). Takie ostrzeżenia powinny być nadal naprawione, aby zapobiec wszelkim niepożądanym regresjom, jeśli typy danych lub zachowania zmienią się w przyszłości.

Przykład

W następnym przykładzie kodu odczytamy id_exelement , ale obiekt wywołujący funkcji otrzyma tylko fragment obiektu:

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

Aby rozwiązać ten problem, zaktualizuj funkcję tak, aby korzystała z poprawnych typów:

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