Całkowitą przepełnienie - Integer overflow

Przepełnienie liczby całkowitej można wykazać za pomocą przepełnienia licznika kilometrów , mechanicznej wersji tego zjawiska. Wszystkie cyfry ustawione są na maksymalnie 9, a kolejny przyrost białej cyfry powoduje kaskadę przeniesień, ustawiając wszystkie cyfry na 0, ale żadna wyższa cyfra (cyfra 1.000.000s) nie zmienia się na 1, więc licznik resetuje się do zera. Jest to zawijanie w przeciwieństwie do nasycania .

W programowania An przelewowy całkowitą występuje gdy arytmetyczne próby działania w celu utworzenia wartości numerycznej, która jest poza zakresem, który może być przedstawiony przy danej liczby cyfr - albo wyższe niż maksimum lub mniejsza niż minimalna wartość przedstawienie.

Najczęstszym wynikiem przepełnienia jest przechowywanie najmniej znaczących możliwych do przedstawienia cyfr wyniku; mówi się, że wynik owija się wokół maksimum (tj. modulo moc podstawy , zwykle dwa w nowoczesnych komputerach, ale czasami dziesięć lub inne podstawy).

Stan przepełnienia może dawać wyniki prowadzące do niezamierzonego zachowania. W szczególności, jeśli nie przewidziano takiej możliwości, przepełnienie może zagrozić niezawodności i bezpieczeństwu programu .

W przypadku niektórych aplikacji, takich jak czasomierze i zegary, pożądane może być zawijanie przy przepełnieniu. Standard C11 stwierdza, że ​​dla liczb całkowitych bez znaku zawijanie modulo jest zdefiniowanym zachowaniem, a termin przepełnienie nigdy nie ma zastosowania: „obliczenia obejmujące operandy bez znaku nigdy nie mogą się przepełnić”.

Na niektórych procesorach, takich jak procesory graficzne (GPU) i procesory sygnału cyfrowego (DSP), które obsługują arytmetykę nasycenia , przepełnione wyniki byłyby „zaciśnięte”, tj. ustawione na minimalną lub maksymalną wartość w możliwym do przedstawienia zakresie, a nie zawinięte.

Początek

Szerokości rejestru procesora określa się zakres wartości, które mogą być reprezentowane w swoich rejestrach. Chociaż zdecydowana większość komputerów może wykonywać operacje arytmetyczne z wielokrotną precyzją na operandach w pamięci, co pozwala na arbitralną długość liczb i uniknięcie przepełnienia, szerokość rejestru ogranicza rozmiary liczb, na których można operować (np. dodawać lub odejmować) za pomocą jedna instrukcja na operację. Typowe szerokości rejestrów binarnych dla liczb całkowitych bez znaku obejmują:

  • 4 bity: maksymalna reprezentowana wartość 2 4 - 1 = 15
  • 8 bitów: maksymalna reprezentowana wartość 2 8 − 1 = 255
  • 16 bitów: maksymalna reprezentowana wartość 2 16 − 1 = 65 535
  • 32 bity: maksymalna możliwa do przedstawienia wartość 2 32 − 1 = 4 294 967 295 (najczęściej stosowana szerokość dla komputerów osobistych od 2005 r.),
  • 64 bity: maksymalna możliwa do przedstawienia wartość 2 64 - 1 = 18 446 744 073 709 551 615 (najczęściej stosowana szerokość dla procesorów komputerów osobistych , stan na 2017 r.),
  • 128 bitów: maksymalna możliwa do przedstawienia wartość 2 128 − 1 = 340 282 366 920 938 463 463 374 607 431 768 211 455

Gdy operacja arytmetyczna daje wynik większy niż powyższe maksimum dla N-bitowej liczby całkowitej, przepełnienie zmniejsza wynik do modulo N-tej potęgi 2, zachowując tylko najmniej znaczące bity wyniku i skutecznie powodując zawijanie .

W szczególności mnożenie lub dodawanie dwóch liczb całkowitych może skutkować nieoczekiwanie małą wartością, a odjęcie od małej liczby całkowitej może spowodować zawinięcie do dużej wartości dodatniej (na przykład dodanie 8-bitowej liczby całkowitej 255 + 2 daje w wyniku 1, co to 257 mod 2 8 , i podobnie odejmowanie 0-1 daje 255, reprezentację uzupełnienia do dwójki -1).

