Integer overflow

Integer overflow handling in various programming languages
Language Unsigned integer Signed integer
Ada modulo de modulus van het type raise Constraint_Error
C/C++ modulo macht van twee ongedefinieerd gedrag
C# modulo macht van 2 in niet-gecontroleerde context; System.OverflowException wordt verhoogd in gecontroleerde context
Java N/A modulo macht van twee
JavaScript alle getallen zijn dubbel-precisie floating-point behalve de nieuwe BigInt
MATLAB Builtin gehele getallen verzadigen. Vast-point integers configureerbaar om te wikkelen of te verzadigen
Python 2 N/A converteer naar lang type (bigint)
Seed7 N/A raise OVERFLOW_ERROR
Scheme N/A converteer naar bigNum
Simulink configureerbaar om te wikkelen of te verzadigen
Smalltalk N/A converteer naar LargeInteger
Swift Geeft fout tenzij speciale overflow operatoren gebruikt worden.

DetectionEdit

Run-time overflow detection implementation UBSan is beschikbaar voor C compilers.

In Java 8, zijn er overloaded methods, bijvoorbeeld zoals Math.addExact(int, int), die ArithmeticException zullen gooien in geval van overflow.

Computer emergency response team (CERT) ontwikkelde het As-if Infinitely Ranged (AIR) integer model, een grotendeels geautomatiseerd mechanisme om integer overflow en truncation in C/C++ te elimineren met behulp van run-time error handling.

AvoidanceEdit

Door variabelen toe te wijzen met datatypen die groot genoeg zijn om alle waarden te bevatten die mogelijk kunnen worden berekend en opgeslagen in hen, is het altijd mogelijk om overflow te voorkomen. Zelfs wanneer de beschikbare ruimte of de vaste gegevenstypen die door een programmeertaal of -omgeving worden geboden, te beperkt zijn om variabelen defensief te kunnen toewijzen met royale afmetingen, is het, door operaties zorgvuldig te ordenen en operanden van tevoren te controleren, vaak mogelijk a priori te garanderen dat het resultaat nooit groter zal zijn dan kan worden opgeslagen. Statische analyse-instrumenten, formele verificatie en design by contract-technieken kunnen worden gebruikt om er met meer vertrouwen en robuustheid voor te zorgen dat een overflow niet per ongeluk kan optreden.

HandlingEdit

Als wordt voorzien dat een overflow kan optreden, dan kunnen tests in het programma worden opgenomen om te detecteren wanneer het gebeurt, of op het punt staat te gebeuren, en andere bewerkingen uitvoeren om het te beperken. Als bijvoorbeeld een belangrijk resultaat, berekend op basis van gebruikersinvoer, overloopt, kan het programma stoppen, de invoer weigeren en de gebruiker misschien om andere invoer vragen, in plaats van dat het programma doorgaat met de ongeldige overgelopen invoer en waarschijnlijk als gevolg daarvan slecht functioneert. Dit volledige proces kan worden geautomatiseerd: het is mogelijk om automatisch een handler te synthetiseren voor een integer overflow, waarbij de handler bijvoorbeeld een schone exit is.

CPU’s hebben over het algemeen een manier om dit te detecteren om het optellen van getallen groter dan hun register-grootte te ondersteunen, meestal met behulp van een status bit; de techniek wordt multiple-precision arithmetic genoemd.Zo is het mogelijk om twee getallen van elk twee bytes breed op te tellen met slechts een byte optelling in stappen: eerst de lage bytes optellen dan de hoge bytes, maar als het nodig is om de lage bytes uit te voeren is dit aritmetische overflow van de byte optelling en wordt het noodzakelijk om de som van de hoge bytes te detecteren en te verhogen.

Handelen met een mogelijke overflow van een berekening kan soms een keuze opleveren tussen het uitvoeren van een controle vóór de eigenlijke berekening (om vast te stellen of er al dan niet een overflow zal optreden), of erna (om op grond van de resulterende waarde na te gaan of het al dan niet waarschijnlijk is dat de overflow zal optreden). Voorzichtigheid is geboden ten aanzien van de laatste keuze. Ten eerste omdat het wellicht geen betrouwbare detectiemethode is (een optelling hoeft bijvoorbeeld niet noodzakelijkerwijs tot een lagere waarde te leiden). Ten tweede omdat het optreden van overflow zelf in sommige gevallen ongedefinieerd gedrag kan zijn. In de programmeertaal C resulteert overflow van niet-getekende gehele getallen in “wrapping”, maar overflow van getekende gehele getallen is ongedefinieerd gedrag; bijgevolg staat het de C-compiler vrij aan te nemen dat de programmeur ervoor heeft gezorgd dat overflow van getekende getallen onmogelijk is en hij kan dus elke controle na de berekening waarbij het resultaat wordt gecontroleerd om het te detecteren, stilzwijgend optimaliseren, zonder de programmeur te waarschuwen dat dit is gebeurd. Het is dus raadzaam om controles altijd bij voorkeur vóór berekeningen uit te voeren en niet erna.

