Магическое число (программирование) - Magic number (programming) - Wikipedia

В компьютерное программирование, период, термин магическое число имеет несколько значений. Это может относиться к одному или нескольким из следующего:

  • Уникальные значения с необъяснимым значением или множественные вхождения, которые можно (желательно) заменить именованными константами
  • Постоянное числовое или текстовое значение, используемое для идентификации формат файла или протокол; для файлов см. Список подписей файлов
  • Отличительные уникальные значения, которые вряд ли можно будет принять за другие значения (например, Глобальные уникальные идентификаторы )

Безымянные числовые константы

Период, термин магическое число или же магическая константа относится к антипаттерн использования чисел непосредственно в исходном коде. Это было названо нарушением одного из старейших правил программирования, восходящего к КОБОЛ, FORTRAN и PL / 1 пособия 1960-х гг.[1] Использование безымянных магических чисел в коде затемняет намерение разработчиков выбрать это число,[2] увеличивает возможности для незначительных ошибок (например, правильно ли каждая цифра в 3,14159265358979323846 и равно ли это 3,14159?) и затрудняет адаптацию и расширение программы в будущем.[3] Замена всех значащих магических чисел на named константы упрощает чтение, понимание и обслуживание программ.[4]

Имена, выбранные так, чтобы иметь смысл в контексте программы, могут привести к тому, что код будет легче понять сопровождающему, который не является первоначальным автором (или даже первоначальным автором по прошествии некоторого времени). Примером неинформативно названной константы является int ШЕСТНАДЦАТЬ = 16, пока интервал NUMBER_OF_BITS = 16 более описательный.

Проблемы, связанные с магическими «числами», описанными выше, не ограничиваются числовыми типами, и этот термин также применяется к другим типам данных, где объявление именованной константы было бы более гибким и коммуникативным.[1] Таким образом, объявив const string testUserName = "Джон" лучше, чем несколько вхождений "магического значения" "Джон" в тестирование.

Например, если требуется случайным образом перемешать значения в массиве, представляющем стандартный пакет играя в карты, это псевдокод выполняет свою работу, используя Перемешивание Фишера – Йетса алгоритм:

   за я из 1 к 52 j: = i + randomInt (53 - i) - 1 a.swapEntries (i, j)

куда а является объектом массива, функция randomInt (x) выбирает случайное целое число от 1 до Икс, включительно, и swapEntries (i, j) меняет местами яй и jth записей в массиве. В предыдущем примере 52 это магическое число. Считается лучшим стилем программирования написать следующее:

   постоянный int deckSize: = 52 за я из 1 к deckSize j: = i + randomInt (deckSize + 1 - i) - 1 a.swapEntries (i, j)

Это предпочтительно по нескольким причинам:

  • Легче читать и понимать. Программист, читающий первый пример, может задаться вопросом: Что здесь означает число 52? Почему 52? Программист может понять смысл после внимательного прочтения кода, но это неочевидно. Магические числа становятся особенно запутанными, когда одно и то же число используется для разных целей в одном разделе кода.
  • Значение числа легче изменить, так как оно не дублируется. Изменение значения магического числа подвержено ошибкам, потому что одно и то же значение часто используется несколько раз в разных местах программы. Кроме того, когда две семантически разные переменные или числа имеют одинаковое значение, они могут быть случайно отредактированы вместе. Чтобы изменить первый пример, чтобы перемешать Таро колода, в которой 78 карт, программист мог бы наивно заменить каждый экземпляр 52 в программе на 78. Это вызовет две проблемы. Во-первых, он пропустит значение 53 во второй строке примера, что приведет к незаметному сбою алгоритма. Во-вторых, он, вероятно, заменит символы «52» везде, независимо от того, относятся ли они к размеру колоды или к чему-то совершенно другому, например, количеству недель в году по григорианскому календарю, или, что более коварно, являются частью числа вроде «1523», все из которых содержат ошибки. Напротив, изменение значения колода переменная во втором примере будет простым изменением в одну строку.
  • Это поощряет и облегчает документирование. Единственное место, где объявлена ​​именованная переменная, является хорошим местом для документирования того, что означает значение и почему оно имеет это значение. Наличие одного и того же значения во множестве мест либо приводит к дублированию комментариев (и сопутствующим проблемам при обновлении некоторых, но при отсутствии некоторых), либо не оставляет один место, где автору естественно объяснять значение и, вероятно, читатель будет искать объяснение.
  • Объявления переменных «магического числа» помещаются вместе, обычно в верхней части функции или файла, что облегчает их просмотр и изменение.
  • Это облегчает параметризацию. Например, чтобы обобщить приведенный выше пример в процедуру, которая перетасовывает колоду из любого количества карт, будет достаточно повернуть колода в параметр этой процедуры, тогда как в первом примере потребуется несколько изменений.
   функция перемешать (int deckSize) за я из 1 к deckSize j: = i + randomInt (deckSize + 1 - i) - 1 a.swapEntries (i, j)
  • Это помогает обнаружить опечатки. Использование переменной (вместо литерала) позволяет использовать проверку компилятора. Случайный ввод "62" вместо "52" останется незамеченным, тогда как "dekSize" вместо "колода"приведет к предупреждению компилятора, что dekSize не объявлен.
  • Это может уменьшить ввод текста в некоторых Иды. Если IDE поддерживает завершение кода, он заполнит большую часть имени переменной с первых нескольких букв.

