Magisk nummer (programmering) - Magic number (programming)

I dataprogrammering har begrepet magisk tall flere betydninger. Det kan referere til ett eller flere av følgende:

  • Unike verdier med uforklarlig betydning eller flere forekomster som (helst) kan erstattes med navngitte konstanter
  • En konstant tall- eller tekstverdi som brukes til å identifisere et filformat eller en protokoll; for filer, se Liste over filsignaturer
  • Særpregede unike verdier som neppe vil bli forvekslet med andre betydninger (f.eks. Globalt unike identifikatorer )

Uten navn numeriske konstanter

Begrepet magisk tall eller magisk konstant refererer til antimønsteret for å bruke tall direkte i kildekoden. Dette har blitt referert til som å bryte en av de eldste programmeringsreglene, som går tilbake til manualene fra COBOL , FORTRAN og PL/1 fra 1960 -tallet. Bruken av unavngitte magiske tall i koden skjuler utviklernes hensikt med å velge dette tallet, øker mulighetene for subtile feil (f.eks. Er hvert siffer riktig i 3.14159265358979323846 og er dette lik 3.14159?) Og gjør det vanskeligere for programmet å bli tilpasset og utvides i fremtiden. Ved å erstatte alle betydningsfulle magiske tall med navngitte konstanter blir programmer lettere å lese, forstå og vedlikeholde.

Navn valgt for å være meningsfylt i konteksten av programmet kan resultere i kode som er lettere å forstå av en vedlikeholder som ikke er den opprinnelige forfatteren (eller til og med av den opprinnelige forfatteren etter en periode). Et eksempel på en uinformativt navngitt konstant er int SIXTEEN = 16, mens det int NUMBER_OF_BITS = 16er mer beskrivende.

Problemene knyttet til magiske "tall" beskrevet ovenfor er ikke begrenset til numeriske typer, og begrepet brukes også på andre datatyper der erklæring av en navngitt konstant ville være mer fleksibel og kommunikativ. Dermed er erklæring const string testUserName = "John"bedre enn flere forekomster av den 'magiske verdien' "John"i en testsuite .

For eksempel, hvis det er nødvendig å tilfeldig blande verdiene i en matrise som representerer en standard pakke med kort , gjør denne pseudokoden jobben ved å bruke Fisher – Yates shuffle -algoritmen:

   for i from 1 to 52
       j := i + randomInt(53 - i) - 1
       a.swapEntries(i, j)

hvor aer et array -objekt, randomInt(x)velger funksjonen et tilfeldig heltall mellom 1 og x , inkludert, og swapEntries(i, j)bytter i th og j th -oppføringene i arrayet. I det foregående eksemplet 52er et magisk tall. Det regnes som bedre programmeringsstil å skrive følgende:

   constant int deckSize := 52
   for i from 1 to deckSize
       j := i + randomInt(deckSize + 1 - i) - 1
       a.swapEntries(i, j)

