Uszkodzenie pamięci

Uszkodzenie pamięci występuje w programie komputerowym , gdy zawartość lokalizacji pamięci jest modyfikowana z powodu zachowania programistycznego, które wykracza poza intencje oryginalnego programisty lub konstrukcji programu/języka; jest to określane jako naruszenie bezpieczeństwa pamięci . Najbardziej prawdopodobnymi przyczynami uszkodzenia pamięci są błędy programistyczne (błędy oprogramowania). Kiedy uszkodzona zawartość pamięci jest później używana w tym programie, prowadzi to albo do awarii programu, albo do dziwnego i dziwacznego zachowania programu. Prawie 10% awarii aplikacji w systemach Windows wynika z uszkodzenie sterty.

Nowoczesne języki programowania, takie jak C i C++, mają zaawansowane funkcje jawnego zarządzania pamięcią i arytmetyki wskaźników . Funkcje te są przeznaczone do tworzenia wydajnych aplikacji i oprogramowania systemowego. Jednak nieprawidłowe korzystanie z tych funkcji może prowadzić do błędów związanych z uszkodzeniem pamięci.

Uszkodzenie pamięci jest jedną z najtrudniejszych do usunięcia klas błędów programistycznych z dwóch powodów:

  1. Źródło uszkodzenia pamięci i jego przejawy mogą być daleko od siebie, co utrudnia powiązanie przyczyny i skutku.
  2. Objawy pojawiają się w nietypowych warunkach, co utrudnia konsekwentne odtworzenie błędu.

Błędy uszkodzenia pamięci można ogólnie podzielić na cztery kategorie:

  1. Korzystanie z niezainicjowanej pamięci : zawartość niezainicjowanej pamięci jest traktowana jako wartości śmieci. Używanie takich wartości może prowadzić do nieprzewidywalnego zachowania programu.
  2. Korzystanie z pamięci niebędącej własnością: Powszechne jest używanie wskaźników do uzyskiwania dostępu do pamięci i modyfikowania jej. Jeśli taki wskaźnik jest wskaźnikiem zerowym, zwisającym wskaźnikiem (wskazującym na pamięć, która została już zwolniona) lub na lokalizację pamięci poza bieżącym stosem lub granicami sterty , odnosi się do pamięci, która nie jest wówczas posiadana przez program. Używanie takich wskaźników jest poważną wadą programistyczną. Dostęp do takiej pamięci zwykle powoduje wyjątki systemu operacyjnego, które najczęściej prowadzą do awarii programu (chyba że używane jest odpowiednie oprogramowanie chroniące pamięć).
  3. Używanie pamięci poza przydzieloną pamięcią ( przepełnienie bufora ): Jeśli tablica jest używana w pętli z nieprawidłowym warunkiem zakończenia, pamięć poza granicami tablicy może zostać przypadkowo zmanipulowana. Przepełnienie bufora to jedna z najczęstszych luk programistycznych wykorzystywanych przez wirusy komputerowe, powodująca poważne problemy z bezpieczeństwem komputera (np. atak typu return-to-libc , ochrona przed zniszczeniem stosu ) w powszechnie używanych programach. W niektórych przypadkach programy mogą również niepoprawnie uzyskiwać dostęp do pamięci przed rozpoczęciem bufora.
  4. Wadliwe zarządzanie pamięcią sterty: Wycieki pamięci i zwalnianie pamięci innej niż sterta lub nieprzydzielonej to najczęstsze błędy spowodowane wadliwym zarządzaniem pamięcią sterty.

Wiele debuggerów pamięci, takich jak Purify , Valgrind , Insure++ , Parasoft C/C++test , AddressSanitizer jest dostępnych do wykrywania błędów uszkodzenia pamięci.

Zobacz też

  1. ^ Radich, Q .; Sherer, T.; Sharkey, K.; Batchelor, D.; Kennedy'ego, JT; Mabee, D.; Coulter, D.; Michael, S. (28 kwietnia 2021). „Weryfikator aplikacji (książka kucharska dotycząca jakości aplikacji systemów Windows 7 i Windows Server 2008 R2) — aplikacje Win32” . Microsoft Developer Network . Źródło 2022-02-09 .

Linki zewnętrzne

[1]