Недостатки:

  • Если именованная константа не определена рядом с ее использованием, это ухудшает локальность и, следовательно, понятность кода. Размещение числа 52 в возможно отдаленном месте означает, что для полного понимания работы цикла for (например, для оценки времени выполнения цикла) необходимо отследить определение и убедиться, что это ожидаемое число. Этого легко избежать (переместив объявление), когда константа используется только в одной части кода. С другой стороны, когда он используется в разрозненных частях, удаленное местоположение является подсказкой для читателя, что такое же значение появляется в другом месте, что также может быть полезно изучить.
  • Это может сделать код более подробным. Объявление константы добавляет строку. Когда имя константы длиннее, чем значение, особенно если несколько таких констант появляются в одной строке, может возникнуть необходимость разбить один логический оператор кода на несколько строк. Повышение многословности может быть оправдано, если существует некоторая вероятность путаницы с константой или когда существует вероятность, что константа может нуждаться в изменении, например повторное использование процедуры тасования карт для других карточных игр. Это также может быть оправдано увеличением выразительности.
  • Обработка выражения может быть медленнее колода Размер + 1 во время выполнения, чем значение "53", хотя большинство современных компиляторов и интерпретаторов заметят, что колода был объявлен как константа и предварительно вычислил значение 53 в скомпилированном коде. Даже если это не вариант, оптимизация цикла переместит добавление так, чтобы оно выполнялось перед циклом. Следовательно, обычно нет (или незначительно) потери скорости по сравнению с использованием магических чисел в коде.
  • Это может усложнить отладку в системах, где отладчик не отображает значения констант (например, потому что компилятор их оптимизировал).

Допустимые виды использования

В некоторых контекстах общепринято использование безымянных числовых констант (и, возможно, «не магия»). Хотя такое принятие субъективно и часто зависит от индивидуальных привычек программирования, ниже приведены общие примеры:

  • использование 0 и 1 в качестве начальных или дополнительных значений в для цикла, Такие как за (int я = 0; я < Максимум; я += 1)
  • использование 2, чтобы проверить, четное или нечетное число, как в isEven = (x% 2 == 0), куда % это по модулю оператор
  • использование простых арифметических констант, например, в таких выражениях, как окружность = 2 * Math.PI * радиус,[1] или для расчета дискриминант из квадратное уровненеие в качестве д = Ь ^ 2-4 * а * с
  • использование степеней 10 для преобразования значений показателей (например, между граммами и килограммами) или для вычисления процентов и промилле значения
  • показатели в таких выражениях, как (f (x) ** 2 + f (y) ** 2) ** 0,5 за

Константы 1 и 0 иногда используются для представления логический значения True и False в языках программирования без логического типа, таких как старые версии C. Большинство современных языков программирования предоставляют логический или же bool примитивный тип и поэтому использование 0 и 1 не рекомендуется. Это может сбивать с толку, поскольку 0 иногда означает программный успех (когда -1 означает неудачу) и неудачу в других случаях (когда 1 означает успех).

В C и C ++ 0 иногда используется для обозначения нулевой указатель. Как и в случае с логическими значениями, стандартная библиотека C включает определение макроса НОЛЬ использование которых приветствуется. Другие языки предоставляют особые ноль или же ноль значение, и в этом случае не следует использовать альтернативу. Константа типизированного указателя nullptr был представлен в C ++ 11.