Takie zawijanie może powodować szkody dla bezpieczeństwa — jeśli przepełniona wartość jest używana jako liczba bajtów do przydzielenia dla bufora, bufor zostanie przydzielony nieoczekiwanie mały, potencjalnie prowadząc do przepełnienia bufora, co w zależności od wykorzystania bufora może turn powoduje wykonanie dowolnego kodu.

Jeśli zmienna ma typ liczby całkowitej ze znakiem, program może przyjąć założenie, że zmienna zawsze zawiera wartość dodatnią. Przepełnienie liczby całkowitej może spowodować zawinięcie wartości i stanie się ujemną, co narusza założenie programu i może prowadzić do nieoczekiwanego zachowania (na przykład dodanie 8-bitowej liczby całkowitej 127 + 1 daje w wyniku −128, uzupełnienie do dwójki 128). (Rozwiązaniem tego konkretnego problemu jest użycie typów liczb całkowitych bez znaku dla wartości, których program oczekuje i zakłada, że ​​nigdy nie będą ujemne).

Flagi

Większość komputerów ma dwie flagi dedykowanego procesora do sprawdzania warunków przepełnienia.

Wskaźnik przeniesienia jest ustawiany, gdy wynik dodawania lub odejmowania, biorąc pod uwagę argumenty i wynik jak numery niepodpisane, nie mieści się w podanej liczbie bitów. Wskazuje to na przepełnienie z przeniesieniem lub pożyczeniem z najbardziej znaczącego bitu . Bezpośrednie dodawanie z przeniesieniem lub odejmowanie z operacją pożyczania wykorzystałoby zawartość tej flagi do zmodyfikowania rejestru lub lokalizacji pamięci, która zawiera wyższą część wartości wielowyrazowej.

Flaga przepełnienia jest ustawiany, gdy wynik operacji na liczbach podpisanych nie ma znak, że można by przewidzieć z objawami argumentów np negatywnego wyniku podczas dodawania dwóch liczb dodatnich. Oznacza to, że wystąpiło przepełnienie i wynik ze znakiem przedstawiony w formie uzupełnienia do dwóch nie pasowałby do podanej liczby bitów.

Wariacje definicji i niejednoznaczność

W przypadku typu bez znaku, gdy idealny wynik operacji znajduje się poza możliwym do przedstawienia zakresem typu, a zwrócony wynik jest uzyskiwany przez zawijanie, to zdarzenie jest powszechnie definiowane jako przepełnienie. W przeciwieństwie do tego, standard C11 definiuje, że to zdarzenie nie jest przepełnieniem i stwierdza, że ​​„obliczenia obejmujące operandy bez znaku nigdy nie mogą się przepełnić”.

Gdy idealny wynik operacji na liczbach całkowitych znajduje się poza reprezentowalnym zakresem typu, a zwrócony wynik jest uzyskiwany przez ograniczenie, to zdarzenie to jest powszechnie określane jako nasycenie. Sposób użycia różni się w zależności od tego, czy nasycenie jest przepełnieniem, czy nie. Aby wyeliminować niejednoznaczność, można użyć terminów owijanie przepełnienie i nasycenie przepełnienie.

Termin niedomiar jest najczęściej używany do matematyki zmiennoprzecinkowej, a nie do matematyki całkowitej. Ale można znaleźć wiele odwołań do niedomiaru liczby całkowitej. Gdy używany jest termin niedomiar liczby całkowitej, oznacza to, że idealny wynik był bliższy minus nieskończoności niż reprezentowalna wartość typu wyjściowego najbliższa minus nieskończoności. Gdy używany jest termin niedomiar liczby całkowitej, definicja przepełnienia może obejmować wszystkie rodzaje przepełnień lub może obejmować tylko przypadki, w których idealny wynik był bliższy dodatniej nieskończoności niż reprezentowalna wartość typu wyjściowego najbliższa dodatniej nieskończoności.

Gdy idealny wynik operacji nie jest dokładną liczbą całkowitą, znaczenie przepełnienia może być niejednoznaczne w przypadkach brzegowych. Rozważmy przypadek, w którym idealny wynik ma wartość 127,25, a maksymalna reprezentowalna wartość typu wyjścia wynosi 127. Jeśli przepełnienie jest zdefiniowane jako idealna wartość znajdująca się poza reprezentowalnym zakresem typu wyjścia, wtedy ten przypadek zostałby zaklasyfikowany jako przepełnienie. W przypadku operacji, które mają dobrze zdefiniowane zachowanie zaokrąglania, klasyfikacja przepełnienia może wymagać odroczenia do momentu zastosowania zaokrąglania. Standard C11 określa, że ​​konwersje z liczby zmiennoprzecinkowej na liczby całkowite muszą być zaokrąglane do zera. Jeśli C jest używane do konwersji wartości zmiennoprzecinkowej 127,25 na liczbę całkowitą, to najpierw należy zastosować zaokrąglenie, aby uzyskać idealną liczbę całkowitą wynoszącą 127. Ponieważ zaokrąglona liczba całkowita znajduje się w zakresie wartości wyjściowych, norma C nie zaklasyfikuje tej konwersji jako przepełnienia .

