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 = 16
er 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 a
er 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 52
er 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
deckSize
variabelen 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
deckSize
til 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 ikkedekSize
er 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 + 1
ved kjøretid enn verdien "53", selv om de fleste moderne kompilatorer og tolker vil legge merke til at detdeckSize
har 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 eksempel
for (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.5
for
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 boolean
eller 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 NULL
hvis bruk oppmuntres. Andre språk gir en spesifikk null
eller nil
verdi, og når dette er tilfelle, skal det ikke brukes noe alternativ. Den skrevne pekerkonstanten nullptr
har 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 tilCAFED00D
. -
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
D8
og slutter medFF
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 med
7F
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
19
eller01
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
AA
som 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
II
ellerMM
etterfulgt av 42 som et to-byte heltall i liten eller stor endian byte-rekkefølge.II
er for Intel, som bruker lite endian byte -bestilling, så det magiske tallet er49
49
2A
00
.MM
er for Motorola, som bruker stor endian byte -bestilling, så det magiske tallet er4D
4D
00
2A
. -
Unicode- tekstfiler som er kodet i UTF-16 starter ofte med Byte Order Mark for å oppdage endianness (
FE
FF
for big endian ogFF
FE
for 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
IWAD
ellerPWAD
(for Doom ),WAD2
(for Quake ) ogWAD3
(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 file
kan 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
05
i begynnelsen av forespørselen (som representerer Microsoft DCE/RPC versjon 5), umiddelbart etterfulgt av en00
eller01
for den mindre versjonen. I UDP-baserte MSRPC-forespørsler er alltid den første byten04
. - 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
19
representerer topplengden, umiddelbart etterfulgt av uttrykket "BitTorrent -protokoll" ved byteposisjon 1. -
eDonkey2000 / eMule -trafikk begynner med en enkelt byte som representerer klientversjonen. For tiden
E3
representerer en eDonkey -klient,C5
representerer eMule ogD4
representerer komprimert eMule. - De første
04
byte av en blokk i Bitcoin Blockchain inneholder et magisk nummer som fungerer som nettverksidentifikator. Verdien er en konstant0xD9B4BEF9
, som indikerer hovednettverket, mens konstanten0xDAB5BFFA
angir 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
80
og en SSLv3 server svar på en klient hei begynner med16
(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
0000
og1234
bestemmer 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 for55 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
- Standard MAC -adresse på Texas Instruments SOC er DE: AD: BE: EF: 00: 00.
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 . CC ligner 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å
- Magisk streng
- Filformat § Magisk nummer
- Liste over filsignaturer
- FourCC
- Hard koding
- Magi (programmering)
- NaN (ikke et tall)
- Oppført type
- Hexspeak , for et annet sett med magiske verdier
- Ingenting i ærmet mitt om magiske konstanter i kryptografiske algoritmer
- Tidsformatering og lagringsfeil , for problemer som kan skyldes magi
- Sentinelverdi (aka flaggverdi, turverdi, useriøs verdi, signalverdi, dummy -data)
- Kanariverdi , spesiell verdi for å oppdage bufferoverløp
- XYZZY (magisk ord)
- Rask omvendt kvadratrot ved bruk av konstant 0x5F3759DF