Dette er å foretrekke av flere grunner:

  • Det er lettere å lese og forstå. En programmerer som leser det første eksemplet, kan lure på: Hva betyr tallet 52 her? Hvorfor 52? Programmereren kan slutte meningen etter å ha lest koden nøye, men den er ikke åpenbar. Magiske tall blir spesielt forvirrende når det samme nummeret brukes til forskjellige formål i en del av koden.
  • Det er lettere å endre verdien på tallet, siden det ikke er duplisert. Endring av verdien til et magisk tall er feilutsatt, fordi den samme verdien ofte brukes flere ganger på forskjellige steder i et program. Når to semantisk forskjellige variabler eller tall har samme verdi, kan de ved et uhell begge redigeres sammen. For å endre det første eksempelet for å blande en Tarot -kortstokk, som har 78 kort, kan en programmerer naivt erstatte hver forekomst av 52 i programmet med 78. Dette vil forårsake to problemer. For det første ville den gå glipp av verdien 53 på den andre linjen i eksemplet, noe som ville få algoritmen til å mislykkes på en subtil måte. For det andre vil det sannsynligvis erstatte tegnene "52" overalt, uansett om de refererer til kortstørrelsen eller noe helt annet, for eksempel antall uker i et gregoriansk kalenderår, eller mer lumskt, er en del av et tall som "1523", som alle ville introdusere feil. Derimot vil endring av verdien til deckSizevariabelen i det andre eksemplet være en enkel endring på en linje.
  • Det oppmuntrer og letter dokumentasjon. Det eneste stedet der den navngitte variabelen deklareres, er et godt sted å dokumentere hva verdien betyr og hvorfor den har den verdien den gjør. Å ha samme verdi i en mengde steder enten fører til dupliserte kommentarer (og tilhørende problemer når oppdatering noen, men mangler noen) eller blader ikke en plass hvor det er både naturlig for forfatteren å forklare verdien og sannsynligvis leseren skal lete etter en forklaring .
  • Erklæringene om "magiske tall" -variabler plasseres sammen, vanligvis øverst i en funksjon eller fil, noe som letter deres gjennomgang og endring.
  • Det forenkler parameterisering. For eksempel, for å generalisere eksemplet ovenfor til en prosedyre som blander en kortstokk med et hvilket som helst antall kort, ville det være tilstrekkelig å bli deckSizetil en parameter for denne prosedyren, mens det første eksemplet ville kreve flere endringer.
   function shuffle (int deckSize)
      for i from 1 to deckSize
          j := i + randomInt(deckSize + 1 - i) - 1
          a.swapEntries(i, j)
  • Det hjelper med å oppdage skrivefeil . Å bruke en variabel (i stedet for en bokstavelig) drar fordel av en kompilators kontroll. Hvis du ved et uhell skriver "62" i stedet for "52", blir det ikke oppdaget, mens du skriver " dekSize" i stedet for " deckSize" ville resultere i kompilatorens advarsel som ikke dekSizeer deklarert.
  • Det kan redusere skrivingen i noen IDE -er . Hvis en IDE støtter fullføring av kode , vil den fylle ut det meste av variabelens navn fra de første bokstavene.

Ulemper er:

  • Når den navngitte konstanten ikke er definert i nærheten av bruken, skader det lokaliteten og dermed forståelsen av koden. Å sette 52 på et mulig fjernt sted betyr at for å forstå hvordan "for" -sløyfen fungerer fullstendig (for eksempel for å estimere sløyfetiden), må man spore opp definisjonen og kontrollere at det er det forventede tallet . Dette er lett å unngå (ved å flytte deklarasjonen) når konstanten bare brukes i en del av koden. Når den navngitte konstanten brukes i forskjellige deler, derimot, er den eksterne plasseringen en anelse for leseren om at den samme verdien vises andre steder i koden, som også kan være verdt å se nærmere på.
  • Det kan gjøre koden mer oversiktlig. Erklæringen om konstanten legger til en linje. Når konstantens navn er lengre enn verdien, spesielt hvis flere slike konstanter vises på en linje, kan det gjøre det nødvendig å dele en logisk setning av koden på flere linjer. En økning i verbositet kan være berettiget når det er sannsynlighet for forvirring om konstanten, eller når det er sannsynlighet for at konstanten må endres, for eksempel gjenbruk av en blandingsrutine for andre kortspill. Det kan like fullt være begrunnet som en økning i uttrykksfullhet.
  • Det kan være tregere å behandle uttrykket deckSize + 1ved kjøretid enn verdien "53", selv om de fleste moderne kompilatorer og tolker vil legge merke til at det deckSizehar blitt erklært som en konstant og forhåndsberegne verdien 53 i den kompilerte koden. Selv når det ikke er et alternativ, vil sløyfeoptimalisering flytte tilsetningen slik at den utføres før løkken. Det er derfor vanligvis ingen (eller ubetydelig) hastighetsstraff sammenlignet med å bruke magiske tall i koden.
  • Det kan gjøre feilsøking vanskeligere på systemer der feilsøkingsprogrammet ikke viser verdiene til konstanter (for eksempel fordi kompilatoren har optimalisert dem).

Godkjente bruksområder