Niespójne zachowanie

Warto zauważyć, że zachowanie po wystąpieniu przepełnienia może nie być spójne we wszystkich okolicznościach. W Rust język programowania na przykład, podczas gdy funkcja jest warunkiem, aby dać użytkownikom wybór i kontrolę, zachowanie dla podstawowego użycia operatorów matematycznych jest oczywiście stałe; to naprawione zachowanie różni się jednak między programem zbudowanym w trybie „debug” a programem zbudowanym w trybie „release”. W języku C przepełnienie liczby całkowitej bez znaku jest zdefiniowane w celu zawinięcia, podczas gdy przepełnienie liczby całkowitej ze znakiem powoduje niezdefiniowane zachowanie .

Metody rozwiązywania problemów z przepełnieniem liczb całkowitych

Obsługa przepełnienia liczb całkowitych w różnych językach programowania
Język Liczba całkowita bez znaku Liczba całkowita ze znakiem
Ada modulo moduł typu podnieś Constraint_Error
C / C++ modulo potęga dwójki niezdefiniowane zachowanie
C# modulo moc 2 w niesprawdzonym kontekście; System.OverflowExceptionjest podnoszony w sprawdzonym kontekście
Jawa Nie dotyczy modulo potęga dwójki
JavaScript wszystkie liczby są zmiennoprzecinkowe o podwójnej precyzji, z wyjątkiem nowego BigInt
MATLAB Wbudowane liczby całkowite są nasycone. Liczby o stałym punkcie konfigurowalne do zawijania lub nasycenia
Pyton 2 Nie dotyczy konwertuj na długi tekst (bigint)
Nasiona7 Nie dotyczy podnieść OVERFLOW_ERROR
Schemat Nie dotyczy konwertuj na bigNum
Simulink konfigurowalny do owijania lub nasycania
Pogawędka Nie dotyczy konwertuj na LargeInteger
Szybki Powoduje błąd, chyba że używa się specjalnych operatorów przepełnienia.

Wykrycie

Implementacja wykrywania przepełnienia w czasie wykonywania UBSanjest dostępna dla kompilatorów języka C .

W Javie 8 są przeciążone metody , na przykład takie jak Math.addExact(int, int), które wyrzucą ArithmeticExceptionw przypadku przepełnienia.

Zespół reagowania na incydenty komputerowe (CERT) opracował model liczby całkowitej As-if Infinitely Ranged (AIR), w dużej mierze zautomatyzowany mechanizm eliminujący przepełnienie i obcinanie liczb całkowitych w języku C/C++ przy użyciu obsługi błędów w czasie wykonywania.

Unikanie

Przydzielając zmienne z typami danych, które są wystarczająco duże, aby zawierały wszystkie wartości, które mogą być w nich obliczane i przechowywane, zawsze można uniknąć przepełnienia. Nawet jeśli dostępna przestrzeń lub stałe typy danych zapewniane przez język programowania lub środowisko są zbyt ograniczone, aby umożliwić defensywne przydzielanie zmiennych z dużymi rozmiarami, poprzez staranne porządkowanie operacji i sprawdzanie operandów z wyprzedzeniem, często można zapewnić a priori że wynik nigdy nie będzie większy niż można zapisać. Narzędzia do analizy statycznej , formalna weryfikacja i projektowanie według technik kontraktowych mogą być wykorzystywane do pewniejszego i bardziej niezawodnego zapewnienia, że ​​przepełnienie nie może wystąpić przypadkowo.

Obsługiwanie

Jeśli przewiduje się, że może wystąpić przepełnienie, wówczas do programu można wstawić testy, aby wykryć, kiedy to się stanie lub ma nastąpić, i wykonać inne przetwarzanie, aby to złagodzić. Na przykład, jeśli ważny wynik obliczony na podstawie przepełnienia danych wejściowych użytkownika, program może zatrzymać się, odrzucić dane wejściowe i być może poprosić użytkownika o inne dane wejściowe, a nie program kontynuujący z nieprawidłowym przepełnieniem danych wejściowych i prawdopodobnie nieprawidłowo w konsekwencji. Ten pełny proces można zautomatyzować: możliwe jest automatyczne zsyntetyzowanie procedury obsługi dla przepełnienia liczby całkowitej, gdzie funkcja obsługi jest na przykład czystym wyjściem.