Индикаторы формата

Источник

Индикаторы формата были впервые использованы в Версия 7 Unix исходный код.[нужна цитата ]

Unix был портирован одним из первых DEC PDP-11 / 20с, которых не было защита памяти. Итак, ранние версии Unix использовали перемещаемая ссылка на память модель.[5] ПредварительноШестое издание Unix версии читают исполняемый файл в объем памяти и перешел к первому младшему адресу памяти программы, относительный адрес нуль. С развитием постраничный версии Unix, заголовок был создан для описания исполняемый образ составные части. Также инструкция отделения был вставлен как первое слово заголовка, чтобы пропустить заголовок и запустить программу. Таким образом, программа могла быть запущена в более старом (обычном) режиме перемещаемой ссылки на память или в страничном режиме. Поскольку было разработано больше исполняемых форматов, новые константы были добавлены путем увеличения ветви компенсировать.[6]

в Шестое издание исходный код загрузчика программ Unix, функция exec () читает исполняемый файл (двоичный ) изображение из файловой системы. Первые 8 байты файла был заголовок содержащий размеры программной (текстовой) и инициализированной (глобальной) областей данных. Также первое 16-битное слово заголовка сравнивалось с двумя константы чтобы определить, есть ли исполняемый образ содержал перемещаемые ссылки на память (нормальный), недавно реализованный постраничный исполняемый образ, доступный только для чтения, или изображение с разделенными инструкциями и данными.[7] Не было упоминания о двойной роли константы заголовка, но старший байт константы фактически был код операции для инструкции ветвления PDP-11 (восьмеричный 000407 или шестнадцатеричный 0107). Добавление семи к счетчику программ показало, что если эта константа была казнен, он разветвит службу Unix exec () над восьмибайтовым заголовком исполняемого образа и запустит программу.

Поскольку в шестой и седьмой редакциях Unix использовался код подкачки, двойная роль константы заголовка была скрыта. То есть служба exec () считывает заголовок исполняемого файла (мета ) данные в пространство ядра буфер, но считайте исполняемый образ в пространство пользователя, тем самым не используя функцию ветвления константы. Создание магического числа реализовано в Unix. компоновщик и грузчик и ветвление магических чисел, вероятно, все еще использовалось в наборе автономный диагностические программы которые пришли с шестым и седьмым изданиями. Таким образом, константа заголовка действительно создавала иллюзию и удовлетворяла критериям магия.

В седьмой версии Unix константа заголовка не тестировалась напрямую, а присваивалась переменной с меткой ux_mag[8] и впоследствии именуемой магическое число. Вероятно, из-за своей уникальности термин магическое число стал обозначать тип исполняемого формата, затем расширился до обозначения типа файловой системы и снова расширился до обозначения любого типа файла.

В файлах

Магические числа распространены в программах многих операционных систем. Реализация магических чисел строго типизированный данные и являются формой внутриполосная сигнализация к управляющей программе, которая считывает тип (ы) данных во время выполнения программы. Многие файлы имеют такие константы, которые идентифицируют содержащиеся данные. Обнаружение таких констант в файлах - простой и эффективный способ различать многие форматы файлов и может дать дальнейшее время выполнения Информация.