Expliciete propagatieEdit

als een waarde te groot is om te worden opgeslagen, kan er een speciale waarde aan worden toegekend die aangeeft dat er een overflow is opgetreden en vervolgens alle opeenvolgende bewerkingen deze vlagwaarde laten teruggeven. Dergelijke waarden worden soms aangeduid als NaN, voor “geen getal”. Dit is handig zodat het probleem eenmalig aan het eind van een lange berekening kan worden gecontroleerd in plaats van na elke stap. Dit wordt vaak ondersteund in floating point hardware, FPU’s genaamd.

ProgrammeertaalondersteuningEdit

Programmeertalen implementeren diverse mitigatiemethoden tegen een toevallige overflow: Ada, Seed7 (en bepaalde varianten van functionele talen), triggeren een uitzonderingsconditie bij overflow, terwijl Python (sinds 2.4) de interne representatie van het getal naadloos converteert om overeen te komen met de groei, waarbij het uiteindelijk wordt gerepresenteerd als long – waarvan het vermogen alleen wordt beperkt door het beschikbare geheugen.

In talen met native ondersteuning voor Arbitraire-precisie rekenkunde en type veiligheid (zoals Python, Smalltalk of Common Lisp), worden getallen automatisch naar een groter formaat gepromoveerd wanneer overflows optreden, of worden excepties gegooid (condities gesignaleerd) wanneer een range constraint bestaat. Het gebruik van zulke talen kan dus nuttig zijn om dit probleem te beperken. In sommige van zulke talen zijn echter nog steeds situaties mogelijk waarin een integer overflow kan optreden. Een voorbeeld hiervan is de expliciete optimalisatie van een codepad dat door de profiler als knelpunt wordt beschouwd. In het geval van Common Lisp is dit mogelijk door een expliciete declaratie te gebruiken om een variabele te typeren als een woord ter grootte van een machine (fixnum) en het typeveiligheidsniveau te verlagen naar nul voor een bepaald codeblok.

In schril contrast met oudere talen zoals C, bieden sommige nieuwere talen, zoals Rust bijvoorbeeld, ingebouwde functionaliteit die eenvoudige detectie mogelijk maakt en de gebruiker de keuze laat hoe een overflow per geval moet worden afgehandeld. Hoewel het gebruik van wiskundige basisoperatoren in Rust van nature een dergelijke flexibiliteit ontbeert, kunnen gebruikers berekeningen uitvoeren via een reeks methoden die door elk van de primitieve integer-typen worden aangeboden. Deze methoden geven gebruikers verschillende keuzes tussen het uitvoeren van een ‘gecontroleerde’ (of ‘overlopende’) bewerking (die via het terugkeertype aangeeft of er al dan niet een overloop heeft plaatsgevonden); een ‘niet-gecontroleerde’ bewerking; een bewerking die wrapping uitvoert, of een bewerking die verzadiging uitvoert op de numerieke grenzen.

Verzadigde rekenkundeEdit

In computergrafiek of signaalverwerking is het typisch om te werken met gegevens die variëren van 0 tot 1 of van -1 tot 1. Neem bijvoorbeeld een afbeelding in grijstinten, waarbij 0 staat voor zwart, 1 voor wit, en de waarden daartussen voor grijstinten. Een bewerking die men kan willen ondersteunen is het ophelderen van de afbeelding door elke pixel te vermenigvuldigen met een constante. Met verzadigde rekenkunde kan men gewoon blindelings elke pixel met die constante vermenigvuldigen zonder zich zorgen te maken over overflow door gewoon vast te houden aan een redelijke uitkomst dat al deze pixels groter dan 1 (d.w.z. “helderder dan wit”) gewoon wit worden en alle waarden “donkerder dan zwart” gewoon zwart worden.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.