Procesory generalnie mają sposób wykrywania tego, aby wspierać dodawanie liczb większych niż ich rozmiar rejestru, zwykle przy użyciu bitu stanu; technika ta nosi nazwę arytmetyki wielokrotnej precyzji. W ten sposób można dodać dwie liczby o szerokości dwóch bajtów, stosując tylko dodawanie bajtów w krokach: najpierw dodaj młodsze bajty, a następnie dodaj starsze bajty, ale jeśli konieczne jest wykonanie z młodszych bajtów, jest to przepełnienie arytmetyczne dodanie bajtów i konieczne staje się wykrycie i zwiększenie sumy starszych bajtów.

Obsługa możliwego przepełnienia obliczenia może czasami dawać wybór pomiędzy wykonaniem sprawdzenia przed faktycznym obliczeniem (w celu ustalenia, czy przepełnienie ma nastąpić) lub po nim (w celu rozważenia, czy prawdopodobnie nastąpiło na podstawie uzyskanej wartości) . Należy zachować ostrożność w stosunku do tego ostatniego wyboru. Po pierwsze, ponieważ może to nie być niezawodna metoda wykrywania (na przykład dodanie niekoniecznie musi mieć niższą wartość). Po drugie dlatego, że samo wystąpienie przepełnienia może w niektórych przypadkach być zachowaniem niezdefiniowanym . W języku programowania C przepełnienie typów liczb całkowitych bez znaku powoduje zawijanie, jednak przepełnienie typów liczb całkowitych ze znakiem jest zachowaniem niezdefiniowanym; w konsekwencji kompilator C może założyćże programista zapewniłże niemożliwe jest wystąpienie przepełnienia ze znakiem i dlatego może po cichu zoptymalizowaćwszelkie sprawdzenie następujące po obliczeniach które obejmuje sprawdzenie wyniku w celu wykrycia go bez ostrzeżenia programisty Gotowe. Dlatego zaleca się, aby zawsze preferować przeprowadzanie kontroli przed obliczeniami, a nie po nich.

Jawna propagacja

jeśli wartość jest zbyt duża, aby można ją było zapisać, można jej przypisać specjalną wartość wskazującą, że wystąpiło przepełnienie, a następnie wszystkie kolejne operacje zwracają tę wartość flagi. Takie wartości są czasami określane jako NaN , co oznacza „nie liczba”. Jest to przydatne, ponieważ problem można sprawdzić raz na końcu długich obliczeń, a nie po każdym kroku. Jest to często obsługiwane w sprzęcie zmiennoprzecinkowym zwanym FPU .

Obsługa języka programowania

Języki programowania implementują różne metody łagodzenia przypadkowego przepełnienia: Ada , Seed7 (i niektóre warianty języków funkcjonalnych), wyzwalają warunek wyjątku przy przepełnieniu, podczas gdy Python (od 2.4) płynnie konwertuje wewnętrzną reprezentację liczby, aby dopasować jej wzrost, ostatecznie reprezentując it as long– którego zdolność jest ograniczona jedynie dostępną pamięcią.

W językach z natywną obsługą arytmetyki arbitralnej precyzji i bezpieczeństwa typów (takich jak Python , Smalltalk lub Common Lisp ) liczby są automatycznie promowane do większego rozmiaru, gdy wystąpią przepełnienia lub zgłoszone wyjątki (z sygnalizacją warunków), gdy istnieje ograniczenie zakresu. Używanie takich języków może zatem być pomocne w złagodzeniu tego problemu. Jednak w niektórych takich językach nadal możliwe są sytuacje, w których może wystąpić przepełnienie liczby całkowitej. Przykładem jest jawna optymalizacja ścieżki kodu, która jest uważana za wąskie gardło przez profilera. W przypadku Common Lisp jest to możliwe przy użyciu jawnej deklaracji do adnotacji typu zmiennej do słowa o rozmiarze maszyny (fixnum) i obniżenia poziomu bezpieczeństwa typu do zera dla określonego bloku kodu.

