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_ex
element , 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) {
// ...
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla