Magické číslo (programování) - Magic number (programming) - Wikipedia
v programování, termín magické číslo má více významů. Může odkazovat na jednu nebo více z následujících možností:
- Jedinečné hodnoty s nevysvětlitelným významem nebo více výskytů, které lze (nejlépe) nahradit pojmenovanými konstantami
- Konstantní číselná nebo textová hodnota použitá k identifikaci a formát souboru nebo protokol; soubory viz Seznam podpisů souborů
- Výrazné jedinečné hodnoty, u nichž je nepravděpodobné, že budou zaměněny za jiné významy (např. Globálně jedinečné identifikátory )
Nejmenované číselné konstanty
Termín magické číslo nebo magická konstanta Odkazuje na anti-vzor použití čísel přímo ve zdrojovém kódu. Toto bylo označováno jako porušení jednoho z nejstarších pravidel programování, jehož historie sahá až do COBOL, FORTRAN a PL / 1 manuály 60. let.[1] Použití nepojmenovaných magických čísel v kódu zakrývá záměr vývojářů zvolit toto číslo,[2] zvyšuje příležitosti pro jemné chyby (např. je každá číslice správná v 3.14159265358979323846 a je to rovna 3.14159?) a ztěžuje přizpůsobení a rozšíření programu v budoucnu.[3] Nahrazení všech významných magických čísel názvem konstanty usnadňuje čtení, porozumění a údržbu programů.[4]
Jména vybraná jako smysluplná v kontextu programu mohou mít za následek kód, který snáze pochopí správce, který není původním autorem (nebo dokonce původním autorem po určité době). Příkladem neinformativně pojmenované konstanty je int ŠESTNÁCT = 16
, zatímco int NUMBER_OF_BITS = 16
je popisnější.
Problémy spojené s magickými „čísly“ popsanými výše se neomezují pouze na číselné typy a tento termín se také vztahuje na jiné datové typy, kde by deklarování pojmenované konstanty bylo pružnější a komunikativnější.[1] Tedy deklarace const řetězec testUserName = "John"
je lepší než několik výskytů „magické hodnoty“ "John"
v testovací sada.
Například pokud je nutné náhodně zamíchat hodnoty v poli představujícím standardní balíček hrací karty, tento pseudo kód dělá práci pomocí Fisher – Yates zamíchá algoritmus:
pro i z 1 na 52 j: = i + randomInt (53 - i) - 1 a. SwapEntries (i, j)
kde A
je objekt pole, funkce randomInt (x)
vybere náhodné celé číslo mezi 1 a X, včetně, a swapEntries (i, j)
zaměňuje ith a jth položky v poli. V předchozím příkladu 52
je magické číslo. Za lepší programovací styl se považuje psaní následujícího:
konstantní int deckSize: = 52 pro i z 1 na deckSize j: = i + randomInt (deckSize + 1 - i) - 1 a. swapEntries (i, j)
To je vhodnější z několika důvodů:
- Je snazší číst a rozumět mu. Programátor, který čte první příklad, by se mohl divit, Co zde znamená číslo 52? Proč 52? Programátor může po pečlivém přečtení kódu odvodit význam, ale není to zřejmé. Kouzelná čísla se stávají obzvláště matoucími, když je stejné číslo použito pro různé účely v jedné části kódu.
- Je snazší změnit hodnotu čísla, protože není duplikováno. Změna hodnoty magického čísla je náchylná k chybám, protože stejná hodnota se v programu často používá několikrát na různých místech. Také, když dvě sémanticky odlišné proměnné nebo čísla mají stejnou hodnotu, mohou být omylem obě upraveny společně. Chcete-li upravit první příklad pro zamíchání a Tarot balíček, který má 78 karet, může programátor naivně nahradit každou instanci 52 v programu 78. To by způsobilo dva problémy. Nejprve by chyběla hodnota 53 na druhém řádku příkladu, což by způsobilo jemné selhání algoritmu. Zadruhé, pravděpodobně by nahradil znaky „52“ všude, bez ohledu na to, zda odkazují na velikost balíčku nebo na něco úplně jiného, jako je například počet týdnů v gregoriánském kalendářním roce, nebo více zákeřně, jsou součástí čísla jako „1523“, to vše by představovalo chyby. Naproti tomu změna hodnoty
deckSize
proměnná v druhém příkladu by byla jednoduchá, jednorázová změna. - Podporuje a usnadňuje dokumentaci. Jediné místo, kde je deklarována pojmenovaná proměnná, je dobrým místem pro dokumentaci toho, co hodnota znamená a proč má hodnotu, kterou dělá. Mít stejnou hodnotu na mnoha místech vede buď k duplicitním komentářům (a problémům s obsluhou při aktualizaci některých, ale některým chybí), nebo nezanechává žádné jeden místo, kde je pro autora přirozené vysvětlit hodnotu a pravděpodobně čtenář hledá vysvětlení.
- Deklarace proměnných „magického čísla“ jsou umístěny společně, obvykle v horní části funkce nebo souboru, což usnadňuje jejich kontrolu a změnu.
- Usnadňuje parametrizaci. Například pro zobecnění výše uvedeného příkladu na postup, který zamíchá balíček libovolného počtu karet, by stačilo otočit
deckSize
do parametru tohoto postupu, zatímco první příklad by vyžadoval několik změn.
funkce zamíchat (int deckSize) pro i z 1 na deckSize j: = i + randomInt (deckSize + 1 - i) - 1 a. swapEntries (i, j)
- Pomáhá detekovat překlepy. Použití proměnné (namísto literálu) využívá kontrolu kompilátoru. Náhodné napsání „62“ místo „52“ by zůstalo nezjištěno, zatímco psaní „
dekSize
" namísto "deckSize
"bude mít za následek varování překladače, žedekSize
je nedeklarováno. - U některých může snížit psaní IDE. Pokud IDE podporuje dokončení kódu, vyplní většinu názvů proměnných z prvních několika písmen.
Nevýhody jsou:
- Když pojmenovaná konstanta není definována poblíž jejího použití, poškodí to lokalitu, a tím i srozumitelnost kódu. Uvedení 52 na možné vzdálené místo znamená, že k úplnému pochopení fungování smyčky for (například k odhadu doby běhu smyčky) je třeba sledovat definici a ověřit, zda se jedná o očekávané číslo. Je snadné se vyhnout (přemístěním deklarace), když se konstanta používá pouze v jedné části kódu. Pokud se naopak používá v nesourodých částech, vzdálené umístění je vodítkem pro čtenáře, že stejná hodnota se objevuje i jinde, což může být také užitečné prozkoumat.
- Může to udělat kód podrobnějším. Deklarace konstanty přidá řádek. Pokud je název konstanty delší než hodnota, zvláště pokud se v jednom řádku objeví několik takových konstant, může být nutné rozdělit jeden logický příkaz kódu na několik řádků. Zvýšení výřečnosti může být odůvodněno, pokud existuje určitá pravděpodobnost záměny o konstantě, nebo pokud existuje pravděpodobnost, že bude nutné konstantu změnit, například znovu použít míchací rutiny pro jiné karetní hry. Rovněž to lze odůvodnit zvýšením expresivity.
- Zpracování výrazu může být pomalejší
deckSize + 1
za běhu než hodnota „53“, i když si to většina moderních překladačů a tlumočníků všimnedeckSize
byl deklarován jako konstanta a předem vypočítá hodnotu 53 v kompilovaném kódu. I když to není možnost, optimalizace smyčky přesune přidání tak, aby se provedlo před smyčkou. Ve srovnání s použitím magických čísel v kódu proto obvykle neexistuje žádný (nebo zanedbatelný) trest rychlosti. - V systémech, kde ladicí program nezobrazuje hodnoty konstant, může ladění ztížit (například proto, že je kompilátor optimalizoval).
Přijímané použití
![]() | Tato sekce potřebuje další citace pro ověření.Březen 2010) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
V některých kontextech je použití nepojmenovaných numerických konstant obecně přijímáno (a pravděpodobně „ne magické“). Zatímco takové přijetí je subjektivní a často závisí na individuálních návycích kódování, následující příklady jsou běžné:
- použití 0 a 1 jako počátečních nebo přírůstkových hodnot v a pro smyčku, jako
pro (int i = 0; i < max; i += 1)
- použití 2 ke kontrole, zda je číslo sudé nebo liché, jako v
isEven = (x% 2 == 0)
, kde%
je modulo operátor - použití jednoduchých aritmetických konstant, např. ve výrazech jako
obvod = 2 * Math.PI * poloměr
,[1] nebo pro výpočet diskriminující a kvadratická rovnice tak jakod = b ^ 2 - 4 * a * c
- použití mocnin 10 k převodu metrických hodnot (např. mezi gramy a kilogramy) nebo k výpočtu procenta a promile hodnoty
- exponenty ve výrazech jako
(f (x) ** 2 + f (y) ** 2) ** 0,5
pro
Konstanty 1 a 0 se někdy používají k reprezentaci booleovský hodnoty True a False v programovacích jazycích bez booleovského typu, jako jsou starší verze C. Většina moderních programovacích jazyků poskytuje a booleovský
nebo bool
primitivní typ a proto je použití 0 a 1 nedoporučeno. To může být matoucí, protože 0 někdy znamená programový úspěch (když -1 znamená selhání) a selhání v jiných případech (když 1 znamená úspěch).
V C a C ++ se někdy 0 používá k reprezentaci nulový ukazatel. Stejně jako u booleovských hodnot obsahuje standardní knihovna C definici makra NULA
jehož použití je podporováno. Jiné jazyky poskytují zvláštní nula
nebo nula
a v takovém případě by neměla být použita žádná alternativa. Zadaná konstanta ukazatele nullptr
byl představen s C ++ 11.
Indikátory formátu
Původ
Indikátory formátu byly poprvé použity na počátku Verze 7 Unix zdrojový kód.[Citace je zapotřebí ]
Unix byl přenesen na jeden z prvních DEC PDP-11 / 20s, které neměly ochrana paměti. Rané verze Unixu tedy používaly odkaz na přemístitelnou paměť Modelka.[5] Před-Šesté vydání Unixu verze načíst spustitelný soubor do Paměť a skočil na první nízkou paměťovou adresu programu, relativní adresa nula. S rozvojem stránkovaný verze Unix, a záhlaví byl vytvořen k popisu spustitelný obrázek komponenty. Také, a instrukce pobočky bylo vloženo jako první slovo záhlaví, aby se záhlaví přeskočilo a spustil program. Tímto způsobem může být program spuštěn ve starším referenčním režimu přemístitelné paměti (běžném) nebo v stránkovaném režimu. Jak byly vyvinuty další spustitelné formáty, byly přidány nové konstanty zvýšením větve offset.[6]
V Šesté vydání zdrojový kód zavaděče programu Unix přečetla funkce exec () spustitelný soubor (binární ) obrázek ze systému souborů. Prvních 8 bajtů souboru byl a záhlaví obsahující velikosti programových (textových) a inicializovaných (globálních) datových oblastí. Také první 16bitové slovo záhlaví bylo porovnáno se dvěma konstanty zjistit, zda spustitelný obrázek obsažené přemístitelné odkazy na paměť (normální), nově implementováno stránkovaný spustitelný obrázek jen pro čtení nebo samostatný stránkovaný obrázek instrukce a dat.[7] Nebyla zmínka o dvojí roli konstanty záhlaví, ale bajt vyššího řádu konstanty byl ve skutečnosti provozní kód pro instrukci odbočky PDP-11 (osmičkový 000407 nebo hex 0107). Přidání sedmičky k počítadlu programu ukázalo, že pokud tato konstanta byla popraven, rozvětví službu Unix exec () přes záhlaví osmi bajtů spustitelného obrazu a spustí program.
Protože šesté a sedmé vydání Unixu používalo stránkovací kód, byla dvojí role konstanty záhlaví skryta. To znamená, že služba exec () čte záhlaví spustitelného souboru (meta ) data do a prostor jádra vyrovnávací paměť, ale načíst spustitelný obrázek do uživatelský prostor, čímž nepoužívá funkci větvení konstanty. Vytváření magických čísel bylo implementováno v Unixu linker a nakladač a větvení magických čísel bylo pravděpodobně stále používáno v sadě samostatný diagnostické programy který přišel se šestým a sedmým vydáním. Konstanta záhlaví tedy poskytovala iluzi a splňovala kritéria pro kouzlo.
Ve verzi Seven Unix nebyla konstanta záhlaví testována přímo, ale byla přiřazena proměnné označené ux_mag[8] a následně označován jako magické číslo. Pravděpodobně kvůli své jedinečnosti, termínu magické číslo přišel znamenat typ spustitelného formátu, poté byl rozšířen na střední typ systému souborů a opět rozšířen na jakýkoli typ souboru.
V souborech
Magická čísla jsou běžná v programech napříč mnoha operačními systémy. Magická čísla se implementují silně napsaný data a jsou formou vnitropásmová signalizace do řídícího programu, který čte datové typy v době běhu programu. Mnoho souborů má takové konstanty, které identifikují obsažená data. Detekce takových konstant v souborech je jednoduchý a efektivní způsob rozlišení mezi mnoha formáty souborů a může přinést další dobu běhu informace.
- Příklady
- Sestaven Soubory třídy Java (bytecode ) a Mach-O binární soubory začínají hex
CAFEBABE
. Při komprimaci pomocí Pack200 bajty jsou změněny naCAFED00D
. - GIF obrazové soubory mají ASCII kód pro „GIF89a“ (
47
49
46
38
39
61
) nebo „GIF87a“ (47
49
46
38
37
61
) - JPEG obrazové soubory začínají
FF
D8
a končí sFF
D9
. JPEG /JFIF soubory obsahují ASCII kód pro „JFIF“ (4A
46
49
46
) jako řetězec zakončený nulou. JPEG /Exif soubory obsahují ASCII kód pro "Exif" (45
78
69
66
) také jako řetězec zakončený nulou, následovaný dalšími metadata o souboru. - PNG obrazové soubory začínají 8-byte podpis, který identifikuje soubor jako soubor PNG a umožňuje detekci běžných problémů s přenosem souborů:
\211
P
N
G
r
n
\032
n
(89
50
4E
47
0D
0A
1A
0A
). Tento podpis obsahuje různé nový řádek znaky umožňující detekovat neoprávněné automatizované převody nového řádku, například přenos souboru pomocí FTP s ASCII režim přenosu místo binární režimu.[9] - Standard MIDI zvukové soubory mají ASCII kód pro "MThd" (MIDI Tnosič headehm,
4D
54
68
64
) následovaná dalšími metadaty. - Unix nebo Linux skripty mohou začínat a "shebang" (#!,
23
21
) následovaný cestou k tlumočník, pokud se tlumočník pravděpodobně bude lišit od toho, od kterého byl skript vyvolán. - ELF spustitelné soubory začínají
7F
E
L
F
- PostScript soubory a programy začínají na „%!“ (
25
21
). - PDF soubory začínají „% PDF“ (hex
25
50
44
46
). - Spustitelný soubor DOS MZ soubory a EXE útržek z Microsoft Windows PE Soubory (Portable Executable) začínají znaky „MZ“ (
4D
5A
), iniciály návrháře formátu souboru, Mark Zbikowski. Definice umožňuje neobvyklé „ZM“ (5A
4D
) také pro dosZMXP, non-PE EXE.[10] - The Systém rychlých souborů Berkeley formát superbloku je identifikován jako jeden
19
54
01
19
nebo01
19
54
v závislosti na verzi; oba představují narozeniny autora, Marshall Kirk McKusick. - The Master Boot Record zaváděcích úložných zařízení téměř na všech IA-32 Kompatibilní s IBM PC má kód
55
AA
jako jeho poslední dva bajty. - Spustitelné soubory pro Hráč a Game Boy Advance kapesní videohry mají 48bajtové nebo 156bajtové magické číslo na pevném místě v záhlaví. Toto kouzelné číslo kóduje bitmapu Nintendo logo.
- Amiga spustitelný software Skýva soubory běžící na Amiga classic 68000 všechny stroje začínají hexadecimálním číslem $ 000003f3, přezdívaným „Magic Cookie“.
- V Amize je jedinou absolutní adresou v systému hex $ 0000 0004 (umístění paměti 4), která obsahuje počáteční umístění zvané SysBase, ukazatel na exec.library, tzv. jádro Amiga.
- PEF soubory, které používá klasický Mac OS a BeOS pro PowerPC spustitelné soubory, obsahují ASCII kód pro „Joy!“ (
4A
6F
79
21
) jako předpona. - TIFF soubory začínají buď
II
neboMM
následován 42 jako dvoubajtové celé číslo v malém nebo velkém endian řazení bytů.II
je pro Intel, který používá malý Endian řazení bytů, takže magické číslo je49
49
2A
00
.MM
je pro společnost Motorola, která používá velký endian řazení bytů, takže magické číslo je4D
4D
00
2A
. - Unicode textové soubory kódované v UTF-16 často začínají s Byte Order Mark detekovat endianismus (
FE
FF
pro velký endian aFF
FE
pro malý endian). A dál Microsoft Windows, UTF-8 textové soubory často začínají kódováním UTF-8 stejného znaku,EF
BB
BF
. - LLVM Soubory bitových kódů začínají
před naším letopočtem
(0x42, 0x43) - SVAZEK soubory začínají
IWAD
neboPWAD
(pro Osud ),WAD2
(pro Zemětřesení ) aWAD3
(pro Poločas rozpadu ). - Microsoft Binární formát složeného souboru (většinou známý jako jeden ze starších formátů Microsoft Office soubory) soubory začínají
D0
CF
11
E0
, což vizuálně naznačuje slovo „DOCFILE0“. - Záhlaví v ZIP soubory začínají na „PK“ (
50
4B
), iniciály Phil Katz, autor DOS nástroj pro kompresi PKZIP. - Záhlaví v 7z soubory začínají na „7z“ (celé magické číslo:
37
7A
před naším letopočtem
AF
27
1C
).
- Detekce
Obslužný program Unix soubor
umí číst a interpretovat magická čísla ze souborů a volá se soubor, který se používá k analýze informací kouzlo. Obslužný program Windows TrID má podobný účel.
V protokolech
- Příklady
- The Protokol OSCAR, použito v CÍL /ICQ, předpony požadavků s
2A
. - V Protokol RFB používá VNC, klient zahájí konverzaci se serverem odesláním „RFB“ (
52
46
42
, pro „Remote Frame Buffer“) následovaný číslem verze protokolu klienta. - V SMB protokol používaný systémem Microsoft Windows, každý požadavek SMB nebo odpověď serveru začíná „
FF
53
4D
42
'nebo„ xFFSMB“
na začátku požadavku SMB. - V MSRPC protokol používaný systémem Microsoft Windows, každý požadavek založený na protokolu TCP začíná
05
na začátku požadavku (představující Microsoft DCE / RPC verze 5), následovaný okamžitě a00
nebo01
pro vedlejší verzi. V požadavcích MSRPC založených na UDP je vždy první bajt04
. - v KOM a DCOM zařadil rozhraní, tzv OBJREFY, vždy začněte sekvencí bajtů „MEOW“ (
4D
45
4F
57
). Ladicí přípony (používané pro zaháknutí kanálu DCOM) jsou označeny sekvencí bajtů „MARB“ (4D
41
52
42
). - Nezašifrované BitTorrent tracker požadavky začínají jedním bajtem obsahujícím hodnotu
19
představující délku záhlaví, za kterým bezprostředně následuje fráze „protokol BitTorrent“ na pozici bajtu 1. - eDonkey2000 /eMule provoz začíná jediným bajtem představujícím verzi klienta. V současné době
E3
představuje klienta eDonkey,C5
představuje eMule aD4
představuje komprimovanou eMule. - První
04
bajtů bloku v Bitcoin Blockchain obsahuje magické číslo, které slouží jako identifikátor sítě. Hodnota je konstanta0xD9B4BEF9
, což označuje hlavní síť, zatímco konstantní0xDAB5BFFA
označuje testnet. - SSL transakce vždy začínají zprávou „klient ahoj“. Schéma zapouzdření záznamu používané k předponě všech paketů SSL se skládá ze dvou a tříbajtových formulářů záhlaví. Obvykle má klientská zpráva SSL verze 2 předponu s
80
a odpověď serveru SSLv3 na klienta začíná ahoj16
(i když se to může lišit). - DHCP pakety používají hodnotu „kouzelného cookie“ „
0x63
0x82
0x53
0x63
'na začátku části možností balíčku. Tato hodnota je zahrnuta ve všech typech paketů DHCP. - HTTP / 2 spojení se otevírají předmluvou '
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
„nebo“PRI * HTTP / 2.0 r n r nSM r n r n
Předmluva je navržena tak, aby se zabránilo zpracování rámců servery a zprostředkovateli, kteří podporují dřívější verze protokolu HTTP, ale nikoli 2.0.
V rozhraních
Magická čísla jsou běžná v Funkce API a rozhraní napříč mnoha operační systémy, počítaje v to DOS, Okna a NetWare:
- Příklady
- IBM PC -kompatibilní BIOSy používat magické hodnoty
0000
a1234
rozhodnout, zda má systém počítat paměť, nebo ne při restartu, čímž provede studené nebo teplé spuštění. Hodnoty závěrečných prací také používají EMM386 správci paměti zachycující požadavky na spuštění.[11] BIOSy také používají magické hodnoty55 AA
zjistit, zda je disk zaváděcí.[12] - The MS-DOS mezipaměť disku SMARTDRV (s kódovým označením „Bambi“) používá ve funkcích API magické hodnoty BABE a EBAB.[11]
- Mnoho DR DOS, Novell DOS a OpenDOS ovladače vyvinuté v prvním Evropské rozvojové centrum ve Velké Británii použijte hodnotu 0EDC jako magický token, když vyvoláte nebo poskytnete další funkce na vrcholu (emulovaných) standardních funkcí systému DOS, jedním příkladem je NWCACHE.[11]
Jiná použití
- Příklady
- Výchozí MAC adresa na Texas Instruments SOC je DE: AD: BE: EF: 00: 00.[13]
Limity datových typů
Toto je seznam omezení typů datových úložišť:[14]
Desetinný | Hex | Popis |
---|---|---|
18,446,744,073,709,551,615 | FFFF FFFF FFFF FFFF | Maximální 64bitová hodnota bez znaménka (264 − 1) |
9,223,372,036,854,775,807 | 7FFF FFFF FFFF FFFF | Maximální podepsaná 64bitová hodnota (263 − 1) |
4,294,967,295 | FFFF FFFF | Maximální 32bitová hodnota bez znaménka (232 − 1) |
2,147,483,647 | 7FFF FFFF | Maximální 32bitová hodnota se znaménkem (231 − 1) |
65,535 | FFFF | Maximální 16bitová hodnota bez znaménka (216 − 1) |
32,767 | 7FFF | Maximální 16bitová hodnota se znaménkem (215 − 1) |
255 | FF | Maximální 8bitová hodnota bez znaménka (28 − 1) |
127 | 7F | Maximální podepsaná 8bitová hodnota (27 − 1) |
−128 | 80 | Minimální podepsaná 8bitová hodnota |
−32,768 | 8000 | Minimální podepsaná 16bitová hodnota |
−2,147,483,648 | 8000 0000 | Minimální podepsaná 32bitová hodnota |
−9,223,372,036,854,775,808 | 8000 0000 0000 0000 | Minimální podepsaná 64bitová hodnota |
GUID
Je možné vytvořit nebo změnit globálně jedinečné identifikátory (GUID), aby byly nezapomenutelné, ale to se velmi nedoporučuje, protože to ohrožuje jejich sílu jako téměř jedinečných identifikátorů.[15][16] Specifikace pro generování GUID a UUID jsou poměrně složité, což vede k tomu, že jsou prakticky jedinečné, pokud jsou správně implementovány. Měly by být generovány pouze renomovaným softwarovým nástrojem.[Citace je zapotřebí ]
Identifikační čísla produktů Microsoft Windows pro Microsoft Office výrobky někdy končí 0000-0000-0000000FF1CE („KANCELÁŘ“), například {90160000-008C-0000-0000-0000000FF1CE}, ID produktu „Komponenta rozšiřitelnosti Click-to-Run Office 16“.
Java používá několik identifikátorů GUID počínaje CAFEEFAC
.[17]
V Tabulka oddílů GUID schématu rozdělení GPT, Spouštěcí oddíly systému BIOS použít speciální GUID {21686148-6449-6E6F-744E-656564454649}[18] který nedodržuje definici GUID; místo toho je vytvořen pomocí ASCII kódy pro řetězec "Hah! IdontNeedEFI"částečně v malý Endian objednat.[19]
Hodnoty ladění
Hodnoty magického ladění jsou konkrétní hodnoty zapsané do Paměť v době přidělení nebo deallocation, takže později bude možné zjistit, zda nedošlo k jejich poškození, a dát to najevo, když se používají hodnoty převzaté z neinicializované paměti. Paměť je obvykle prohlížena v šestnáctkové soustavě, takže nezapomenutelné opakování nebo hexspeak hodnoty jsou běžné. Mohou být upřednostňovány numericky liché hodnoty, aby procesory bez adresování bajtů selhaly při pokusu o jejich použití jako ukazatelů (které musí spadat na sudé adresy). Měly by být zvoleny hodnoty, které jsou daleko od pravděpodobných adres (programový kód, statická data, data haldy nebo zásobník). Podobně je lze zvolit tak, aby to nebyly platné kódy v sadě instrukcí pro danou architekturu.
Jelikož je velmi nepravděpodobné, i když je to možné, že 32bitové celé číslo bude mít tuto specifickou hodnotu, vzhled takového čísla v debugger nebo výpis paměti s největší pravděpodobností označuje chybu, jako je přetečení vyrovnávací paměti nebo neinicializovaná proměnná.
Mezi slavné a běžné příklady patří:
Kód | Popis |
---|---|
00008123 | Používá se v MS Visual C ++. Odstraněné ukazatele jsou nastaveny na tuto hodnotu, takže vyvolají výjimku, když se použijí po; jedná se o rozpoznatelnější alias pro nulovou adresu. Aktivuje se pomocí možnosti Security Development Lifecycle (/ sdl).[20] |
..FASÁDA | "Fasáda", Používá několik RTOS |
1BADB002 | "1 špatný boot", Multiboot magické číslo záhlaví[21] |
8BADF00D | „Ate bad food“, Označuje, že Jablko iOS aplikace byla ukončena, protože došlo k vypršení časového limitu hlídacího psa.[22] |
A5A5A5A5 | Používá se ve vestavěném vývoji, protože střídavý bitový vzor (1010 0101) vytváří snadno rozpoznatelný vzor osciloskopy a logické analyzátory. |
A5 | Použito v FreeBSD je PHK malloc (3) pro ladění, když je /etc/malloc.conf symbolicky spojen s "-J", aby se inicializovala veškerá nově přidělená paměť, protože tato hodnota není ukazatelem NULL nebo znakem ASCII NUL. |
ABABABAB | Používá Microsoft ladí HeapAlloc () k označení "země nikoho" strážní byty po přidělené haldě paměti.[23] |
ABADBABE | „Špatné zlato“, Používá Jablko jako magické číslo „Boot Zero Block“ |
ABBABABE | "ABBA kotě", který používá Paralelní linky řidiče halda paměti. |
ABADCAFE | „Špatná kavárna“, Používá se k inicializaci celé nepřidělené paměti (Mungwall, AmigaOS ) |
B16B00B5 | "Velká prsa", Dříve vyžadováno Microsoft je Hyper-V hypervisor, který bude používán hosty Linuxu jako horní polovina jejich „ID hosta“[24] |
BAADF00D | "Špatné jídlo", Používá Microsoft ladění HeapAlloc () k označení neinicializované přidělené haldy paměti[23] |
BAAAAAAD | "Baaaaaad", Označuje, že Jablko iOS log je stackshot celého systému, ne zpráva o selhání[22] |
BAD22222 | „Špatně příliš často“, Označuje, že Jablko iOS Aplikace VoIP byla ukončena, protože se obnovovala příliš často[22] |
BADBADBADBAD | „Bad bad bad bad bad“, Burroughs velké systémy "neinicializovaná" paměť (48bitová slova) |
BADC0FFEE0DDF00D | "Špatná káva liché jídlo", Používá se na IBM RS / 6000 64bitové systémy k indikaci neinicializovaných registrů CPU |
BADDCAFE | „Špatná kavárna“, Zapnuto Sun Microsystems ' Solaris, označí neinicializovanou paměť jádra (KMEM_UNINITIALIZED_PATTERN) |
BBADBEEF | „Bad beef“, Použito v WebKit[je zapotřebí objasnění ] |
BEEFCACE | "Hovězí dort", Používá Microsoft .NET jako kouzelné číslo ve zdrojových souborech |
C00010FF | "Ochladit", Označuje Jablko iOS aplikace byla zabita operačním systémem v reakci na tepelnou událost[22] |
CAFEBABE | "Cafe babe", Používá Jáva pro soubory třídy |
CAFED00D | "Cafe vole", Používá Jáva pro jejich pack200 komprese |
CAFEFEED | "Cafe feed", Používá Sun Microsystems ' Solaris ladění jádra k označení paměti kmemfree () |
CCCCCCCC | Používá Microsoft Ladicí runtime knihovna C ++ a mnoho prostředí DOS pro označení neinicializovaného zásobník Paměť. CC podobá se operačnímu kódu INT 3 ladit přerušení zarážky na procesorech x86. |
CDCDCDCD | Používá Microsoft Funkce ladění C / C ++ malloc () k označení neinicializované paměti haldy, obvykle vrácená z HeapAlloc ()[23] |
0D15EA5E | „Nulová nemoc“, Používá se jako příznak k označení běžného spuštění systému Nintendo GameCube a Wii konzoly |
DDDDDDDD | Používá funkce SmartHeap společnosti MicroQuill a funkce Microsoft C / C ++ debug free () k označení uvolněné paměti haldy[23] |
DEAD10CC | "Mrtvý zámek", Označuje, že Jablko iOS aplikace byla ukončena, protože se držela na systémovém prostředku při běhu na pozadí[22] |
DEADBABE | "Mrtvé kotě", Používá se na začátku Křemíková grafika ' IRIX arénové soubory |
DEADBEEF | "Mrtvé hovězí maso", Skvěle používán na IBM systémy jako RS / 6000, používá se také v klasický Mac OS operační systémy, OPENSTEP Enterprise a Komodor Amiga. Na Sun Microsystems ' Solaris, označí uvolněnou paměť jádra (KMEM_FREE_PATTERN) |
DEADCAFE | "Mrtvá kavárna", Používá Microsoft .NET jako číslo chyby v DLL |
DEADC0DE | "Mrtvý kód", Používá se jako značka v OpenWRT firmware označuje začátek budoucího systému souborů jffs2 na konci statického firmwaru |
11. DEADFA | "Dead fail", Označuje, že Jablko iOS aplikace byla uživatelem vynucena[22] |
DEADF00D | „Mrtvé jídlo“, Používá Mungwall na internetu Komodor Amiga k označení přidělené, ale neinicializované paměti[25] |
ZRUŠENO | „Vyprázdněný“, Používá OpenSolaris skládky jádra |
Mrtvý | "Mrtvý Mrtvý" označuje, že uživatel úmyslně zahájil výpis stavu z ladicího programu jádra nebo z klávesnice.[26] |
EBEBEBEB | Z aplikace SmartHeap od společnosti MicroQuill |
FADEDEAD | "Fade mrtvý"Na konci identifikuje všechny AppleScript skript |
FDFDFDFD | Používá Microsoft Funkce C / C ++ debug malloc () k označení "země nikoho" strážní byty před a po přidělené haldě paměti,[23] a některé ladění zabezpečené C-Runtime funkce implementované společností Microsoft (např. strncat_s) [27] |
FEE1DEAD | "Cítit se mrtvý", Používá Linux restartujte () syscall |
FEEDFACE | "Feed face", Viděný v PowerPC Mach-O binární soubory zapnuty Apple Inc. je Operační Systém Mac plošina. Na Sun Microsystems ' Solaris, označuje červenou zónu (KMEM_REDZONE_PATTERN) Používá VLC přehrávač a nějaký IP kamery v RTP /RTCP protokol, přehrávač VLC odešle čtyři bajty v pořadí endianismus systému. Některé IP kamery očekávají, že hráč pošle toto magické číslo a nespustí stream, pokud není přijat. |
FEEEFEEE | „Poplatek“, Používá Microsoft ladění HeapFree () k označení uvolněné paměti haldy. Některé blízké interní hodnoty účetnictví mohou mít vysoké slovo nastaveno také na FEEE.[23] |
Většina z nich je 32 bity dlouhý - velikost slova většiny počítačů s 32bitovou architekturou.
Prevalence těchto hodnot v technologii společnosti Microsoft není náhoda; jsou podrobně popsány v Steve Maguire kniha Psaní pevného kódu z Microsoft Press. Pro tyto hodnoty uvádí řadu kritérií, například:
- Neměly by být užitečné; to znamená, že od většiny algoritmů, které na nich pracují, lze očekávat něco neobvyklého. Čísla jako nula nesplňují toto kritérium.
- Programátor by je měl snadno rozpoznat jako neplatné hodnoty v ladicím programu.
- Na strojích, které nemají zarovnání bajtů, měly by být lichá čísla, takže jejich dereferencování jako adresy způsobí výjimku.
- Pokud jsou spuštěny jako kód, měly by způsobit výjimku nebo možná dokonce debugger.
Protože se často používaly k označení oblastí paměti, které byly v podstatě prázdné, některé z těchto termínů se začaly používat ve frázích, které znamenají „pryč, zrušeno, vypuštěno z paměti“; např. „Váš program je DEADBEEF“[Citace je zapotřebí ].
Viz také
- Magická struna
- Formát souboru § Magické číslo
- Seznam podpisů souborů
- FourCC
- Tvrdé kódování
- Magic (programování)
- NaN (Není to číslo)
- Typ s výčtem
- Hexspeak, pro další sadu magických hodnot
- Nic v mém rukávu o magických konstantách v kryptografické algoritmy
- Chyby při formátování a ukládání času, pro problémy, které mohou být způsobeny magií
- Hodnota hlídky (aka hodnota příznaku, hodnota vypnutí, nepoctivá hodnota, hodnota signálu, figuríny)
- Kanárská hodnota, speciální hodnota pro detekci přetečení vyrovnávací paměti
- XYZZY (kouzelné slovo)
- Rychlá inverzní odmocnina pomocí konstanty 0x5F3759DF
Reference
- ^ A b C Martin, Robert C. (2009). „Kapitola 17: Vůně a heuristika - G25 Nahraďte magická čísla jmenovanými konstantami“. Clean Code - Příručka agilního softwarového zpracování. Boston: Prentice Hall. p.300. ISBN 978-0-13-235088-4.
- ^ Martin, Robert C. (2009). „Kapitola 17: Vůně a heuristika - skrytý záměr G16“. Clean Code - Příručka agilního softwarového zpracování. Boston: Prentice Hall. p.295. ISBN 978-0-13-235088-4.
- ^ Maguire, James (09.12.2008). „Bjarne Stroustrup na vzdělávání vývojářů softwaru“. Datamation.com. Archivovány od originál dne 23.06.2018.
- ^ Vogel, Jeff (2007-05-29). „Šest způsobů, jak napsat srozumitelnější kód“. Vývojář IBM.
- ^ „Zvláštní komentáře a podivné akce v Unixu“. Bell Labs. 2002-06-22. Archivovány od originál dne 04.11.2006.
- ^ Osobní komunikace s Dennisem M. Ritchiem.
- ^ „Unix Tree V6 / usr / sys / ken / sys1.c“. Unix Heritage Society. Archivovány od originál dne 2008-10-20.
- ^ „Unix Tree V7 / usr / sys / sys / sys1.c“. Unix Heritage Society. Archivovány od originál dne 2008-10-20.
- ^ „Specifikace PNG (Portable Network Graphics) Verze 1.0: 12.11. Podpis souboru PNG“. MIT. 1996-10-01.
- ^ Chen, Raymond (2008-03-24). "Jaký je rozdíl mezi příponami COM a EXE?". Stará nová věc. Archivovány od originál dne 2019-02-18.
- ^ A b C Paul, Matthias R. (03.04.2002). „[fd-dev] Ctrl + Alt + Del“. Freedos-dev. Archivováno z původního dne 2017-09-09. Citováno 2017-09-09. (Pozn. Uvádí řadu magických hodnot používaných IBM PC -kompatibilní BIOSy (0000h, 1234h), DOS správci paměti mají rádi EMM386 (1234h) a diskové mezipaměti jako SMARTDRV (EBABh, BABEh) a NWCACHE (0EDCh, EBABh, 6756h).)
- ^ „Proces spouštění systému BIOS / MBR“. NeoSmart Knowledgebase. 2015-01-25. Citováno 2019-02-03.
- ^ „Komunita TI E2E: Ví někdo, zda lze pomocí MCP CLI Tool provést následující konfigurace?“. Texas Instruments. 2011-08-27.
- ^ Poley, Josh (2009-09-30). „Magická čísla: celá čísla“. MSDN.
- ^ Nováček, Joseph M. (2001-10-13). „Správa zpráv: Zaručení jedinečnosti“. Developer Fusion. Citováno 2007-11-16.
- ^ Osterman, Larry (21. 7. 2005). „UUID jsou jedinečná, pouze pokud je generujete ...“ WebLog Larryho Ostermana - Vyznání staré mlhy. MSDN. Citováno 2007-11-16.
- ^ "Specifikace rodiny JRE verzí pro Java applety". Věštec. Citováno 2010-06-18.
- ^ „Instalace GNU GRUB, Oddíl 3.4: Instalace systému BIOS“. Gnu.org. Citováno 2014-06-26.
- ^ Heddings, Lowell (03.11.2014). „Magic Numbers: The Secret Codes that Programmers Hide in Your PC“. How-To Geek. Citováno 2017-10-03.
- ^ Cavit, Doug (2012-04-24). „Ochrana proti opětovnému použití zastaralých odkazů na objekty“. Microsoft Secure. Citováno 2018-07-26.
- ^ Boleyn, Erich Stefan (04.04.1995). „Komentáře k návrhu„ MultiBoot Standard ““. Uruk.org.
- ^ A b C d E F „Technická poznámka TN2151: Porozumění a analýza zpráv o selhání aplikace“. Dokumentace pro vývojáře Apple. 2009-01-29.
- ^ A b C d E F Birkett, Andrew. "Interní haldy ladění Win32 CRT". Nobugs.org.
- ^ McNamara, Paul (19. 7. 2012). „Microsoft code contains the phrase 'big boobs' ... Yes, really". Síťový svět.
- ^ Scheppner, Carolyn. "Amiga Mail Vol.2 Guide". Cataclysm.cx. Archivovány od originál dne 18.7.2011. Citováno 2010-08-20.
- ^ „Kontrola chyby 0xDEADDEAD MANUALLY_INITIATED_CRASH1“. Dokumentace Microsoftu.
- ^ „strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l“. Dokumentace Microsoftu. Citováno 2019-01-16.