Примеры
  • Составлено Файлы классов Java (байт-код ) и Мачо двоичные файлы начинаются с шестнадцатеричного КАФЕБАБ. При сжатии с Pack200 байты изменены на CAFED00D.
  • Гифка файлы изображений имеют ASCII код для "GIF89a" (47 49 46 38 39 61) или "GIF87a" (47 49 46 38 37 61)
  • JPEG файлы изображений начинаются с FF D8 и закончить FF D9. JPEG /JFIF файлы содержат ASCII код для "JFIF" ( 46 49 46) как строку с завершающим нулем. JPEG /Exif файлы содержат ASCII код для "Exif" (45 78 69 66) также как строка с завершающим нулем, за которой следует еще метаданные о файле.
  • PNG файлы изображений начинаются с 8-байт подпись, которая идентифицирует файл как файл PNG и позволяет обнаруживать распространенные проблемы при передаче файлов: \211 п N грамм р  п \032  п (89 50 4E 47 0D 0A  0A). Эта подпись содержит различные новая линия символы, позволяющие обнаруживать необоснованные автоматические преобразования новой строки, такие как передача файла с использованием FTP с ASCII режим передачи вместо двоичный режим.[9]
  • Стандарт MIDI аудиофайлы имеют ASCII код для "MThd" (MIDI Тстойка часеаdэээ, 4D 54 68 64), за которым следуют другие метаданные.
  • Unix или же Linux скрипты могут начинаться с "шебанг" (#!, 23 21), за которым следует путь к устный переводчик, если интерпретатор скорее всего будет отличаться от того, из которого был вызван скрипт.
  • ELF исполняемые файлы начинаются с 7F E L F
  • PostScript файлы и программы начинаются с "%!" (25 21).
  • PDF файлы начинаются с "% PDF" (шестнадцатеричное 25 50 44 46).
  • Исполняемый файл DOS MZ файлы и EXE-заглушка из Майкрософт Виндоус PE Файлы (Portable Executable) начинаются с символов «MZ» (4D ), инициалы дизайнера формата файла, Марк Збиковски. Определение допускает необычный "ZM" ( 4D), а также для dosZMXP, не-PE EXE.[10]
  • В Быстрая файловая система Беркли формат суперблока определяется как 19 54 01 19 или же 01 19 54 в зависимости от версии; оба представляют день рождения автора, Маршалл Кирк МакКьюсик.
  • В Главная загрузочная запись загрузочных устройств хранения почти на всех IA-32 Совместимость с IBM PC имеет код 55 AA как его последние два байта.
  • Исполняемые файлы для Геймбой и Game Boy Advance портативные игровые системы имеют 48-байтовое или 156-байтовое магическое число, соответственно, в фиксированном месте в заголовке. Это магическое число кодирует растровое изображение Nintendo логотип.
  • Amiga исполняемый файл программного обеспечения Ломоть файлы, работающие на Amiga classic 68000 все машины начинались с шестнадцатеричного числа $ 000003f3, получившего прозвище «Волшебное печенье».
  • В Amiga единственным абсолютным адресом в системе является шестнадцатеричный $ 0000 0004 (ячейка памяти 4), который содержит начальную точку, называемую SysBase, указатель на exec.library, так называемый ядро Амиги.
  • PEF файлы, используемые классическая Mac OS и BeOS за PowerPC исполняемые файлы, содержат ASCII код для "Радости!" ( 6F 79 21) в качестве префикса.
  • TIFF файлы начинаются либо с II или же ММ с последующим 42 как двухбайтовое целое число в маленьком или большом endian порядок байтов. II для Intel, которая использует прямой порядок байтов порядок байтов, поэтому магическое число 49 49  00. ММ для Motorola, которая использует прямой порядок байтов порядок байтов, поэтому магическое число 4D 4D 00 .
  • Unicode текстовые файлы в кодировке UTF-16 часто начинаются с Знак порядка байтов обнаружить порядок байтов (FE FF для прямого байта и FF FE для прямого порядка байтов). И дальше Майкрософт Виндоус, UTF-8 текстовые файлы часто начинаются с кодировки одного и того же символа UTF-8, EF BB BF.
  • LLVM Файлы битового кода начинаются с до н.э (0x42, 0x43)
  • WAD файлы начинаются с IWAD или же PWAD (за Рок ), WAD2 (за Землетрясение ) и WAD3 (за Период полураспада ).
  • Microsoft Двоичный формат составного файла (в основном известен как один из старых форматов Microsoft Office документы) файлы начинаются с D0 CF 11 E0, что визуально напоминает слово "DOCFILE0".
  • Заголовки в ZIP файлы начинаются с "PK" (50 4B), инициалы Фил Кац, автор ДОС утилита сжатия PKZIP.
  • Заголовки в 7z файлы начинаются с "7z" (полное магическое число: 37  до н.э AF 27 ).
Обнаружение

Утилита Unix файл может читать и интерпретировать магические числа из файлов, а файл, который используется для анализа информации, называется магия. Утилита Windows TrID имеет аналогичное назначение.

В протоколах

Примеры
  • В Протокол OSCAR, используется в ЦЕЛЬ /ICQ, добавляет к запросам префиксы .
  • в Протокол RFB использован VNC, клиент начинает свой диалог с сервером, отправив «RFB» (52 46 42, для «Remote Frame Buffer»), за которым следует номер версии протокола клиента.
  • в 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.
  • Первый 04 байтов блока в Биткойн Блокчейн содержит магическое число, которое служит идентификатором сети. Значение постоянное 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 и интерфейсы во многих операционные системы, включая ДОС, Windows и NetWare:

Примеры
  • IBM PC -совместимый BIOS использовать магические значения 0000 и 1234 чтобы решить, должна ли система подсчитывать память или нет при перезагрузке, тем самым выполняя холодную или горячую перезагрузку. Эти значения также используются EMM386 менеджеры памяти, перехватывающие запросы загрузки.[11] BIOS также использует магические значения 55 AA чтобы определить, является ли диск загрузочным.[12]
  • В MS-DOS дисковый кеш SMARTDRV (кодовое название «Bambi») использует магические значения BABE и EBAB в функциях API.[11]
  • Много DR DOS, Novell DOS и OpenDOS драйверы, разработанные в бывшем Европейский центр развития в Великобритании значение 0EDC используется в качестве магического токена при вызове или предоставлении дополнительных функций поверх (эмулируемых) стандартных функций DOS, например NWCACHE.[11]

Другое использование

Примеры
  • По умолчанию MAC-адрес на Texas Instruments SOC является DE: AD: BE: EF: 00: 00.[13]

Ограничения типа данных

Это список ограничений типов хранения данных:[14]

ДесятичныйHexОписание
18,446,744,073,709,551,615FFFFFFFFFFFFFFFFМаксимальное 64-битное значение без знака (264 − 1)
9,223,372,036,854,775,8077FFFFFFFFFFFFFFFМаксимальное 64-битное значение со знаком (263 − 1)
4,294,967,295FFFFFFFFМаксимальное 32-битное значение без знака (232 − 1)
2,147,483,6477FFFFFFFМаксимальное 32-битное значение со знаком (231 − 1)
65,535FFFFМаксимальное 16-битное значение без знака (216 − 1)
32,7677FFFМаксимальное 16-битное значение со знаком (215 − 1)
255FFМаксимальное 8-битное значение без знака (28 − 1)
1277FМаксимальное 8-битное значение со знаком (27 − 1)
−12880Минимальное 8-битное значение со знаком
−32,7688000Минимальное 16-битное значение со знаком
−2,147,483,64880000000Минимальное 32-битное значение со знаком
−9,223,372,036,854,775,8088000000000000000Минимальное 64-битное значение со знаком

GUID

Можно создать или изменить глобальные уникальные идентификаторы (GUID), чтобы их можно было запомнить, но это крайне не рекомендуется, поскольку это ставит под угрозу их силу как почти уникальные идентификаторы.[15][16] Спецификации для генерации GUID и UUID довольно сложны, что делает их практически уникальными при правильной реализации. Они должны создаваться только надежным программным средством.[нужна цитата ]

Идентификационные номера продуктов Microsoft Windows для Microsoft Office продукты иногда заканчиваются 0000-0000-0000000FF1CE ("ОФИС"), например {90160000-008C-0000-0000-0000000FF1CE}, идентификатор продукта для «Компонента расширения Office 16 нажми и работай».

Java использует несколько GUID, начиная с КАФЕФАК.[17]

в Таблица разделов GUID схемы разбиения GPT, Загрузочные разделы BIOS используйте специальный GUID {21686148-6449-6E6F-744E-656564454649}[18] который не соответствует определению GUID; вместо этого он формируется с помощью ASCII коды для строки "Ха! IdontNeedEFI"частично в прямой порядок байтов порядок.[19]

Значения отладки

Значения отладки Magic конкретные значения, записанные в объем памяти в течение распределение или освобождение, чтобы позже можно было определить, были ли они повреждены, и сделать это очевидным, когда используются значения, взятые из неинициализированной памяти. Память обычно рассматривается в шестнадцатеричной системе, поэтому запоминается повторение или hexspeak ценности общие. Могут быть предпочтительны числовые нечетные значения, так что процессоры без байтовой адресации будут давать сбой при попытке использовать их в качестве указателей (которые должны попадать в четные адреса). Следует выбирать значения, которые не соответствуют вероятным адресам (программный код, статические данные, данные кучи или стек). Точно так же они могут быть выбраны так, чтобы они не были допустимыми кодами в наборе команд для данной архитектуры.

Поскольку очень маловероятно, но возможно, что 32-битное целое число примет это конкретное значение, появление такого числа в отладчик или же дамп памяти скорее всего указывает на ошибку, такую ​​как переполнение буфера или неинициализированная переменная.

Известные и распространенные примеры включают:

КодОписание
00008123Используется в MS Visual C ++. Удаленным указателям присваивается это значение, поэтому они вызывают исключение, когда используются после; это более узнаваемый псевдоним нулевого адреса. Он активируется с помощью параметра «Жизненный цикл разработки безопасности» (/ sdl).[20]
..ФАСАД"Фасад", Используется рядом ОСРВ
1BADB002«1 плохая загрузка», Мультизагрузка магический номер заголовка[21]
8BADF00D«Съел плохую еду», Означает, что яблоко iOS приложение было прекращено из-за истечения тайм-аута сторожевого таймера.[22]
A5A5A5A5Используется во встроенной разработке, поскольку чередующийся битовый шаблон (1010 0101) создает легко распознаваемый шаблон на осциллографы и логические анализаторы.
A5Используется в FreeBSD PHK маллок (3) для отладки, когда /etc/malloc.conf символически связан с «-J» для инициализации всей вновь выделенной памяти, поскольку это значение не является указателем NULL или символом NUL ASCII.
АБАБАБАБИспользован Microsoft отладка HeapAlloc (), чтобы пометить "ничейную землю" охранные байты после выделенной кучи памяти.[23]
ABADBABE"Плохой малыш", Использован яблоко как магическое число "Boot Zero Block"
ABBABABE"ABBA детка ", использован Параллельные линии драйвера куча памяти.
ABADCAFE«Плохое кафе», Используется для инициализации всей нераспределенной памяти (Mungwall, AmigaOS )
B16B00B5"Большие сиськи", Ранее требовалось Microsoft с Hyper-V гипервизор, который будет использоваться гостями Linux в качестве верхней половины их «гостевого идентификатора»[24]
BAADF00D"Плохая еда", Использован Microsoft отладка HeapAlloc () для отметки неинициализированной выделенной памяти кучи[23]
BAAAAAAD"Баааааад", Указывает, что яблоко iOS журнал - это стопка всей системы, а не отчет о сбоях[22]
BAD22222"Плохо слишком часто", Означает, что яблоко iOS Приложение VoIP было прекращено, потому что оно возобновлялось слишком часто[22]
BADBADBADBAD"Плохо, плохо, плохо, плохо", Большие системы Берроуза «неинициализированная» память (48-битные слова)
BADC0FFEE0DDF00D«Плохой кофе, странная еда», Используется на IBM RS / 6000 64-битные системы для индикации неинициализированных регистров ЦП
BADDCAFE«Плохое кафе», На Sun Microsystems ' Солярис, отмечает неинициализированную память ядра (KMEM_UNINITIALIZED_PATTERN)
BBADBEEF«Плохая говядина», Используется в WebKit[требуется разъяснение ]
БЕФКАС«Говяжий пирог», Использован Microsoft .NET как магическое число в файлах ресурсов
C00010FF"Остывать", Указывает яблоко iOS приложение было остановлено операционной системой в ответ на тепловое событие[22]
КАФЕБАБ"Кафе детка", Использован Ява для файлов классов
CAFED00D"Кафе чувак", Использован Ява для них pack200 сжатие
КАФЕ«Кафе-корм», Использован Sun Microsystems ' Солярис отладка ядра для маркировки памяти kmemfree ()
СССССИспользован Microsoft библиотека времени выполнения отладки C ++ и многие среды DOS для отметки неинициализированных куча объем памяти. CC напоминает код операции ИНТ 3 прерывание точки останова отладки на процессорах x86.
CDCDCDCDИспользован Microsoft Функция отладки malloc () C / C ++ для отметки неинициализированной памяти кучи, обычно возвращаемой из HeapAlloc ()[23]
0D15EA5E«Нулевая болезнь», Используется как флаг, указывающий на регулярную загрузку на Nintendo GameCube и Wii консоли
DDDDDDDDИспользуется функцией SmartHeap MicroQuill и функцией debug free () Microsoft C / C ++ для отметки освобожденной памяти кучи.[23]
DEAD10CC«Замок мертвый», Означает, что яблоко iOS приложение было прекращено, потому что оно удерживало системный ресурс во время работы в фоновом режиме[22]
DEADBABE"Мертвая малышка", Используется в начале Силиконовая Графика ' IRIX файлы арены
МЕРТВОЙ«Мертвая говядина», Широко используется на IBM такие системы, как RS / 6000, также используется в классическая Mac OS операционные системы, ОПЕНСТЕП Предприятие, а Коммодор Amiga. На Sun Microsystems ' Солярис, отмечает освобожденную память ядра (KMEM_FREE_PATTERN)
DEADCAFE«Мертвое кафе», Использован Microsoft .NET как номер ошибки в DLL
DEADC0DE«Мертвый код», Используется как маркер в OpenWRT прошивка для обозначения начала создаваемой файловой системы jffs2 в конце статической прошивки
DEADFA11"Мертвый провал", Означает, что яблоко iOS приложение было принудительно закрыто пользователем[22]
DEADF00D«Мертвая еда», Используется Mungwall на Коммодор Amiga отметить выделенную, но неинициализированную память[25]
DEFEC8ED"Испорченный", Используется для OpenSolaris дампы керна
МЕРТВОЙ"Мертвые мертвецы" указывает, что пользователь намеренно инициировал аварийный дамп либо с помощью отладчика ядра, либо с клавиатуры.[26]
EBEBEBEBИз SmartHeap от MicroQuill
FADEDEAD"Исчезнуть мертвым", В конце идет определение каждого AppleScript сценарий
FDFDFDFDИспользован Microsoft функция отладки malloc () C / C ++ для отметки "ничейной земли" охранные байты до и после выделенной памяти кучи,[23] и некоторые безопасные отладки C-время выполнения функции, реализованные Microsoft (например, strncat_s) [27]
FEE1DEAD"Почувствуй себя мертвым", Использован Linux reboot () системный вызов
FEEDFACE«Кормить лицо», Видно в PowerPC Мачо двоичные файлы на Apple Inc. с macOS Платформа. На Sun Microsystems ' Солярис, отмечает красную зону (KMEM_REDZONE_PATTERN)

Использован VLC плеер и немного IP камеры в RTP /RTCP протокол, проигрыватель VLC отправляет четыре байта в порядке порядок байтов системы. Некоторые IP-камеры ожидают, что игрок отправит это магическое число, и не запускают поток, если он не получен.

FEEEFEEE«Комиссионный сбор», Использован Microsoft отладка HeapFree (), чтобы отметить освобожденную память кучи. Для некоторых близлежащих значений внутренней бухгалтерской отчетности также может быть установлено старшее слово FEEE.[23]

Большинство из них по 32 биты долго - размер слова большинства компьютеров с 32-битной архитектурой.

Преобладание этих ценностей в технологиях Microsoft неслучайно; они подробно обсуждаются в Стив Магуайр книга Написание твердого кода из Microsoft Press. Он дает множество критериев для этих ценностей, таких как:

  • Они не должны быть полезными; то есть следует ожидать, что большинство алгоритмов, которые работают с ними, будут делать что-то необычное. Такие числа, как ноль, этому критерию не подходят.
  • Они должны легко распознаваться программистом как недопустимые значения в отладчике.
  • На машинах, у которых нет выравнивание байтов, они должны быть нечетные числа, так что разыменование их как адресов вызывает исключение.
  • Они должны вызывать исключение или, возможно, даже прерывание отладчика, если они выполняются как код.

Так как они часто использовались для обозначения областей памяти, которые были по существу пустыми, некоторые из этих терминов стали использоваться во фразах, означающих «пропал, прерван, стерто из памяти»; например "Твоя программа ГЛУБОКАЯ"[нужна цитата ].

Смотрите также

Рекомендации

  1. ^ а б c Мартин, Роберт С. (2009). «Глава 17: Запахи и эвристика - G25 заменяет магические числа именованными константами». Чистый код - руководство по созданию гибкого программного обеспечения. Бостон: Прентис Холл. п.300. ISBN  978-0-13-235088-4.
  2. ^ Мартин, Роберт С. (2009). «Глава 17: Запахи и эвристика - скрытое намерение G16». Чистый код - руководство по созданию гибкого программного обеспечения. Бостон: Прентис Холл. п.295. ISBN  978-0-13-235088-4.
  3. ^ Магуайр, Джеймс (2008-12-09). "Бьярн Страуструп об обучении разработчиков программного обеспечения". Datamation.com. Архивировано из оригинал на 2018-06-23.
  4. ^ Фогель, Джефф (29 мая 2007 г.). «Шесть способов написать более понятный код». Разработчик IBM.
  5. ^ «Странные комментарии и странные дела в Unix». Bell Labs. 2002-06-22. Архивировано из оригинал на 2006-11-04.
  6. ^ Личное общение с Деннисом М. Ричи.
  7. ^ "Дерево Unix V6 / usr / sys / ken / sys1.c". Общество наследия Unix. Архивировано из оригинал на 2008-10-20.
  8. ^ "Дерево Unix V7 / usr / sys / sys / sys1.c". Общество наследия Unix. Архивировано из оригинал на 2008-10-20.
  9. ^ «PNG (Portable Network Graphics) Specification Version 1.0: 12.11. PNG file signature». Массачусетский технологический институт. 1996-10-01.
  10. ^ Чен, Раймонд (24 марта 2008 г.). "В чем разница между расширениями COM и EXE?". Старая новая вещь. Архивировано из оригинал на 18.02.2019.
  11. ^ а б c Пол, Матиас Р. (2002-04-03). "[fd-dev] Ctrl + Alt + Del". Freedos-dev. В архиве из оригинала на 09.09.2017. Получено 2017-09-09. (NB. Упоминается ряд магических значений, используемых IBM PC -совместимый BIOS (0000h, 1234h), ДОС менеджеры памяти вроде EMM386 (1234h) и дисковые кеши, например SMARTDRV (EBABh, BABEh) и NWCACHE (0EDCh, EBABh, 6756h).)
  12. ^ «Процесс загрузки BIOS / MBR». База знаний NeoSmart. 2015-01-25. Получено 2019-02-03.
  13. ^ «Сообщество TI E2E: Кто-нибудь знает, можно ли выполнить следующие настройки с помощью MCP CLI Tool?». Инструменты Техаса. 2011-08-27.
  14. ^ Полей, Джош (30 сентября 2009 г.). «Магические числа: целые числа». MSDN.
  15. ^ Новичок, Джозеф М. (2001-10-13). «Управление сообщениями: гарантия уникальности». Разработчик Fusion. Получено 2007-11-16.
  16. ^ Остерман, Ларри (21 июля 2005 г.). «UUID уникальны, только если вы их генерируете ...» WebLog Ларри Остермана - Признания старого тумана. MSDN. Получено 2007-11-16.
  17. ^ «Указание версий семейства JRE для апплетов Java». Oracle. Получено 2010-06-18.
  18. ^ «Установка GNU GRUB, Раздел 3.4: Установка BIOS». Gnu.org. Получено 2014-06-26.
  19. ^ Хеддингс, Лоуэлл (2014-11-03). «Магические числа: секретные коды, которые программисты скрывают на вашем компьютере». Как Компьютерщик. Получено 2017-10-03.
  20. ^ Кавит, Дуг (24 апреля 2012 г.). «Защита от повторного использования устаревших ссылок на объекты». Microsoft Secure. Получено 2018-07-26.
  21. ^ Болейн, Эрих Стефан (4 апреля 1995 г.). "Комментарии к предложению" MultiBoot Standard "". Uruk.org.
  22. ^ а б c d е ж «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений». Документация для разработчиков Apple. 2009-01-29.
  23. ^ а б c d е ж Биркетт, Эндрю. "Внутреннее устройство кучи отладки Win32 CRT". Nobugs.org.
  24. ^ Макнамара, Пол (19 июля 2012 г.). «Код Microsoft содержит фразу« большие сиськи »... Да, правда». Сетевой мир.
  25. ^ Шеппнер, Кэролайн. "Руководство Amiga Mail Vol.2". Cataclysm.cx. Архивировано из оригинал на 2011-07-18. Получено 2010-08-20.
  26. ^ "Ошибка проверки 0xDEADDEAD MANUALLY_INITIATED_CRASH1". Документация Microsoft.
  27. ^ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l". Документация Microsoft. Получено 2019-01-16.