Bajt ochronny
Bajt ochronny [ potrzebne źródło ] to część pamięci programu komputerowego , która pomaga programistom znaleźć przepełnienie bufora podczas opracowywania programu.
Zasada
Kiedy program jest kompilowany do debugowania , wszystkie alokacje pamięci są poprzedzone i zakończone bajtami ochronnymi. Specjalne procedury alokacji pamięci mogą następnie wykonywać dodatkowe zadania w celu określenia niepożądanych prób odczytu i zapisu poza przydzieloną pamięcią. Te dodatkowe bajty pomagają wykryć, że program zapisuje (lub nawet odczytuje) nieodpowiednie obszary pamięci, potencjalnie powodując przepełnienie bufora . W przypadku dostępu do tych bajtów przez algorytm programu, programista jest ostrzegany informacją ułatwiającą zlokalizowanie problemu.
Sprawdzenie niewłaściwego dostępu do bajtów ochronnych może odbywać się na dwa sposoby:
- przez ustawienie punktu przerwania pamięci na warunek zapisu i/lub odczytu tych bajtów, lub
- poprzez wstępne zainicjowanie bajtów ochronnych z określonymi wartościami i sprawdzenie wartości po zwolnieniu alokacji.
Pierwszy sposób jest możliwy tylko z debuggerem , który obsługuje takie punkty przerwania, ale znacznie zwiększa szansę na zlokalizowanie problemu. Drugi sposób nie wymaga żadnych debuggerów ani specjalnych środowisk i można go wykonać nawet na innych komputerach, ale programista jest ostrzegany o przepełnieniu dopiero po zwolnieniu alokacji, co czasami następuje dość późno.
Ponieważ bajty ochronne wymagają wykonania dodatkowego kodu i przydzielenia dodatkowej pamięci, są używane tylko wtedy, gdy program jest kompilowany do debugowania. Po skompilowaniu jako wydanie , bajty ochronne nie są w ogóle używane, ani procedury z nimi współpracujące.
Przykład
Programista chce przydzielić bufor 100 bajtów pamięci podczas debugowania. Procedura alokacji pamięci systemowej zamiast tego przydzieli 108 bajtów, dodając 4 początkowe i 4 końcowe bajty ochronne i zwróci wskaźnik przesunięty o 4 początkowe bajty ochronne w prawo, ukrywając je przed programistą . Programista powinien wówczas pracować z otrzymanym wskaźnikiem bez wiedzy o obecności bajtów ochronnych.
Jeśli algorytm programisty zapisze tuż poza przydzieloną przestrzenią, nadpisze bajty ochronne. Później, po zwolnieniu przydziału, procedura zwalniająca sprawdzi, czy bajty ochronne zostały zmodyfikowane iw razie potrzeby zgłosi błąd.
Problemy
Procedury alokacji pamięci wypełniają bajty ochronne wartościami, które nie powinny być używane przez algorytmy programisty. Nie jest to jednak do przewidzenia. Kiedy algorytm używa tych wartości i nadpisuje nimi bajty ochronne (istotny jest tylko ostatni zapis przed cofnięciem alokacji), nie można wykryć przepełnienia, ponieważ bajty w rzeczywistości się nie zmieniły. Zamiast tego można użyć opcji punktu przerwania pamięci, ustawionej pod warunkiem dostępu do tych bajtów w debuggerze.