| Termin | Definicja |
|---|---|
| Przepełnienie arytmetyczne | Przepełnienie arytmetyczne to błąd wynikający z próby zapisania wartości przekraczającej zakres danego typu danych. Na czym polega przepełnienie arytmetycznePrzepełnienie arytmetyczne, nazywane także overflow, występuje wtedy, gdy wynik działania matematycznego nie mieści się w zakresie wartości przewidzianym dla użytego typu danych. Każda zmienna liczbowa ma określoną reprezentację w pamięci, a liczba dostępnych bitów ogranicza zbiór wartości, które można zapisać. Jeżeli program próbuje umieścić poza tym zakresem wynik dodawania, odejmowania, mnożenia, potęgowania lub innego obliczenia, pojawia się ryzyko uzyskania wartości nieprawidłowej, wyjątku albo nieoczekiwanego zachowania aplikacji. Zakres zależy od rodzaju liczby. Dla typowej 8-bitowej liczby całkowitej bez znaku możliwe są wartości od 0 do 255, natomiast dla 8-bitowej liczby ze znakiem, zapisanej w kodzie uzupełnień do dwóch, zakres wynosi od -128 do 127. Analogiczna zasada dotyczy większych typów, takich jak 16-bitowy, 32-bitowy i 64-bitowy integer. Sam procesor wykonuje operację na określonej liczbie bitów, dlatego program musi kontrolować, czy rezultat może zostać bezpiecznie zapisany w wybranym typie. Różnica między overflow liczb całkowitych i zmiennoprzecinkowychW przypadku liczb całkowitych przepełnienie może zmienić wynik na wartość pozornie niezwiązaną z działaniem. Przykładowo, zwiększenie maksymalnej wartości typu bez znaku o jeden może spowodować powrót do zera, jeśli obliczenie odbywa się w arytmetyce modulo 2 do potęgi równej liczbie bitów. Dla liczb ze znakiem rezultat przekraczający dodatni zakres może zostać zinterpretowany jako liczba ujemna, zostać odrzucony przez środowisko uruchomieniowe albo doprowadzić do błędu zależnego od języka programowania i jego reguł. Liczby zmiennoprzecinkowe mają inną reprezentację, opartą między innymi na znaku, wykładniku i części znaczącej. Gdy obliczenie przekracza największą wartość możliwą do przedstawienia w danym formacie, wynik może przyjąć wartość nieskończoności dodatniej lub ujemnej, często oznaczaną jako Infinity albo -Infinity. Nie należy utożsamiać tego z utratą precyzji przy bardzo małych liczbach, która prowadzi do underflow. Osobnym przypadkiem jest również NaN, czyli wartość oznaczająca wynik niebędący liczbą, na przykład powstały po niedozwolonej operacji zmiennoprzecinkowej. Jak błąd wpływa na działanie programuSkutki przepełnienia zależą od miejsca, w którym wystąpiło, oraz od sposobu obsługi błędów. W prostym kalkulatorze może pojawić się tylko nieprawidłowa liczba. W aplikacji przetwarzającej rozmiary plików, liczniki, indeksy tablic, daty lub wartości finansowe przepełnienie może spowodować błędne alokowanie pamięci, pominięcie rekordu, wyjście poza zakres tablicy albo niepoprawne wyliczenie należności. Szczególnie niebezpieczna jest sytuacja, w której błędny wynik zostaje zaakceptowany jako prawidłowy i zapisany bez ostrzeżenia. Problem może również wystąpić przed przypisaniem rezultatu do zmiennej. Jeżeli dwa operandy mają mały typ całkowity, procesor lub kompilator może wykonać działanie w tym właśnie zakresie, a dopiero później przekonwertować wynik do większego typu. Zapisanie rezultatu w zmiennej 64-bitowej nie naprawi więc przepełnienia, które nastąpiło podczas wcześniejszego obliczenia 32-bitowego. Podczas analizy należy sprawdzić typy wszystkich operandów, kolejność konwersji, zakres danych wejściowych oraz to, czy komunikat błędu pochodzi z programu, biblioteki, kompilatora czy systemu operacyjnego. Wykrywanie i ograniczanie ryzyka na komputerzePodstawową metodą zapobiegania jest sprawdzenie zakresu przed wykonaniem operacji oraz dobranie typu danych zdolnego przechować spodziewane wartości. Przy dodawaniu można zweryfikować, czy pierwszy operand nie przekracza maksymalnej wartości pomniejszonej o drugi operand. Przy mnożeniu konieczne jest uwzględnienie obu czynników i sprawdzenie, czy ich iloczyn mieści się w granicach typu. W praktycznych programach stosuje się także bezpieczne funkcje arytmetyczne, większe typy liczbowe, kontrolowane konwersje oraz testy dla wartości skrajnych, zerowych i ujemnych. Diagnostyka problemu powinna obejmować odtworzenie działania na konkretnych danych, zapis wartości przed i po każdej operacji oraz sprawdzenie logów aplikacji. Pomocne są ostrzeżenia kompilatora, testy jednostkowe, analiza statyczna i uruchamianie programu z mechanizmami wykrywającymi błędy pamięci lub niedozwolone operacje arytmetyczne. W środowisku użytkownika warto ustalić, czy błąd pojawia się tylko przy określonym pliku, formularzu, imporcie danych albo czasie działania programu. Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, dlatego może przeprowadzić diagnostykę sprzętu oraz oprogramowania, gdy przepełnienie arytmetyczne jest objawem szerszych problemów z działaniem komputera. |