I noen sammenhenger er bruk av ikke navngitte numeriske konstanter generelt akseptert (og uten tvil "ikke magi"). Selv om slik aksept er subjektiv og ofte er avhengig av individuelle kodingsvaner, er følgende vanlige eksempler:

  • bruk av 0 og 1 som start- eller inkrementelle verdier i en for loop , for eksempelfor (int i = 0; i < max; i += 1)
  • bruk av 2 for å sjekke om et tall er partall eller oddetall, som i isEven = (x % 2 == 0), hvor %er modulo -operatøren
  • bruk av enkle aritmetiske konstanter, f.eks. i uttrykk som circumference = 2 * Math.PI * radius, eller for å beregne diskriminanten av en kvadratisk ligning somd = b^2 − 4*a*c
  • bruk av potenser av 10 til å konvertere beregningsverdier (for eksempel mellom gram og kilo) eller til å beregne prosent og promille verdiene
  • eksponenter i uttrykk som (f(x) ** 2 + f(y) ** 2) ** 0.5for

Konstantene 1 og 0 er noen ganger brukt til å representere de boolske verdiene sant og usant i programmeringsspråk uten en boolsk typen, for eksempel eldre versjoner av C . De fleste moderne programmeringsspråk gir en booleaneller bool primitiv type, og derfor er bruk av 0 og 1 dårlig anbefalt. Dette kan være mer forvirrende siden 0 noen ganger betyr programmatisk suksess (når -1 betyr feil) og fiasko i andre tilfeller (når 1 betyr suksess).

I C og C ++ brukes noen ganger 0 for å representere nullpekeren . Som med boolske verdier, inneholder C -standardbiblioteket en makrodefinisjon NULLhvis bruk oppmuntres. Andre språk gir en spesifikk nulleller nilverdi, og når dette er tilfelle, skal det ikke brukes noe alternativ. Den skrevne pekerkonstanten nullptrhar blitt introdusert med C ++ 11.

Formatindikatorer

Opprinnelse

Formatindikatorer ble først brukt i tidlig versjon 7 Unix kildekoden.

Unix ble portet til en av de første DEC PDP-11 /20s, som ikke hadde minnebeskyttelse . Så tidlige versjoner av Unix brukte den flyttbare minnereferansemodellen . Unix- versjoner i pre- sjette utgave leste en kjørbar fil i minnet og hoppet til den første adressen til lavt minne i programmet, relativ adresse null. Med utviklingen av sidede versjoner av Unix, ble det opprettet en overskrift for å beskrive de kjørbare bildekomponentene . Også en forgreningsinstruksjon ble innsatt som det første ordet i overskriften for å hoppe over topp- og starter programmet. På denne måten kan et program kjøres i den eldre flyttbare minnereferansen (vanlig) eller i sidemodus. Etter hvert som flere kjørbare formater ble utviklet, ble nye konstanter lagt til ved å øke grenforskyvningen .

I sjette utgave kildekoden til Unix -programlasteren, leser exec () -funksjonen det kjørbare ( binære ) bildet fra filsystemet. De første 8 byte i filen var en overskrift som inneholdt størrelsene på programmet (tekst) og initialiserte (globale) dataområder. Dessuten ble den første 16-bit ord av hodesammenlignet med to konstanter for å bestemme om den kjørbare bildeinneholdt flyttliggende minnereferanser (normal), er nylig gjennomført vekslet som bare kan leses kjørbart bilde, eller den separerte instruksjonen og datasidevekslet bilde. Det var ingen omtale av dobbeltrollen til overskriftskonstanten, men byte av høy orden til konstanten var faktisk operasjonskoden for PDP-11- greninstruksjonen ( oktal 000407 eller hex 0107). Å legge til syv i programtelleren viste at hvis denne konstanten ble utført , ville den forgrene Unix exec () -tjenesten over det kjørbare bildet åtte byte -topptekst og starte programmet.

Siden den sjette og syvende utgaven av Unix brukte personsøkekode, ble den dobbelte rollen til overskriftskonstanten skjult. Det vil si at exec () -tjenesten leser den kjørbare filoverskriften ( meta ) -data til en kjerneplassbuffer , men leser det kjørbare bildet inn i brukerområdet , og bruker dermed ikke konstantens forgreningsfunksjon. Magisk nummeropprettelse ble implementert i Unix linker og loader, og forgrening av magiske tall ble sannsynligvis fortsatt brukt i pakken med frittstående diagnostiske programmer som fulgte med sjette og syvende utgave. Dermed ga overskriftskonstanten en illusjon og oppfylte kriteriene for magi .