W przeciwieństwie do starszych języków, takich jak C, niektóre nowsze języki, takie jak na przykład Rust , zapewniają wbudowaną funkcjonalność, która pozwala na łatwe wykrywanie i wybór przez użytkownika sposobu obsługi przepełnienia w poszczególnych przypadkach. W Ruście, podczas gdy użycie podstawowych operatorów matematycznych naturalnie nie ma takiej elastyczności, użytkownicy mogą alternatywnie wykonywać obliczenia za pomocą zestawu metod zapewnianych przez każdy z typów pierwotnych liczb całkowitych. Metody te dają użytkownikom kilka możliwości wyboru między wykonaniem operacji „sprawdzonej” (lub „przepełnionej”) (co wskazuje, czy przepełnienie wystąpiło za pośrednictwem zwracanego typu); operacja „niesprawdzona”; operacja, która wykonuje zawijanie lub operacja, która wykonuje nasycenie w granicach liczbowych.

Arytmetyka nasycona

W grafice komputerowej lub przetwarzaniu sygnałów zwykle pracuje się na danych z zakresu od 0 do 1 lub od -1 do 1. Na przykład weź obraz w skali szarości, gdzie 0 oznacza czerń, 1 oznacza biel, a wartości pomiędzy odcienie szarego. Jedną z operacji, którą można obsłużyć, jest rozjaśnianie obrazu poprzez pomnożenie każdego piksela przez stałą. Arytmetyka nasycona pozwala po prostu na ślepo pomnożyć każdy piksel przez tę stałą bez obawy o przepełnienie, po prostu trzymając się rozsądnego wyniku, że wszystkie piksele większe niż 1 (tj. „jaśniejsze niż biały” ) stają się białe, a wszystkie wartości „ciemniejsze niż czarny " po prostu stań się czarny.

Przykłady

Nieoczekiwane przepełnienie arytmetyczne jest dość częstą przyczyną błędów programu . Takie błędy przepełnienia mogą być trudne do wykrycia i zdiagnozowania, ponieważ mogą objawiać się tylko dla bardzo dużych zestawów danych wejściowych, które są mniej prawdopodobne do wykorzystania w testach walidacyjnych.

Wzięcie średniej arytmetycznej dwóch liczb przez dodanie ich i podzielenie przez dwa, jak to ma miejsce w wielu algorytmach wyszukiwania , powoduje błąd, jeśli suma (chociaż nie wynikowa średnia) jest zbyt duża, aby można ją było przedstawić, a zatem przepełnia się.

Nieobsługiwany błąd arytmetyczny w oprogramowaniu sterującym silnikiem był główną przyczyną katastrofy dziewiczego lotu rakiety Ariane 5 w 1996 roku . Oprogramowanie zostało uznane za wolne od błędów, ponieważ było używane w wielu poprzednich lotach, ale te używały mniejszych rakiet, które generowały mniejsze przyspieszenie niż Ariane 5. działał dla Ariane 5 w czasie, gdy spowodował awarię rakiety – był to proces wystrzeliwania mniejszego poprzednika Ariane 5, który pozostał w oprogramowaniu, gdy został przystosowany do nowej rakiety. Co więcej, rzeczywistą przyczyną niepowodzenia była wada w specyfikacji technicznej, w jaki sposób oprogramowanie poradziło sobie z wykryciem przepełnienia: wykonało zrzut diagnostyczny do swojej magistrali, która byłaby podłączona do sprzętu testowego podczas testowania oprogramowania podczas tworzenia ale był podłączony do silników sterujących rakietą podczas lotu; zrzut danych odepchnął dyszę silnika mocno na bok, co spowodowało utratę kontroli aerodynamicznej rakiety i przyspieszyło jej szybkie rozpadanie się w powietrzu.

W dniu 30 kwietnia 2015 r. Federalny Urząd Lotnictwa USA ogłosił, że nakaże operatorom Boeinga 787 okresowe resetowanie systemu elektrycznego, aby uniknąć przepełnienia liczb całkowitych, które może prowadzić do utraty mocy elektrycznej i rozmieszczenia turbiny nurnikowej, a Boeing wdrożył aktualizację oprogramowania w czwarty kwartał. Europejska Agencja Bezpieczeństwa Lotniczego , a następnie na 4 maja 2015. Błąd dzieje się po 2³¹ setnych sekundy (248.55134814815 dni), co wskazuje na 32-bitowe podpisane całkowitą .

