Магическое число (программирование)
В компьютерном программировании является магическим числом любое из следующих чисел:
- Уникальное значение с необъяснимым значением или несколько вхождений, которое (предпочтительно) можно заменить именованной константой.
- Постоянное числовое или текстовое значение, используемое для идентификации формата файла или протокола. )
- Отличительное уникальное значение, которое вряд ли можно принять за другие значения (например, глобальные уникальные идентификаторы ).
Безымянные числовые константы
[ редактировать ]Термин «магическое число» или «магическая константа» относится к антипаттерну использования чисел непосредственно в исходном коде. Это было названо нарушением одного из старейших правил программирования, восходящего к руководствам по COBOL , FORTRAN и PL/1 1960-х годов. [ 1 ] Использование в коде безымянных магических чисел скрывает намерение разработчиков выбрать это число. [ 2 ] увеличивает вероятность незначительных ошибок (например, правильна ли каждая цифра в числе 3,14159265358979323846 и может ли быть округлена до 3,14159? [ 3 ] ) и затрудняет адаптацию и расширение программы в будущем. [ 4 ] Замена всех значащих магических чисел именованными константами (также называемыми объяснительными переменными) упрощает чтение, понимание и поддержку программ. [ 5 ]
Имена, выбранные так, чтобы они были значимыми в контексте программы, могут привести к тому, что код будет легче понять сопровождающему, который не является первоначальным автором (или даже исходному автору через определенный период времени). [ 6 ] Пример константы с неинформативным именем: int SIXTEEN = 16
, пока int NUMBER_OF_BITS = 16
носит более описательный характер.
Описанные выше проблемы, связанные с магическими «числами», не ограничиваются числовыми типами, этот термин также применяется к другим типам данных, где объявление именованной константы было бы более гибким и коммуникативным. [ 1 ] Таким образом, заявив const string testUserName = "John"
лучше, чем несколько вхождений «магического значения» "John"
в тестовом наборе .
Например, если требуется случайным образом перетасовать значения в массиве, представляющем стандартную колоду игральных карт , этот псевдокод выполняет эту работу, используя алгоритм перемешивания Фишера-Йейтса :
for i from 1 to 52 j := i + randomInt(53 - i) - 1 a.swapEntries(i, j)
где a
является объектом массива, функция randomInt(x)
выбирает случайное целое число от 1 до x включительно и swapEntries(i, j)
меняет местами i -ю и j -ю записи в массиве. В предыдущем примере 52
это магическое число. Считается, что лучшим стилем программирования будет написать следующее:
int deckSize:= 52 for i from 1 to deckSize j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j)
Это предпочтительнее по нескольким причинам:
- Это легче читать и понимать. Программист, читающий первый пример, может задаться вопросом: что здесь означает число 52? Почему 52? Программист может понять смысл после внимательного прочтения кода, но это неочевидно. [ 6 ] Магические числа становятся особенно запутанными, когда одно и то же число используется для разных целей в одном разделе кода.
- Значение числа легче изменить, поскольку оно не дублируется. Изменение значения магического числа чревато ошибками, поскольку одно и то же значение часто используется несколько раз в разных местах программы. [ 6 ] Кроме того, когда две семантически разные переменные или числа имеют одинаковое значение, они могут быть случайно отредактированы одновременно. [ 6 ] Чтобы изменить первый пример для перетасовки колоды Таро , состоящей из 78 карт, программист мог бы наивно заменить каждый экземпляр 52 в программе на 78. Это вызвало бы две проблемы. Во-первых, во второй строке примера будет пропущено значение 53, что приведет к скрытому сбою алгоритма. Во-вторых, он, скорее всего, заменит символы «52» повсюду, независимо от того, относятся ли они к размеру колоды или к чему-то совершенно другому, например количеству недель в григорианском календарном году, или, что более коварно, являются частью числа, например «1523», и все это приведет к ошибкам. Напротив, изменение значения
deckSize
переменная во втором примере будет простым изменением в одну строку. - Это поощряет и облегчает документацию. [ 6 ] Единственное место, где объявлена именованная переменная, является хорошим местом для документирования того, что означает это значение и почему оно имеет именно такое значение. Наличие одного и того же значения во множестве мест либо приводит к дублированию комментариев (и сопутствующим проблемам при обновлении некоторых, но пропущенных некоторых), либо не оставляет ни одного места, где для автора было бы естественно объяснить значение, и, вероятно, читатель будет искать объяснение. .
- Объявления переменных «магического числа» размещаются вместе, обычно в верхней части функции или файла, что облегчает их просмотр и изменение. [ 6 ]
- Это помогает обнаружить опечатки . Использование переменной (вместо литерала) использует преимущества проверки компилятора. Случайный ввод «62» вместо «52» останется незамеченным, тогда как ввод «
dekSize
" вместо "deckSize
" приведет к предупреждению компилятора о том, чтоdekSize
является необъявленным. - Это может уменьшить необходимость ввода текста в некоторых IDE . Если IDE поддерживает автодополнение кода , она заполнит большую часть имени переменной из первых нескольких букв.
- Это облегчает параметризацию. Например, чтобы обобщить приведенный выше пример в процедуру, которая тасует колоду с любым количеством карт, было бы достаточно перевернуть
deckSize
в параметр этой процедуры, тогда как первый пример потребует нескольких изменений.
function shuffle (int deckSize) for i from 1 to deckSize j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j)
Недостатками являются:
- Когда именованная константа не определена при ее использовании, это ухудшает локальность и, следовательно, понятность кода. Помещение числа 52 в возможно отдаленное место означает, что для полного понимания работы цикла «for» (например, для оценки времени выполнения цикла) необходимо отследить определение и убедиться, что это ожидаемое число. . Этого легко избежать (переместив объявление), если константа используется только в одной части кода. С другой стороны, когда именованная константа используется в разных частях, удаленное расположение является подсказкой для читателя о том, что то же значение появляется и в других местах кода, что, возможно, также стоит изучить.
- Это может сделать код более многословным. Объявление константы добавляет строку. Когда имя константы длиннее, чем значение, особенно если несколько таких констант встречаются в одной строке, может возникнуть необходимость разбить один логический оператор кода на несколько строк. Увеличение подробностей может быть оправдано, когда существует некоторая вероятность путаницы в отношении константы или когда существует вероятность того, что константу придется изменить, например, при повторном использовании процедуры перетасовки для других карточных игр. В равной степени это может быть оправдано увеличением выразительности.
- Возможно, обработка выражения будет медленнее
deckSize + 1
во время выполнения, чем значение «53», хотя большинство современных компиляторов и интерпретаторов заметят, чтоdeckSize
был объявлен как константа и предварительно вычислите значение 53 в скомпилированном коде. Даже если это невозможно, оптимизация цикла переместит сложение так, чтобы оно выполнялось до цикла. Поэтому обычно нет (или незначительное) снижение скорости по сравнению с использованием магических чисел в коде. В частности, стоимость отладки и время, необходимое для понимания необъяснимого кода, должны быть сопоставлены с крошечными затратами на вычисления.
Допустимое использование
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( Март 2010 г. ) |
В некоторых контекстах использование безымянных числовых констант является общепринятым (и, возможно, «не магическим»). Хотя такое принятие является субъективным и часто зависит от индивидуальных привычек программирования, типичными примерами являются следующие:
- использование 0 и 1 в качестве начальных или дополнительных значений в цикле for , например
for (int i = 0; i < max; i += 1)
- использование 2 для проверки того, является ли число четным или нечетным, как в
isEven = (x % 2 == 0)
, где%
это по модулю оператор - использование простых арифметических констант, например, в таких выражениях, как
circumference = 2 * Math.PI * radius
, [ 1 ] или для вычисления дискриминанта квадратного уравнения какd = b^2 − 4*a*c
- использование степеней 10 для преобразования метрических значений (например, между граммами и килограммами) или для расчета процентных и промилле значений
- показатели степени в таких выражениях, как
(f(x) ** 2 + f(y) ** 2) ** 0.5
для
Константы 1 и 0 иногда используются для представления логических например в старых версиях C. значений True и False в языках программирования без логического типа , Большинство современных языков программирования предоставляют boolean
или bool
примитивный тип , поэтому использование 0 и 1 не рекомендуется. Это может сбить с толку, поскольку 0 иногда означает программный успех (когда -1 означает неудачу), а в других случаях — неудачу (когда 1 означает успех).
В C и C++ 0 представляет собой нулевой указатель . Как и в случае с логическими значениями, стандартная библиотека C включает определение макроса. NULL
использование которых поощряется. Другие языки обеспечивают специфическую null
или nil
значение, и в этом случае не следует использовать альтернативу. Типизированная константа указателя nullptr
был представлен в C++11.
Индикаторы формата
[ редактировать ]Источник
[ редактировать ]Индикаторы формата впервые использовались в ранней версии 7 Unix . исходном коде [ нужна ссылка ]
Unix был портирован на один из первых DEC PDP-11 /20, не имевший защиты памяти . Поэтому ранние версии Unix использовали эталонную модель перемещаемой памяти . [ 7 ] до Версии Unix шестого издания считывали исполняемый файл в память и переходили к первому младшему адресу памяти программы, относительному нулевому адресу. С развитием страничных версий Unix был создан заголовок для описания компонентов исполняемого образа . Кроме того, инструкция перехода в качестве первого слова заголовка была вставлена , позволяющая пропустить заголовок и запустить программу. Таким образом, программу можно было запускать в старом режиме ссылки на перемещаемую память (обычном) или в страничном режиме. По мере разработки большего количества исполняемых форматов добавлялись новые константы путем увеличения смещения ветвления . [ 8 ]
В загрузчика программ Unix шестой редакции исходном коде функция exec() считывает исполняемый ( двоичный ) образ из файловой системы. Первые 8 байт файла представляли собой заголовок , содержащий размеры программной (текстовой) и инициализированных (глобальных) областей данных. Кроме того, первое 16-битное слово заголовка сравнивалось с двумя константами , чтобы определить, ли исполняемый образ содержит ссылки на перемещаемую память (обычные), недавно реализованный страничный исполняемый образ, доступный только для чтения, или разделенное страничное изображение инструкции и данных. [ 9 ] О двойной роли константы заголовка не упоминалось, но старший байт константы фактически был кодом операции для инструкции ветвления PDP-11 ( восьмеричное 000407 или шестнадцатеричное 0107). Добавление семи к счетчику программы показало, что если эта константа будет выполнена , она разветвит службу Unix exec() по восьмибайтовому заголовку исполняемого образа и запустит программу.
Поскольку в шестом и седьмом изданиях Unix использовался страничный код, двойная роль константы заголовка была скрыта. То есть служба exec() считывает данные заголовка исполняемого файла ( мета ) в буфер пространства ядра , но считывает исполняемый образ в пространство пользователя , тем самым не используя функцию ветвления константы. Unix Создание магических чисел было реализовано в компоновщике и загрузчике , а ветвление магических чисел, вероятно, все еще использовалось в наборе автономных диагностических программ , поставляемых с шестой и седьмой редакциями. Таким образом, константа заголовка действительно создавала иллюзию и соответствовала критериям магии .
В седьмой версии Unix константа заголовка не проверялась напрямую, а присваивалась переменной с меткой ux_mag. [ 10 ] и впоследствии названное магическим числом . Вероятно, из-за своей уникальности термин «магическое число» стал обозначать тип исполняемого формата, затем расширился до типа файловой системы и снова расширился до обозначения любого типа файла.
В файлах
[ редактировать ]Магические числа распространены в программах во многих операционных системах. Магические числа реализуют строго типизированные данные и являются формой внутриполосной передачи сигналов управляющей программе, которая считывает типы данных во время выполнения программы. Многие файлы имеют такие константы, которые идентифицируют содержащиеся в них данные. Обнаружение таких констант в файлах является простым и эффективным способом различения многих форматов файлов во время выполнения и может предоставить дополнительную информацию .
- Примеры
- Скомпилированные файлы классов Java ( байт-код ) и двоичные файлы Mach-O начинаются с шестнадцатеричного значения.
CAFEBABE
. При сжатии с помощью Pack200 байты изменяются наCAFED00D
. - GIF Файлы изображений имеют код ASCII «GIF89a» (
47
49
46
38
39
61
) или «GIF87a» (47
49
46
38
37
61
) - Файлы изображений JPEG начинаются с
FF
D8
и закончить наFF
D9
. Файлы JPEG/ JFIF содержат завершаемую нулем строку «JFIF» (4A
46
49
46
00
). Файлы JPEG/ Exif содержат строку «Exif» с нулевым завершением (45
78
69
66
00
), а затем дополнительные метаданные о файле. - Файлы изображений PNG начинаются с 8- байтовой подписи, которая идентифицирует файл как файл PNG и позволяет обнаружить распространенные проблемы передачи файлов: «\211PNG\r\n\032\n» (
89
50
4E
47
0D
0A
1A
0A
). Эта подпись содержит различные символы новой строки , позволяющие обнаруживать необоснованные автоматические преобразования новой строки, такие как передача файла по FTP с ASCII режимом передачи вместо двоичного режима. [ 11 ] - Стандартные MIDI аудиофайлы код ASCII » MIDI имеют стойки заголовок MThd , ( для «
4D
54
68
64
), за которым следуют дополнительные метаданные. - Сценарии Unix или Linux могут начинаться с символа шебанга ("#!"),
23
21
), за которым следует путь к интерпретатору , если интерпретатор, вероятно, отличается от того, из которого был вызван скрипт. - Исполняемые файлы ELF начинаются с байта
7F
за которым следует "ЭЛЬФ" (7F
45
4C
46
). - Файлы и программы PostScript начинаются с «%!» (
25
21
). - PDF- файлы начинаются с «%PDF» (шестнадцатеричный
25
50
44
46
). - DOS MZ Исполняемые файлы и заглушки EXE файлов Microsoft Windows PE (Portable Executable) начинаются с символов «MZ» (
4D
5A
), инициалы дизайнера формата файла Марка Збиковски . Определение допускает необычное «ЗМ» (5A
4D
), а также для dosZMXP, EXE-файла, отличного от PE. [ 12 ] - Формат суперблока Berkeley Fast File System идентифицируется как
19
54
01
19
или01
19
54
в зависимости от версии; оба представляют день рождения автора, Маршалла Кирка МакКьюсика . - Основная загрузочная запись загрузочных устройств хранения данных почти на всех IA-32, компьютерах, совместимых с IBM имеет код
55
AA
как его последние два байта. - Исполняемые файлы для портативных игровых систем Game Boy и Game Boy Advance имеют магическое число длиной 48 или 156 байт соответственно в фиксированном месте в заголовке. Это магическое число кодирует растровое изображение логотипа Nintendo .
- программного обеспечения Amiga Все исполняемые Hunk файлы , работающие на классических машинах Amiga 68000 , начинались с шестнадцатеричного числа $000003f3, получившего прозвище «Magic Cookie».
- В Amiga единственным абсолютным адресом в системе является шестнадцатеричный $0000 0004 (ячейка памяти 4), который содержит начальную позицию, называемую SysBase, указатель на exec.library, так называемое ядро Amiga.
- Файлы PEF , используемые классической Mac OS и BeOS для исполняемых файлов PowerPC , содержат код ASCII для «Joy!» (
4A
6F
79
21
) в качестве префикса. - Файлы TIFF начинаются с «II» или «MM», за которыми следует цифра 42 в виде двухбайтового целого числа с прямым или прямым порядком байтов. «II» относится к Intel, которая использует порядок байтов с прямым порядком байтов , поэтому магическое число равно
49
49
2A
00
. «ММ» относится к компании Motorola, которая использует обратный порядок байтов, поэтому магическое число4D
4D
00
2A
. - Unicode Текстовые файлы , закодированные в UTF-16, часто начинаются с метки порядка байтов для определения порядка байтов (
FE
FF
для прямого порядка байтов иFF
FE
для прямого байта). А в Microsoft Windows текстовые файлы UTF-8 часто начинаются с кодировки UTF-8 того же символа,EF
BB
BF
. - Файлы биткода LLVM начинаются с «BC» (
42
43
). - Файлы WAD начинаются с «IWAD» или «PWAD» (для Doom ), «WAD2» (для Quake ) и «WAD3» (для Half-Life ).
- Microsoft Файлы двоичного формата составных файлов (чаще всего известный как один из старых форматов документов Microsoft Office ) начинаются с
D0
CF
11
E0
, что визуально напоминает слово «DOCFILE0». - Заголовки ZIP- файлов часто отображаются в текстовых редакторах как «PK♥♦» (
50
4B
03
04
), где «PK» — инициалы Фила Каца , автора DOS утилиты сжатия PKZIP . - Заголовки в файлах 7z начинаются с «7z» (полное магическое число:
37
7A
BC
AF
27
1C
).
- Обнаружение
Утилита Unix file
может читать и интерпретировать магические числа из файлов, а файл, который используется для анализа информации, называется магическим . Утилита Windows TrID имеет аналогичную цель.
В протоколах
[ редактировать ]- Примеры
- Протокол OSCAR , используемый в AIM / ICQ , предваряет запросы префиксом
2A
. - В протоколе RFB, используемом VNC , клиент начинает разговор с сервером, отправляя «RFB» (
52
46
42
, для «Удаленного буфера кадров»), за которым следует номер версии протокола клиента. - В протоколе SMB , используемом Microsoft Windows, каждый запрос SMB или ответ сервера начинается с «
FF
53
4D
42
', или"\xFFSMB"
в начале запроса SMB. - В протоколе MSRPC, используемом Microsoft Windows, каждый запрос TCP начинается с
05
в начале запроса (представляющего Microsoft DCE/RPC версии 5), за которым сразу следует00
или01
для минорной версии. В запросах MSRPC на основе UDP первый байт всегда04
. - В COM и DCOM маршалируемых интерфейсах , называемых OBJREF , всегда начинается с последовательности байтов «MEOW» (
4D
45
4F
57
). Расширения отладки (используемые для перехвата канала DCOM) начинаются с последовательности байтов «MARB» (4D
41
52
42
). - Незашифрованные запросы трекера BitTorrent начинаются с одного байта, содержащего значение
19
представляет длину заголовка, за которой сразу следует фраза «Протокол BitTorrent» в позиции 1 байта. - Трафик eDonkey2000 / eMule начинается с одного байта, обозначающего версию клиента. В настоящее время
E3
представляет клиента eDonkey,C5
представляет eMule, иD4
представляет собой сжатый файл eMule. - Первые 4 байта блока в блокчейне Биткойна содержат магическое число, которое служит идентификатором сети. Значение является константой
0xD9B4BEF9
, что указывает на основную сеть, а константа0xDAB5BFFA
указывает на тестовую сеть. - Транзакции SSL всегда начинаются с сообщения «привет клиенту». Схема инкапсуляции записей, используемая для префикса всех пакетов SSL, состоит из двух- и трехбайтовых заголовков. Обычно приветственное сообщение клиента SSL версии 2 начинается с префикса
80
и ответ сервера SSLv3 на приветствие клиента начинается с16
(хотя это может отличаться). - Пакеты DHCP используют значение «волшебного файла cookie» '
0x63
0x82
0x53
0x63
' в начале раздела параметров пакета. Это значение включено во все типы пакетов DHCP. - HTTP/2 -соединения открываются с предисловием '
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
', или "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
". Предисловие предназначено для того, чтобы избежать обработки кадров серверами и посредниками, поддерживающими более ранние версии HTTP, но не 2.0.
В интерфейсах
[ редактировать ]Магические числа часто встречаются в функциях API и интерфейсах многих операционных систем , включая DOS , Windows и NetWare :
- Примеры
- IBM PC -совместимые BIOS используют магические значения
0000
и1234
чтобы решить, должна ли система подсчитывать память или нет при перезагрузке, тем самым выполняя холодную или теплую загрузку. Эти значения также используются менеджерами памяти EMM386, перехватывающими запросы на загрузку. [ 13 ] BIOS также использует магические значения55 AA
чтобы определить, является ли диск загрузочным. [ 14 ] - MS -DOS Дисковый кэш SMARTDRV (под кодовым названием «Bambi») использует магические значения BABE и EBAB в функциях API. [ 13 ]
- Многие драйверы DR DOS , Novell DOS и OpenDOS, разработанные в бывшем Европейском центре развития в Великобритании, используют значение 0EDC в качестве магического токена при вызове или предоставлении дополнительных функций поверх (эмулируемых) стандартных функций DOS, одним из примеров является NWCACHE. [ 13 ]
Другое использование
[ редактировать ]- Примеры
Ограничения типов данных
[ редактировать ]Это список ограничений типов хранения данных: [ 16 ]
Десятичный | Шестигранник | Описание |
---|---|---|
18,446,744,073,709,551,615 | ФФФФ ФФФФ ФФФ ФФФФ | Максимальное 64-битное значение без знака (2 64 − 1) |
9,223,372,036,854,775,807 | 7ФФФ ФФФФ ФФФ ФФФФ | Максимальное 64-битное значение со знаком (2 63 − 1) |
9,007,199,254,740,992 | 0020 0000 0000 0000 | Самое большое последовательное целое число в двойной точности IEEE 754 (2 53 ) |
4,294,967,295 | ФФФФ ФФФФ | Максимальное 32-битное значение без знака (2 32 − 1) |
2,147,483,647 | 7ФФФ ФФФФ | Максимальное 32-битное значение со знаком (2 31 − 1) |
16,777,216 | 0100 0000 | Самое большое последовательное целое число в стандарте одинарной точности IEEE 754 (2 24 ) |
65,535 | ФФФФ | Максимальное 16-битное значение без знака (2 16 − 1) |
32,767 | 7ФФФ | Максимальное 16-битное значение со знаком (2 15 − 1) |
255 | ФФ | Максимальное 8-битное значение без знака (2 8 − 1) |
127 | 7F | Максимальное 8-битное значение со знаком (2 7 − 1) |
−128 | 80 | Минимальное 8-битное значение со знаком |
−32,768 | 8000 | Минимальное 16-битное значение со знаком |
−2,147,483,648 | 8000 0000 | Минимальное 32-битное значение со знаком |
−9,223,372,036,854,775,808 | 8000 0000 0000 0000 | Минимальное 64-битное значение со знаком |
GUID
[ редактировать ]Можно создавать или изменять глобальные уникальные идентификаторы (GUID), чтобы они запоминались, но это крайне не рекомендуется, поскольку это ставит под угрозу их силу как почти уникальных идентификаторов. [ 17 ] [ 18 ] Спецификации для генерации GUID и UUID довольно сложны, поэтому при правильной реализации они практически уникальны. [ 19 ]
Идентификаторы продуктов Microsoft Windows для продуктов Microsoft Office иногда заканчиваются на 0000-0000-0000000FF1CE
(«ОФИС»), например { 90160000-008C-0000-0000-0000000FF1CE
}, идентификатор продукта для «Компонента расширения Office 16 «нажми и работай».
Java использует несколько GUID, начиная с CAFEEFAC
. [ 20 ]
В таблице разделов GUID схемы разделов GPT загрузочные разделы BIOS используют специальный GUID { 21686148-6449-6E6F-744E-656564454649
} [ 21 ] который не соответствует определению GUID; вместо этого он формируется с использованием кодов ASCII для строки " Hah!IdontNeedEFI
"частично в прямом порядке. [ 22 ]
Отладочные значения
[ редактировать ]Магические значения отладки — это особые значения, записываемые в память во время выделения или освобождения, чтобы позже можно было определить, были ли они повреждены, а также сделать очевидным, когда используются значения, взятые из неинициализированной памяти. Память обычно рассматривается в шестнадцатеричном формате, поэтому запоминающиеся повторяющиеся или шестнадцатеричные часто встречаются значения. Предпочтительнее использовать числовые нечетные значения, чтобы процессоры без байтовой адресации выдавали ошибку при попытке использовать их в качестве указателей (которые должны приходиться на четные адреса). Значения следует выбирать вдали от вероятных адресов (код программы, статические данные, данные кучи или стек). Аналогично, они могут быть выбраны так, чтобы они не были допустимыми кодами в наборе команд для данной архитектуры.
Поскольку очень маловероятно, хотя и возможно, что 32-битное целое число приняло бы именно это значение, появление такого числа в отладчике или дампе памяти, скорее всего, указывает на такую ошибку, как переполнение буфера или неинициализированная переменная .
Известные и распространенные примеры включают:
Код | Описание |
---|---|
00008123 |
Используется в MS Visual C++. Удаленным указателям присваивается это значение, поэтому они выдают исключение при их использовании после; это более узнаваемый псевдоним нулевого адреса. Он активируется с помощью параметра «Жизненный цикл разработки безопасности» (/sdl). [ 23 ] |
..FACADE |
«Фасад» , используется рядом ОСРВ. |
1BADB002 |
«1 плохая загрузка» , мультизагрузки магический номер заголовка [ 24 ] |
8BADF00D |
«Съел плохую еду» . Указывает, что приложение Apple iOS было закрыто из-за истечения времени ожидания сторожевого таймера. [ 25 ] |
A5A5A5A5 |
Используется при разработке встроенных систем, поскольку переменный битовый шаблон (1010 0101) создает легко распознаваемый шаблон на осциллографах и логических анализаторах . |
A5 |
Используется в FreeBSD PHK malloc(3) для отладки, когда /etc/malloc.conf имеет символическую ссылку на "-J" для инициализации всей вновь выделенной памяти, поскольку это значение не является нулевым указателем или символом ASCII NUL. |
ABABABAB |
Используется отладочной функцией HeapAlloc() от Microsoft «ничейной зоны» для пометки защитных байтов после выделенной памяти кучи. [ 26 ] |
ABADBABE |
«Плохой малыш» , используется Apple как магическое число «Boot Zero Block». |
ABBABABE |
« ABBA baby» , используемая кучей памяти Driver Parallel Lines . |
ABADCAFE |
«Плохое кафе» , Используется для инициализации всей нераспределенной памяти (Mungwall, AmigaOS ) |
B16B00B5 |
«Большие сиськи» , ранее требовалось Hyper гипервизором Microsoft -V для использования гостями Linux в качестве верхней половины их «идентификатора гостя». [ 27 ] |
BAADF00D |
«Плохая еда» . Используется отладочной функцией HeapAlloc() от Microsoft для обозначения неинициализированной выделенной памяти в куче. [ 26 ] |
BAAAAAAD |
«Baaaaaad» . Указывает, что журнал Apple iOS представляет собой снимок всей системы, а не отчет о сбое. [ 25 ] |
BAD22222 |
«Слишком плохо» . Указывает, что приложение Apple iOS VoIP было прекращено, поскольку оно возобновлялось слишком часто. [ 25 ] |
BADBADBADBAD |
«Плохо-плохо-плохо» , «неинициализированная» память больших систем Берроуза (48-битные слова) |
BADC0FFEE0DDF00D |
«Плохой кофе, странная еда» , используется в 64-битных системах IBM RS / 6000 для обозначения неинициализированных регистров ЦП. |
BADDCAFE |
«Плохое кафе» , в Sun Microsystems от Solaris , отмечает неинициализированную память ядра (KMEM_UNINITIALIZED_PATTERN). |
BBADBEEF |
«Bad beef» , используется в WebKit для особо неисправимых ошибок. [ 28 ] |
BEBEBEBE |
Используется AddressSanitizer для заполнения выделенной, но не инициализированной памяти. [ 29 ] |
BEEFCACE |
«Говяжий пирог» , используется Microsoft .NET как магическое число в файлах ресурсов. |
C00010FF |
«Охладить» означает, что приложение Apple iOS было закрыто операционной системой в ответ на перегрев. [ 25 ] |
CAFEBABE |
«Cafe baby» , используется Java для файлов классов. |
CAFED00D |
«Кафе чувак» , используется Java для Pack200. сжатия |
CAFEFEED |
«Кафе-канал» используется Sun Microsystems ядром отладки Solaris , для маркировки памяти kmemfree(). |
CCCCCCCC |
Используется памяти библиотекой времени выполнения отладки Microsoft C++ и многими средами DOS для маркировки неинициализированной стека . CC — это код операции прерывания точки останова отладки INT 3 на процессорах x86. [ 30 ]
|
CDCDCDCD |
Используется функцией отладки malloc() Microsoft C/C++ для маркировки неинициализированной кучи памяти, обычно возвращаемой из HeapAlloc(). [ 26 ] |
0D15EA5E |
«Нулевая болезнь» . Используется как флаг, обозначающий регулярную загрузку на GameCube и Wii консолях . |
DDDDDDDD |
Используется функцией SmartHeap компании MicroQuill и функцией отладки free() Microsoft C/C++ для маркировки освобожденной памяти кучи. [ 26 ] |
DEAD10CC |
«Мертвая блокировка» . Указывает, что приложение Apple iOS было прекращено, поскольку оно удерживало системный ресурс во время работы в фоновом режиме. [ 25 ] |
DEADBABE |
«Dead baby» , используется в начале Silicon Graphics. от IRIX файлов арены |
DEADBEEF |
«Мёртвая говядина» , широко используемая в таких системах IBM , как RS/6000 , а также в Mac OS классических операционных системах , OPENSTEP Enterprise и Commodore Amiga . В Sun Microsystems Solaris помечается освобожденная память ядра (KMEM_FREE_PATTERN). |
DEADCAFE |
«Мертвое кафе» , используется Microsoft .NET как номер ошибки в DLL. |
DEADC0DE |
«Мертвый код» . Используется в качестве маркера в прошивке OpenWRT для обозначения начала создаваемой файловой системы jffs2 в конце статической прошивки. |
DEADFA11 |
«Неустранимый сбой» . Указывает, что приложение Apple iOS было принудительно закрыто пользователем. [ 25 ] |
DEADF00D |
«Мертвая пища» , использовалась Мунгволлом на Commodore Amiga для обозначения выделенной, но неинициализированной памяти. [ 31 ] |
DEFEC8ED |
«Дефекация» , используется для OpenSolaris. дампов ядра |
DEADDEAD |
«Dead Dead» означает, что пользователь намеренно инициировал аварийный дамп либо с помощью отладчика ядра, либо с клавиатуры в Microsoft Windows. [ 32 ] |
D00D2BAD
|
«Чувак, слишком плохо», используемый Safari, аварийно завершает работу на macOS Big Sur. [ 33 ] |
EBEBEBEB |
Из SmartHeap от MicroQuill |
FADEDEAD |
«Fade Dead» . Идет в конце, чтобы идентифицировать каждый AppleScript сценарий . |
FDFDFDFD |
Используется функцией отладки malloc() Microsoft «ничейной зоны» C/C++ для пометки защитных байтов до и после выделенной кучи памяти. [ 26 ] и некоторые функции отладки Secure C-Runtime, реализованные Microsoft (например, strncat_s). [ 34 ] |
FEE1DEAD |
«Чувствовать себя мертвым» , используется в Linux системным вызовом restart() . |
FEEDFACE |
«Feed face» , встречается в двоичных файлах PowerPC Mach-O на Apple Inc. платформе Mac OSX компании В Sun Microsystems Solaris отмечена красная зона (KMEM_REDZONE_PATTERN).
Используемый проигрывателем VLC и некоторыми IP-камерами по протоколу RTP / RTCP , проигрыватель VLC отправляет четыре байта в порядке байтов системы . Некоторые IP-камеры ожидают, что игрок отправит это магическое число, и не запускают поток, если оно не получено. |
FEEEFEEE |
«Комиссия» , используется отладочной функцией HeapFree() от Microsoft для обозначения освобожденной кучи памяти. Некоторые близлежащие внутренние бухгалтерские значения также могут иметь старшее слово FEEE. [ 26 ] |
Большинство из них имеют длину 32 бита — размер слова большинства компьютеров с 32-битной архитектурой.
Преобладание этих ценностей в технологиях Microsoft не случайно; они подробно обсуждаются в Стива Магуайра книге «Написание надежного кода», изданной Microsoft Press . Он дает различные критерии этих ценностей, такие как:
- Они не должны быть полезными; то есть следует ожидать, что большинство алгоритмов, которые с ними работают, будут делать что-то необычное. Числа вроде нуля не соответствуют этому критерию.
- Программист должен легко распознать их как недопустимые значения в отладчике.
- На машинах, где нет выравнивания по байтам , они должны быть нечетными числами , поэтому разыменование их как адресов вызовет исключение.
- Они должны вызывать исключение или, возможно, даже прерывание работы отладчика, если выполняются как код.
Поскольку они часто использовались для обозначения областей памяти, которые были по существу пустыми, некоторые из этих терминов стали использоваться во фразах, означающих «ушло, прервано, сброшено из памяти»; например, «Ваша программа DEADBEEF». [ нужна ссылка ]
См. также
[ редактировать ]- Волшебная строка
- Формат файла § Магическое число
- Список подписей файлов
- ЧетыреCC
- Жесткое кодирование
- Магия (программирование)
- NaN (не число)
- Перечислимый тип
- Hexspeak — еще один список магических значений.
- Ничего не знаю о магических константах в криптографических алгоритмах.
- Ошибки форматирования и хранения времени , проблемы, которые могут быть вызваны магией.
- Значение Sentinel (также известное как значение флага, значение отключения, мошенническое значение, значение сигнала, фиктивные данные)
- Канарское значение , специальное значение для обнаружения переполнения буфера.
- ХИЗЗИ (волшебное слово)
- Быстрый обратный квадратный корень — алгоритм, использующий константу 0x5F3759DF.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с Мартин, Роберт С. (2009). «Глава 17: Запахи и эвристика - G25 заменяет магические числа именованными константами». Чистый код — руководство по созданию гибкого программного обеспечения . Бостон: Прентис Холл. п. 300 . ISBN 978-0-13-235088-4 .
- ^ Мартин, Роберт С. (2009). «Глава 17: Запахи и эвристика - Скрытое намерение G16». Чистый код — Руководство по созданию гибкого программного обеспечения . Бостон: Прентис Холл. п. 295 . ISBN 978-0-13-235088-4 .
- ^ Контьери, Макси (20 октября 2020 г.). «Код Smell 02 — Константы и магические числа» . Максимилиано Контьери — Разработка программного обеспечения . Проверено 21 марта 2024 г.
- ^ Магуайр, Джеймс (9 декабря 2008 г.). «Бьерн Страуструп об обучении разработчиков программного обеспечения» . Datamation.com . Архивировано из оригинала 23 июня 2018 г.
- ^ Фогель, Джефф (29 мая 2007 г.). «Шесть способов написать более понятный код» . Разработчик IBM . Архивировано из оригинала 26 сентября 2018 г.
- ^ Перейти обратно: а б с д и ж Пол, Матиас Р. (9 апреля 2002 г.). «[fd-dev] CuteMouse 2.0 альфа 1» . freedos-dev . Архивировано из оригинала 7 апреля 2022 г. Проверено 4 августа 2022 г.
- ^ «Странные комментарии и странные действия в Unix» . Лаборатории Белла . 22 июня 2002 г. Архивировано из оригинала 4 ноября 2006 г.
- ^ Личное общение с Деннисом М. Ричи.
- ^ «Дерево Unix V6/usr/sys/ken/sys1.c» . Общество наследия Unix . Архивировано из оригинала 26 марта 2023 г.
- ^ «Дерево Unix V7/usr/sys/sys/sys1.c» . Общество наследия Unix . Архивировано из оригинала 26 марта 2023 г.
- ^ «Спецификация PNG (переносимая сетевая графика) версии 1.0: 12.11. Подпись файла PNG» . Массачусетский технологический институт . 01.10.1996. Архивировано из оригинала 26 марта 2023 г.
- ^ Чен, Раймонд (24 марта 2008 г.). «В чем разница между расширениями COM и EXE?» . Старая новая вещь . Архивировано из оригинала 18 февраля 2019 г.
- ^ Перейти обратно: а б с Пол, Матиас Р. (3 апреля 2002 г.). «[fd-dev] Ctrl+Alt+Del» . freedos-dev . Архивировано из оригинала 9 сентября 2017 г. Проверено 9 сентября 2017 г. (Примечание. Упоминается ряд магических значений, используемых IBM PC -совместимыми BIOS (0000h, 1234h), DOS менеджерами памяти , такими как EMM386 (1234h), и дисковыми кэшами, такими как SMARTDRV (EBABh, BABEh) и NWCACHE (0EDCh, EBABh, 6756h). )
- ^ «Процесс загрузки BIOS/MBR» . База знаний NeoSmart . 25 января 2015 г. Архивировано из оригинала 26 марта 2023 г. Проверено 3 февраля 2019 г.
- ^ «Сообщество TI E2E: кто-нибудь знает, можно ли выполнить следующие конфигурации с помощью инструмента MCP CLI?» . Техасские инструменты . 27 августа 2011 г. Архивировано из оригинала 07.10.2022.
- ^ Поли, Джош (30 сентября 2009 г.). «Магические числа: целые числа» . Учиться . Майкрософт . Архивировано из оригинала 28 марта 2023 г.
- ^ Новичок, Джозеф М. (13 октября 2001 г.). «Управление сообщениями: гарантия уникальности» . Разработчик Fusion . Архивировано из оригинала 21 апреля 2005 г. Проверено 16 ноября 2007 г.
- ^ Остерман, Ларри (21 июля 2005 г.). «UUID уникальны только в том случае, если вы их генерируете…» Веб-журнал Ларри Остермана — «Исповедь старой туманности» . MSDN. Архивировано из оригинала 28 марта 2023 г. Проверено 16 ноября 2007 г.
- ^ «RFC 9562 — Универсально уникальные идентификаторы (UUID)» . ietf.org . Май 2024 года . Проверено 9 августа 2024 г.
- ^ «Развертывание Java-апплетов с семейными версиями JRE в подключаемом модуле Java для Internet Explorer» . Оракул . Архивировано из оригинала 30 ноября 2022 г. Проверено 28 марта 2023 г.
- ^ «Установка GNU GRUB, Раздел 3.4: Установка BIOS» . Gnu.org . Архивировано из оригинала 15 марта 2023 г. Проверено 26 июня 2014 г.
- ^ Хеддингс, Лоуэлл (3 ноября 2014 г.). «Волшебные числа: секретные коды, которые программисты прячут в вашем компьютере» . Как компьютерщик . Архивировано из оригинала 26 марта 2023 г. Проверено 3 октября 2017 г.
- ^ Кавит, Дуг (24 апреля 2012 г.). «Защита от повторного использования устаревших ссылок на объекты» . Microsoft Secure . Архивировано из оригинала 26 июля 2018 г. Проверено 26 июля 2018 г.
- ^ Болейн, Эрих Стефан (4 апреля 1995 г.). «Комментарии к предложению «MultiBoot Standard»» . Урук.орг . Архивировано из оригинала 26 марта 2023 г.
- ^ Перейти обратно: а б с д и ж «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений» . Документация разработчика Apple . 29 января 2009 г. Архивировано из оригинала 13 декабря 2018 г.
- ^ Перейти обратно: а б с д и ж Биркетт, Эндрю. «Внутреннее устройство кучи CRT отладки Win32» . Nobugs.org .
- ^ Макнамара, Пол (19 июля 2012 г.). «Код Microsoft содержит фразу «большие сиськи»… Да, правда» . Сетевой мир .
- ^ WebKit , Проект с открытым исходным кодом WebKit, 6 января 2023 г. , получено 6 января 2023 г.
- ^ «AddressSanitizer — Часто задаваемые вопросы» . Гитхаб . Проверено 18 мая 2022 г.
- ^ «INTEL 80386 Справочное руководство для программиста» . Массачусетский технологический институт .
- ^ Шеппнер, Кэролайн. «Руководство по Amiga Mail Vol.2» . Катаклизм.cx . Архивировано из оригинала 18 июля 2011 г. Проверено 20 августа 2010 г.
- ^ «Проверка ошибок 0xDEADDEAD MANUALLY_INITIATED_CRASH1» . Документация Майкрософт . 19 июня 2023 г.
- ^ «Версия Safari 14.0.1 неожиданно завершает работу» .
- ^ «strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l» . Документация Майкрософт . Проверено 16 января 2019 г.