I versjon Seven Unix ble topptekstkonstanten ikke testet direkte, men tilordnet en variabel merket ux_mag og senere referert til som det magiske nummeret . Sannsynligvis på grunn av sin særegenhet betød begrepet magisk nummer kjørbar formattype, deretter utvidet til filsystemtype og utvidet igjen til å bety hvilken som helst filtype.

I filer

Magiske tall er vanlige i programmer på tvers av mange operativsystemer. Magiske tall implementerer sterkt typede data og er en form for in-band-signalering til det kontrollerende programmet som leser datatypene ved datakjøretiden. Mange filer har slike konstanter som identifiserer de inneholdte dataene. Å oppdage slike konstanter i filer er en enkel og effektiv måte å skille mellom mange filformater og kan gi ytterligere informasjon om kjøretid .

Eksempler
  • Kompilerte Java-klassefiler ( bytecode ) og Mach-O- binærfiler starter med hex CAFEBABE. Når den komprimeres med Pack200 blir bytes endret til CAFED00D.
  • GIF -bildefiler har ASCII -koden for "GIF89a" ( 47 49 46 38 39 61) eller "GIF87a" ( 47 49 46 38 37 61)
  • JPEG -bildefiler begynner med FF D8og slutter med FF D9. JPEG/ JFIF -filer inneholder ASCII -koden for "JFIF" ( 4A 46 49 46) som en null -avsluttet streng . JPEG/ Exif -filer inneholder ASCII -koden for "Exif" ( 45 78 69 66) også som en null -avsluttet streng, etterfulgt av flere metadata om filen.
  • PNG- bildefiler begynner med en 8- bytes signatur som identifiserer filen som en PNG-fil og gjør det mulig å oppdage vanlige filoverføringsproblemer: \211 P N G \r \n \032 \n( 89 50 4E 47 0D 0A 1A 0A). Denne signaturen inneholder forskjellige nylinjetegn for å oppdage uberettigede automatiserte nylinjekonverteringer, for eksempel å overføre filen ved hjelp av FTP med ASCII -overføringsmodus i stedet for den binære modusen.
  • Standard MIDI -lydfiler har ASCII -koden for "MThd" ( M IDI T rack h ea d er, 4D 54 68 64) etterfulgt av flere metadata.
  • Unix eller Linux -skript kan starte med en "shebang" ( #! , 23 21) Etterfulgt av banen til en tolk , dersom tolk er sannsynlig å være forskjellig fra den som skriptet ble påkalt.
  • ELF -kjørbare filer starter med7F E L F
  • PostScript -filer og programmer starter med "%!" ( 25 21).
  • PDF -filer starter med "%PDF" (hex 25 50 44 46).
  • DOS MZ kjørbare filer og EXE -stubben til Microsoft Windows PE (Portable Executable) -filene starter med tegnene "MZ" ( 4D 5A), initialene til designeren av filformatet, Mark Zbikowski . Definisjonen tillater også den uvanlige "ZM" ( 5A 4D) for dosZMXP, en EXE som ikke er PE.
  • The Berkeley Fast File System super format er identifisert som enten 19 54 01 19eller 01 19 54, avhengig av versjon; begge representerer bursdagen til forfatteren, Marshall Kirk McKusick .
  • The Master Boot Record of oppstartbare lagringsenheter på nesten alle IA-32 IBM PC-kompatible har etiske 55 AAsom de siste to bytes.
  • Eksekverbare filer for Game Boy og Game Boy Advance håndholdte videospillsystemer har henholdsvis et 48-byte eller 156-byte magisk nummer på et fast sted i overskriften. Dette magiske nummeret koder for et bitmap av Nintendo -logoen.
  • Amiga -programvare kjørbare Hunk -filer som kjører på Amiga klassiske 68000 -maskiner, startet alle med det heksadesimale tallet $ 000003f3, med kallenavnet "Magic Cookie."
  • I Amiga er den eneste absolutte adressen i systemet hex $ 0000 0004 (minneplassering 4), som inneholder startstedet SysBase, en peker til exec.library, den såkalte kjernen til Amiga.
  • PEF -filer, brukt av det klassiske Mac OS og BeOS for PowerPC -kjørbare filer, inneholder ASCII -koden for "Joy!" ( 4A 6F 79 21) som et prefiks.
  • TIFF- filer begynner med enten IIeller MMetterfulgt av 42 som et to-byte heltall i liten eller stor endian byte-rekkefølge. IIer for Intel, som bruker lite endian byte -bestilling, så det magiske tallet er 49 49 2A 00. MMer for Motorola, som bruker stor endian byte -bestilling, så det magiske tallet er 4D 4D 00 2A.
  • Unicode- tekstfiler som er kodet i UTF-16 starter ofte med Byte Order Mark for å oppdage endianness ( FE FFfor big endian og FF FEfor little endian). Og på Microsoft Windows , UTF-8 tekstfiler starter ofte med UTF-8-koding av samme karakter, EF BB BF.
  • LLVM Bitcode -filer starter med BC(0x42, 0x43)
  • WAD- filer starter med IWADeller PWAD(for Doom ), WAD2(for Quake ) og WAD3(for Half-Life ).
  • Microsoft Compound File Binary Format (mest kjent som et av de eldre formatene for Microsoft Office -dokumenter) -filer starter med D0 CF 11 E0, noe som visuelt antyder ordet "DOCFILE0".
  • Overskrifter i ZIP -filer begynner med "PK" ( 50 4B), initialene til Phil Katz , forfatter av DOS -komprimeringsverktøyet PKZIP .
  • Overskrifter i 7z -filer begynner med "7z" (fullt magisk nummer:) 37 7A BC AF 27 1C.
Gjenkjenning

Unix -verktøyet filekan lese og tolke magiske tall fra filer, og filen som brukes til å analysere informasjonen kalles magi . Windows -verktøyet TrID har et lignende formål.

I protokoller

Eksempler
  • Den OSCAR-protokollen , som brukes i AIM / ICQ , prefiksene forespørsler med 2A.
  • I RFB -protokollen som brukes av VNC , starter en klient samtalen med en server ved å sende "RFB" ( 52 46 42, for "Remote Frame Buffer") etterfulgt av klientens protokollversjonsnummer.
  • I SMB -protokollen som brukes av Microsoft Windows, begynner hver SMB -forespørsel eller serversvar med ' FF 53 4D 42', eller "\xFFSMB"ved begynnelsen av SMB -forespørselen.
  • I MSRPC- protokollen som brukes av Microsoft Windows, begynner hver TCP-baserte forespørsel med 05i begynnelsen av forespørselen (som representerer Microsoft DCE/RPC versjon 5), umiddelbart etterfulgt av en 00eller 01for den mindre versjonen. I UDP-baserte MSRPC-forespørsler er alltid den første byten 04.
  • I COM- og DCOM -grensesnitt, kalt OBJREF , starter alltid med bytesekvensen "MEOW" ( 4D 45 4F 57). Feilsøkingsutvidelser (brukt til DCOM -kanalhakking) går foran med bytesekvensen "MARB" ( 4D 41 52 42).
  • Ukrypterte BitTorrent -sporingsforespørsler begynner med en enkelt byte som inneholder verdien som 19representerer topplengden, umiddelbart etterfulgt av uttrykket "BitTorrent -protokoll" ved byteposisjon 1.
  • eDonkey2000 / eMule -trafikk begynner med en enkelt byte som representerer klientversjonen. For tiden E3representerer en eDonkey -klient, C5representerer eMule og D4representerer komprimert eMule.
  • De første 04byte av en blokk i Bitcoin Blockchain inneholder et magisk nummer som fungerer som nettverksidentifikator. Verdien er en konstant 0xD9B4BEF9, som indikerer hovednettverket, mens konstanten 0xDAB5BFFAangir testnettet.
  • SSL -transaksjoner begynner alltid med en "klient hei" -melding. Rekordinnkapslingsskjemaet som brukes til prefiks for alle SSL-pakker, består av to- og trebytes topptekster. Vanligvis er en SSL -versjon 2 klient hei -melding foran som en 80og en SSLv3 server svar på en klient hei begynner med 16(selv om dette kan variere).
  • DHCP -pakker bruker en "magisk informasjonskapsel" -verdi på ' 0x63 0x82 0x53 0x63' i begynnelsen av alternativdelen av pakken. Denne verdien er inkludert i alle DHCP -pakketyper.
  • HTTP/2 -tilkoblinger åpnes med forordet ' 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a' eller " PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n". Forordet er designet for å unngå behandling av rammer av servere og mellommenn som støtter tidligere versjoner av HTTP, men ikke 2.0.

I grensesnitt

Magiske tall er vanlige i API -funksjoner og grensesnitt på tvers av mange operativsystemer , inkludert DOS , Windows og NetWare :

Eksempler
  • IBM PC -kompatible BIOSer bruker magiske verdier 0000og 1234bestemmer om systemet skal telle opp minne eller ikke ved omstart, og dermed utføre en kald eller en varm oppstart. Disse verdiene brukes også av EMM386 -minneledere som fanger opp forespørsler om oppstart. BIOSer bruker også magiske verdier for 55 AAå avgjøre om en disk er oppstartbar.
  • Den MS-DOS disk cache SMARTDRV (kodenavn "Bambi") bruker magi verdier BABE og EBAB i API-funksjoner.
  • Mange DR DOS- , Novell DOS- og OpenDOS -drivere utviklet i det tidligere europeiske utviklingssenteret i Storbritannia bruker verdien 0EDC som et magisk tegn når de påkaller eller gir tilleggsfunksjonalitet som sitter på toppen av (emulerte) standard DOS -funksjoner, NWCACHE er et eksempel.

Andre bruksområder

Eksempler

Datatype grenser

Dette er en liste over grenser for datalagringstyper:

Desimal Hex Beskrivelse
18.446.744.073.709.551.615 FFFF FFFF FFFF FFFF Maksimal usignert 64 -bits verdi (2 64-1 )
9.223.372.036.854.775.807 7FFF FFFF FFFF FFFF Maksimal signert 64 -bits verdi (2 63 - 1)
4.294.967.295 FFFF FFFF Maksimal usignert 32 -bits verdi (2 32 - 1)
2.147.483.647 7FFF FFFF Maksimal signert 32 -bits verdi (2 31 - 1)
65 535 FFFF Maksimal usignert 16 -bits verdi (2 16-1 )
32.767 7FFF Maksimal signert 16 -bits verdi (2 15 - 1)
255 FF Maksimal usignert 8 -bits verdi (2 8 - 1)
127 7F Maksimal signert 8 -bits verdi (2 7 - 1)
−128 80 Minimum signert 8 bit verdi
−32,768 8000 Minimum signert 16 bit verdi
−2 147 483 648 8000 0000 Minimum signert 32 bit verdi
−9,223,372,036,854,775,808 8000 0000 0000 0000 Minimum signert 64 bit verdi

GUIDer

Det er mulig å opprette eller endre globalt unike identifikatorer (GUIDer) slik at de blir minneverdige, men dette er sterkt motløs da det kompromitterer deres styrke som nesten unike identifikatorer. Spesifikasjonene for generering av GUIDer og UUID -er er ganske komplekse, og det er det som fører til at de er praktisk talt unike, hvis de blir implementert riktig. De bør bare genereres av et anerkjent programvareverktøy.

Microsoft Windows-produkt-ID-numre for Microsoft Office- produkter slutter noen ganger med 0000-0000-0000000FF1CE ("OFFICE"), for eksempel { 90160000-008C-0000-0000-0000000FF1CE }, produkt-ID-en for "Office 16 Click-to-Run" Utvidelseskomponent ".

Java bruker flere GUIDer som starter med CAFEEFAC.

I GUID-partisjonstabellen i GPT-partisjoneringsskjemaet bruker BIOS Boot-partisjoner den spesielle GUID { 21686148-6449-6E6F-744E-656564454649 } som ikke følger GUID-definisjonen; i stedet dannes den ved å bruke ASCII -kodene for strengen " Hah! IdontNeedEFI " delvis i liten endianrekkefølge .

Feilsøkingsverdier

Magiske feilsøkingsverdier er spesifikke verdier skrevet til minnet under tildeling eller deallokasjon, slik at det senere vil være mulig å fortelle om de har blitt ødelagt eller ikke, og for å gjøre det tydelig når verdier hentet fra uinitialisert minne brukes. Minne blir vanligvis sett på i heksadesimal, så minneverdige gjentagelses- eller heksesprek -verdier er vanlige. Numerisk odde verdier kan være å foretrekke slik at prosessorer uten byte -adressering vil gjøre feil når de prøver å bruke dem som pekere (som må falle på like adresser). Verdier bør velges som er borte fra sannsynlige adresser (programkoden, statiske data, haugdata eller bunken). På samme måte kan de velges slik at de ikke er gyldige koder i instruksjonssettet for den gitte arkitekturen.

Siden det er svært usannsynlig, selv om det er mulig, at et 32-bits heltall ville ta denne spesifikke verdien, indikerer utseendet til et slikt tall i en feilsøkings- eller minnedump sannsynligvis en feil som et bufferoverløp eller en ikke- initialisert variabel .

Kjente og vanlige eksempler inkluderer:

Kode Beskrivelse
00008123 Brukes i MS Visual C ++. Slettede pekere er satt til denne verdien, så de kaster et unntak når de brukes etter; det er et mer gjenkjennelig alias for nulladressen. Den aktiveres med alternativet Security Development Lifecycle (/sdl).
..FACADE "Facade" , brukt av en rekke RTOSer
1BADB002 "1 dårlig oppstart" , Multiboot header magisk nummer
8BADF00D "Spiste dårlig mat" , Indikerer at en Apple iOS -applikasjon er avsluttet fordi det oppstod timeout for vakthund.
A5A5A5A5 Brukes i innebygd utvikling fordi det alternerende bitmønsteret (1010 0101) skaper et lett gjenkjent mønster på oscilloskoper og logiske analysatorer .
A5 Brukes i FreeBSD 's PHK malloc (3) for feilsøking når /etc/malloc.conf er symlinked til '-J' for å initialisere alle nylig tildelt minne som denne verdien er ikke en NULL-peker eller ASCII NUL karakter.
ABABABAB Brukes av Microsoft 's debug HeapAlloc () for å markere 'ingenmannsland' vakt byte etter allokert heap minne.
ABADBABE "A bad babe" , brukt av Apple som "Boot Zero Block" magiske nummer
ABBABABE " ABBA babe" , brukt av Driver Parallel Lines minnesamling.
ABADCAFE "En dårlig kafé" , brukes til å initialisere alt allokert minne (Mungwall, AmigaOS )
B16B00B5 "Big Boobs" , tidligere kreves av Microsoft 's Hyper-V hypervisor å bli brukt av Linux-gjester som den øvre halvdelen av deres 'gjest id'
BAADF00D "Dårlig mat" , Brukes av Microsofts feilsøking HeapAlloc () for å markere uinitialisert tildelt haugeminne
BAAAAAAD "Baaaaaad" , Indikerer at Apple iOS -loggen er et stackshot av hele systemet, ikke en krasjrapport
BAD22222 "Dårlig for gjentatte ganger" , Indikerer at en Apple iOS VoIP -applikasjon er avsluttet fordi den ble gjenopptatt for ofte
BADBADBADBAD "Bad bad bad bad" , Burroughs store systemers "uinitialiserte" minne (48-biters ord)
BADC0FFEE0DDF00D "Bad coffee odd food" , Brukes på IBM RS/6000 64-biters systemer for å indikere uinitialiserte CPU-registre
BADDCAFE "Bad cafe" , On Sun Microsystems ' Solaris , markerer uinitialisert kjerneminne (KMEM_UNINITIALIZED_PATTERN)
BBADBEEF "Bad beef" , brukt i WebKit
BEEFCACE "Beef cake" , Brukes av Microsoft .NET som et magisk tall i ressursfiler
C00010FF "Cool off" , indikerer at Apple iOS -appen ble drept av operativsystemet som svar på en termisk hendelse
CAFEBABE "Cafe babe" , Brukes av Java til klassefiler
CAFED00D "Cafe dude" , Brukes av Java for pack200 -komprimering
CAFEFEED "Cafe feed" , Brukes av Sun Microsystems ' Solaris feilsøkingskjerne for å markere kmemfree () minne
CCCCCCCC Brukes av Microsofts C ++ debugging runtime -bibliotek og mange DOS -miljøer for å markere uinitialisert stakkminne . CCligner opcode for INT 3 feilsøkingsbruddspunktavbrudd på x86 -prosessorer.
CDCDCDCD Brukes av Microsofts C/C ++ debug malloc () -funksjon for å markere uinitialisert haugminne, vanligvis returnert fra HeapAlloc ()
0D15EA5E "Zero Disease" , brukes som et flagg for å indikere vanlig oppstart på Nintendo GameCube og Wii -konsollene
DDDDDDDD Brukes av MicroQuill's SmartHeap og Microsofts C/C ++ feilsøkingsfrie () -funksjon for å markere frigjort haugminne
DEAD10CC "Dead lock" , Indikerer at en Apple iOS -applikasjon er avsluttet fordi den holdt på en systemressurs mens den kjørte i bakgrunnen
DEADBABE "Dead babe" , brukt ved starten av Silicon Graphics ' IRIX arena -filer
DEADBEEF "Dead beef" , Berømt brukt på IBM -systemer som RS/6000 , også brukt i de klassiske Mac OS -operativsystemene , OPENSTEP Enterprise og Commodore Amiga . På Sun Microsystems ' Solaris , merker frigjort kjerneminne (KMEM_FREE_PATTERN)
DEADCAFE "Dead cafe" , Brukes av Microsoft .NET som et feilnummer i DLLer
DEADC0DE "Død kode" , Brukes som en markør i OpenWRT- fastvare for å markere begynnelsen på det jffs2-filsystemet som skal opprettes på slutten av den statiske fastvaren
DEADFA11 "Dead fail" , Indikerer at en Apple iOS -applikasjon har blitt tvunget til å slutte av brukeren
DEADF00D "Dead food" , Brukes av Mungwall på Commodore Amiga for å markere tildelt, men ikke -initialisert minne
DEFEC8ED "Defecated" , Brukes til OpenSolaris kjernedumper
DEADDEAD "Dead Dead" indikerer at brukeren bevisst startet en krasjdumping fra enten kjernefeilretting eller tastaturet.
D00D2BAD "Dude, Too Bad", brukt av Safari krasjer på macOS Big Sur.
EBEBEBEB Fra MicroQuill's SmartHeap
FADEDEAD "Fade dead" , kommer på slutten for å identifisere alle AppleScript -skript
FDFDFDFD Brukes av Microsofts C/C ++ debug malloc () -funksjon for å markere "ingenmannsland" vaktbyte før og etter tildelt haugeminne, og noen feilsøkingssikre C-Runtime- funksjoner implementert av Microsoft (f.eks. Strncat_s)
FEE1DEAD "Feel dead" , Brukes av Linux reboot () syscall
FEEDFACE "Feed ansikt" , sett i PowerPC Mach-O- binærfiler på Apple Inc. 's MacOS plattform. På Sun Microsystems ' Solaris , markerer den røde sonen (KMEM_REDZONE_PATTERN)

Brukt av VLC -spiller og noen IP -kameraer i RTP / RTCP -protokollen, sender VLC -spilleren fire byte i rekkefølgen av systemets endelighet . Noen IP -kameraer forventer at spilleren sender dette magiske nummeret og starter ikke strømmen hvis det ikke mottas.

FEEEFEEE " Gebyrgebyr " , Brukes av Microsofts feilsøking HeapFree () for å markere frigjort haugminne. Noen nærliggende interne regnskapsverdier kan også ha det høye ordet satt til FEEE.

De fleste av disse er hver 32 bit lange- ordstørrelsen på de fleste 32-biters arkitekturdatamaskiner.

Utbredelsen av disse verdiene i Microsoft -teknologi er ingen tilfeldighet; de diskuteres i detalj i Steve Maguires bok Writing Solid Code fra Microsoft Press . Han gir en rekke kriterier for disse verdiene, for eksempel:

  • De skal ikke være nyttige; det vil si at de fleste algoritmer som opererer på dem må forventes å gjøre noe uvanlig. Tall som null passer ikke til dette kriteriet.
  • De bør lett kunne gjenkjennes av programmereren som ugyldige verdier i feilsøkingsprogrammet.
  • På maskiner som ikke har bytejustering , bør de være oddetall , slik at dere refererer dem som adresser forårsaker et unntak.
  • De bør forårsake et unntak, eller kanskje til og med en feilsøkingsbrudd, hvis de kjøres som kode.

Siden de ofte ble brukt til å markere områder med hukommelse som egentlig var tomme, kom noen av disse begrepene til å bli brukt i setninger som betyr "borte, avbrutt, tømt for hukommelse"; f.eks. "Programmet ditt er DEADBEEF".

Se også

Referanser