Błędy przepełnienia są widoczne w niektórych grach komputerowych. W grze zręcznościowej Donkey Kong , jest to niemożliwe, aby przejść poziom 22 przeszłości ze względu na przepełnienie liczby całkowitej w swoim czasie / premii. Gra bierze numer poziomu, na którym znajduje się użytkownik, mnoży go przez 10 i dodaje 40. Kiedy osiągną poziom 22, liczba czasu/bonusu wynosi 260, co jest za duże dla jego 8-bitowego rejestru 256 wartości, więc się resetuje do 0 i daje pozostałym 4 jako czas/bonus – za krótki, aby ukończyć poziom. W Donkey Kong Jr. Math , próbując obliczyć liczbę powyżej 10 000, pokazuje tylko pierwsze 4 cyfry. Przepełnienie jest przyczyną słynnego poziomu "split-screen" w Pac-Manie . Znany błąd Nuclear Gandhi w Civilization był rzekomo spowodowany niedopełnieniem liczby całkowitej, który miał miejsce, gdy gra próbowała odjąć 2 od domyślnego poziomu agresji Gandhiego wynoszącego 1, ustawiając go na 255, prawie 26 razy więcej niż normalne maksimum 10. ( Sid Meier twierdził w wywiadzie, że było to w rzeczywistości zamierzone). Taki błąd spowodował również "Dalekie Ziemie" w Minecrafcie, które istniały od okresu rozwoju Infdev do Bety 1.7.3; został później naprawiony w wersji Beta 1.8, ale nadal istnieje w wersjach Pocket Edition i Windows 10 Edition Minecrafta . W Super NES gry Crazy Cars , gracz może spowodować ich ilość pieniędzy spadnie poniżej $ 0 w trakcie wyścigu przez nałożeniem grzywny ponad limit pozostały pieniądze po uiszczeniu opłaty za rasę, która trzasków liczbę całkowitą i przyznaje gracz $ 65,535,000 więcej niż miałby po negatywnym wyniku. Podobna usterka występuje w STALKER: Clear Sky, gdzie gracz może stracić ujemną kwotę, szybko podróżując bez wystarczających środków, a następnie przechodząc do wydarzenia, w którym gracz zostaje obrabowany i ma zabraną całą swoją walutę. Gdy gra spróbuje zabrać pieniądze gracza do kwoty 0 $, gracz otrzymuje 2147482963 w walucie gry.

W strukturze danych Pokémon w grach Pokémon liczba zdobytych Punktów Doświadczenia jest przechowywana w 3-bajtowej liczbie całkowitej. Jednak w pierwszej i drugiej generacji grupa doświadczenia średniego spowolnienia, która wymaga 1 059 860 punktów doświadczenia, aby osiągnąć poziom 100, ma -54 punkty doświadczenia na poziomie 1 (poziom, który zwykle nie jest spotykany podczas normalnej gry). Ponieważ liczba całkowita nie ma znaku, wartość zmienia się na 16 777 162. Jeśli Pokémon zdobędzie mniej niż 54 Punkty Doświadczenia w bitwie, Pokémon natychmiast wskoczy na poziom 100.

Błąd podpisu całkowitoliczbowego w kodzie konfiguracji stosu emitowany przez kompilator Pascala uniemożliwił Microsoft / IBM MACRO Assembler Version 1.00 (MASM), programowi DOS z 1981 roku i wielu innym programom skompilowanym przy użyciu tego samego kompilatora, działanie w niektórych konfiguracjach z więcej niż 512 KB pamięci.

Microsoft / IBM Macro Assembler (MASM) w wersji 1.00 i prawdopodobnie wszystkie inne programy zbudowane przez ten sam kompilator Pascala miały błąd przepełnienia liczby całkowitej i błąd podpisu w kodzie konfiguracji stosu, co uniemożliwiało ich uruchomienie na nowszych maszynach DOS lub emulatorach w niektórych typowych konfiguracje z ponad 512 KB pamięci. Program zawiesza się lub wyświetla komunikat o błędzie i wychodzi z systemu DOS.

W sierpniu 2016 r. automat w kasynie Resorts World wydrukował kupon z nagrodami w wysokości 42 949 672,76 USD w wyniku błędu przepełnienia. Kasyno odmówiło wypłaty tej kwoty, nazywając to usterką, używając na swoją obronę tego, że maszyna wyraźnie stwierdziła, że ​​maksymalna wypłata wynosi 10 000 USD, więc każda nagroda przekraczająca tę kwotę musiała być wynikiem błędu programistycznego. Sąd Najwyższy Iowa orzekł na korzyść kasyna.

Zobacz też

Bibliografia

Zewnętrzne linki