Магические числа в программировании

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

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

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

Термин магическое число или магическая константа относится к анти-паттерну использования чисел непосредственно в исходном коде.

Это было названо нарушением одного из старейших правил программирования. Восходящего к руководствам COBOL, FORTRAN и PL/1 1960-х годов. Использование неназванных магических чисел в коде затемняет намерение разработчиков при выборе этого числа, увеличивает возможности для тонких ошибок (например. Правильна ли каждая цифра в 3.14159265358979323846 и равно ли это 3.14159?) и затрудняет адаптацию и расширение программы в будущем.] Замена всех значимых магических чисел на именованные константы облегчает чтение. Понимание и обслуживание программ.[4]

Имена, выбранные для того. Чтобы быть значимыми в контексте программы. Могут привести к коду. Который легче понять сопровождающему. Который не является оригинальным автором (или даже оригинальным автором через некоторое время). Пример неинформативно названной константы int SIXTEEN = 16является int NUMBER_OF_BITS = 16более описательным.

Описанные выше проблемы. Связанные с магическими const string testUserName = "John""John"

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

 для i от 1 до 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 для i от 1 до deckSize j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j) 

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

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

Недостатками являются:

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

Принятые использования

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

  • использование 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для
    f(x)2+f(y)2{\displaystyle {\sqrt {f(x)^{2}+f(y)^{2}}}}

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

В C и C++ 0 иногда используется для представления нулевого указателя. Как и в случае с логическими значениями. Стандартная библиотека C включает определение макросаNULL, использование которого поощряется. Другие языки предоставляют конкретное nullnilзначение или. И в этом случае никакая альтернатива не должна использоваться. Типизированная константа указателя 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 (байт-код ) и двоичные файлы Mach-O начинаются с hex CAFEBABE. При сжатии с помощью Pack200 байты изменяются на CAFED00D.
  • Файлы изображений GIF имеют код ASCII для 47 49 46 38 39 61) или 47 49 46 38 37 61)
  • Файлы изображений JPEG начинаются FF D8и заканчиваются FF D9. Файлы JPEG/ JFIF содержат ASCII — код для 4A 46 49 46) в виде строки с нулевым завершением. Файлы JPEG/Exif содержат код ASCII для 45 78 69 66) также в виде строки с нулевым завершением. За которой следуют дополнительные метаданные о файле.
  • Файлы изображений PNG начинаются с 8 —байтовой сигнатуры. Которая идентифицирует файл как файл PNG и позволяет обнаружить распространенные проблемы передачи файлов: \211 P N G \r \n \032 \n(89 50 4E 47 0D 0A 1A 0A). Эта подпись содержит различные символы новой строки. Позволяющие обнаруживать необоснованные автоматические преобразования новой строки. Такие как передача файла с помощью FTP в режиме передачи ASCII вместо двоичного режима.[9]
  • Стандартные MIDI-аудиофайлы имеют ASCII-код для «MThd» (MIDI Track header,4D 54 68 64), за которым следуют дополнительные метаданные.
  • Сценарии Unix или Linux могут начинаться с (#!, 23 21) с последующим путем к интерпретатору, если интерпретатор. Скорее всего. Будет отличаться от того. Из которого был вызван скрипт.
  • Исполняемые файлы ELF начинаются с 7F E L F
  • Файлы и программы PostScript начинаются с 25 21).
  • PDF-файлы начинаются с 25 50 44 46).
  • Исполняемые файлы DOS MZ и EXE-заглушка файлов Microsoft Windows PE (Portable Executable) начинаются с символов 4D 5A), инициалов разработчика формата файла Марка Збиковского. Это определение допускает необычное 5A 4D) также и для dosZMXP. Не являющегося PE EXE.[10]
  • Формат суперблока быстрой файловой системы Berkeley идентифицируется как либо 19 54 01 19или 01 19 54в зависимости от версии; оба они представляют день рождения автора, Маршалла Кирка Маккьюсика.
  • Основная загрузочная запись загрузочных устройств хранения данных почти на всех совместимых с IA-32 IBM PC имеет код 55 AAв виде последних двух байтов.
  • Исполняемые файлы для портативных игровых систем Game Boy и Game Boy Advance имеют 48-байтовое или 156-байтовое магическое число соответственно в фиксированном месте заголовка. Это магическое число кодирует растровое изображение логотипа Nintendo.
  • Исполняемые файлы Hunk программного обеспечения Amiga, работающие на машинах Amiga classic 68000, все начинались с шестнадцатеричного числа $000003f3, прозванного
  • В Amiga единственным абсолютным адресом в системе является hex $0000 0004 (memory location 4). Который содержит начальное местоположение SysBase. Указатель на exec.library. Так называемое ядро Amiga.
  • PEF-файлы, используемые классическими Mac OS и BeOS для исполняемых файлов PowerPC. Содержат ASCII-код для 4A 6F 79 21) в качестве префикса.
  • Файлы TIFF начинаются либо с II42, либо MMс 42 в виде двухбайтового целого числа в порядке малых или больших конечных байтов. II это для Intel. Которая использует небольшой порядок байтов endian. Так что магическое число есть 49 49 2A 00. MM это для Motorola. Которая использует большой порядок байтов endian. Так что магическое число есть 4D 4D 00 2A.
  • Текстовые файлы Unicode, закодированные в UTF-16, часто начинаются с знака порядка байтов для определения эндианства (FE FF для большого и FF FEмалого эндианства). А в Microsoft Windowsтекстовые файлы UTF-8 часто начинаются с кодировки UTF-8 одного и того же символа EF BB BF.
  • Файлы битового кода LLVM начинаются с BC(0x42, 0x43)
  • Файлы WAD начинаются с IWADor PWAD(для Doom), WAD2(для Quake) и WAD3(для Half-Life).
  • Microsoft Compound File Binary Format (в основном известный как один из старых форматов документов Microsoft Office) файлы начинаются с D0 CF 11 E0того . Что визуально наводит на мысль о слове
  • Заголовки в ZIP — файлах начинаются с 50 4B), инициалов Фила Каца, автора утилиты сжатия DOS PKZIP.
  • Заголовки в файлах 7z начинаются с 37 7A BC AF 27 1C).
Обнаружение

Служебная программа Unix fileможет считывать и интерпретировать магические числа из файлов, а файл. Который используется для анализа информации. Называется magic. Аналогичное назначение имеет и утилита Windows TrID.

В протоколах

Примеры
  • Протокол OSCAR, используемый в AIM/ICQ, префиксы запросов с.2A
  • В протоколе RFB, используемом VNC, клиент начинает свой разговор с сервером . Отправляя 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 маршалированные интерфейсы. Называемые OBJREFs, всегда начинаются с последовательности байтов 4D 45 4F 57). Отладочные расширения (используемые для подключения канала DCOM) предваряются последовательностью байтов 4D 41 52 42).
  • Незашифрованные запросы BitTorrent tracker начинаются с одного байта, содержащего значение19, представляющее длину заголовка. За которым сразу следует фраза
  • Трафик eDonkey2000/eMule начинается с одного байта. Представляющего версию клиента. В настоящее E3время представляет собой клиент eDonkey, C5представляет eMule и D4представляет сжатый eMule.
  • Первые 04байты блока в блокчейне Биткойн содержат магическое число. Которое служит идентификатором сети. Значение является константой 0xD9B4BEF9, которая указывает на основную сеть. В то время как константа 0xDAB5BFFAуказывает на тестовую сеть.
  • Транзакции SSL всегда начинаются с сообщения Схема инкапсуляции записей. Используемая для префикса всех пакетов SSL. Состоит из двух — и трехбайтовых форм заголовка. Обычно сообщение приветствия клиента SSL версии 2 предваряется 80ответом сервера SSLv3 на приветствие клиента 16(хотя это может отличаться).
  • DHCP-пакеты используют значение 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 для перехвата загрузочных запросов.[11] BIOS также используют магические значения55 AA, чтобы определить. Является ли диск загрузочным.[12]
  • Дисковый кэш MS-DOS SMARTDRV (кодовое название [11]
  • Многие драйверы DR DOS, Novell DOS и OpenDOS, разработанные в бывшем Европейском центре разработки в Великобритании. Используют значение 0EDC в качестве магического токена при вызове или предоставлении дополнительной функциональности поверх (эмулируемых) стандартных функций DOS. Например NWCACHE.]

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

Примеры

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

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

Десятичный Шестиугольный Описание
18,446,744,073,709,551,615 ФФФФФФФФФФФФФФФФ Максимальное значение 64 бит без знака (264 − 1)
9,223,372,036,854,775,807 7ФФФФФФФФФФФФФФФ Максимальное знаковое 64 — битное значение (263 − 1)
4,294,967,295 ФФФФФФФФ Максимальное беззнаковое 32-битное значение (232 − 1)
2,147,483,647 7ФФФФФФФ Максимальное знаковое 32-битное значение (231 − 1)
65,535 ФФФФ Максимальное беззнаковое 16-битное значение (216 − 1)
32,767 7ФФФ Максимальное знаковое 16-битное значение (215 − 1)
255 ФФ Максимальное беззнаковое 8-битное значение (28 − 1)
127 7F Максимальное знаковое 8-битное значение (27 − 1)
−128 80 Минимальное знаковое 8 битное значение
−32,768 8000 Минимальное знаковое 16 битное значение
−2,147,483,648 80000000 Минимальное 32-битное значение со знаком
−9,223,372,036,854,775,808 8000000000000000 Минимальное 64-битное значение со знаком

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

Идентификаторы продуктов Microsoft Windows для продуктов Microsoft Office иногда заканчиваются 0000-0000-0000000FF1CE («OFFICE»). Например {90160000-008C-0000-0000-0000000FF1CE}, идентификатор продукта для «Office 16 Click-to-Run Extensibility Component».

Java использует несколько GUID. Начиная с CAFEEFAC.[17]

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

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

Магические отладочные значения-это конкретные значения. Записанные в память во время выделения или освобождения. Чтобы позже можно было определить. Были ли они повреждены. И сделать это очевидным. Когда используются значения. Взятые из неинициализированной памяти. Память обычно рассматривается в шестнадцатеричном формате. Поэтому запоминающееся повторение или шестнадцатеричный язык ценности общие. Численно нечетные значения могут быть предпочтительными. Так что процессоры без байтовой адресации будут ошибаться при попытке использовать их в качестве указателей (которые должны попадать по четным адресам). Следует выбирать значения. Удаленные от вероятных адресов (программный код. Статические данные. Данные кучи или стек). Аналогично, они могут быть выбраны так. Чтобы они не были допустимыми кодами в наборе команд для данной архитектуры.

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

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

Код Описание
00008123 Используется в MS Visual C++. Удаленные указатели устанавливаются в это значение. Поэтому они генерируют исключение. Когда они используются после; это более узнаваемый псевдоним для нулевого адреса. Он активируется с помощью опции Security Development Lifecycle (/sdl).[20]
..FACADE , используемый рядом ОСРВ
1BADB002 , Магическое число заголовка Multiboot[21]
8BADF00D Указывает на то . Что приложение Apple iOS было прекращено из-за тайм-аута сторожевого тайм-аута.[22]
A5A5A5A5 Используется во встроенной разработке. Поскольку переменный битовый шаблон (1010 0101) создает легко распознаваемый шаблон на осциллографах и логических анализаторах.
A5 Используется в PHK malloc(3) FreeBSD для отладки. Когда файл /etc/malloc.conf символически связан с
ABABABAB Используется Microsoft‘ s debug HeapAlloc() для обозначения охранных байтов после выделенной памяти кучи.]
ABADBABE , используемый Apple в качестве магического числа
ABBABABE ABBA babe, используемый драйвером параллельных линий памяти кучи.
ABADCAFE , используемое для инициализации всей нераспределенной памяти (Mungwall, AmigaOS)
B16B00B5 , ранее требовавшиеся гипервизором MicrosoftHyper-V для использования гостями Linux в качестве верхней половины их [24]
BAADF00D , используемая Microsoftdebug HeapAlloc() для обозначения неинициализированной выделенной памяти кучи[23]
BAAAAAAD , указывает на то. Что журнал Apple iOS является стопшотом всей системы. А не отчетомоб ошибке [22]
BAD22222 Указывает на то . Что VoIP-приложение Apple iOS было прекращено из-за того. Что оно возобновлялось слишком часто[22]
BADBADBADBAD , Burroughs large systems
BADC0FFEE0DDF00D , используется в 64-разрядных системах IBM RS/6000 для обозначения неинициализированных регистров процессора
BADDCAFE В Solaris Sun Microsystemsпомечает неинициализированную память ядра (KMEM_UNINITIALIZED_PATTERN)
BBADBEEF , используемая в WebKit[требуется уточнение]
BEEFCACE , используемый Microsoft .NET в качестве магического числа в файлах ресурсов
C00010FF Означает , что приложение AppleiOS было убито операционной системой в ответ на тепловое событие[22]
CAFEBABE , используемый Java для файлов классов
CAFED00D , используемый Java для их сжатия pack200
CAFEFEED , используемый отладочным ядром Solaris Sun Microsystems для маркировки памяти kmemfree()
CCCCCCCC Используется Microsoft‘s C++ debugging runtime library и многими средами DOS для маркировки неинициализированной стековой памяти. CC напоминает код операции прерывания точки останова отладки INT 3 на процессорах x86.
CDCDCDCD Используется функцией MicrosoftC/C++ debug malloc() для маркировки неинициализированной памяти кучи. Обычно возвращаемой из HeapAlloc()[23]
0D15EA5E , используемая в качестве флага для обозначения регулярной загрузки на консолях Nintendo GameCube и Wii
DDDDDDDD Используется функцией MicroQuill SmartHeap и Microsoft C/C++ debug free() для обозначения освобожденной памяти кучи[23]
DEAD10CC Указывает на то . Что приложение Apple iOS было прекращено из-за того. Что оно удерживалось на системном ресурсе во время работы в фоновомрежиме [22]
DEADBABE , используемый в начале Silicon GraphicsIRIX arena files
DEADBEEF , широко используемая в системах IBM, таких как RS/6000, также используется в классических операционных системах Mac OS, OPENSTEP Enterpriseи Commodore Amiga. В Solaris Sun Microsystemsмаркирует освобожденную память ядра (KMEM_FREE_PATTERN)
DEADCAFE , используемое Microsoft .NET в качестве номера ошибки в библиотеках DLL
DEADC0DE , используемый в качестве маркера в прошивке OpenWRT для обозначения начала создаваемой файловой системы jffs2 в конце статической прошивки
DEADFA11 , указывает на то. Что приложение Apple iOS было принудительно закрыто пользователем[22]
DEADF00D , Используемая Мунгуоллом на Commodore Amiga для обозначения выделенной. Но неинициализированной памяти[25]
DEFEC8ED , используемый для отвалов ядра OpenSolaris
DEADDEAD означает. Что пользователь намеренно инициировал аварийный дамп либо из отладчика ядра. Либо с клавиатуры.[26]
D00D2BAD Используемый Safari crashes на macOS Big Sur.]
EBEBEBEB Из SmartHeap от MicroQuill
FADEDEAD , приходит в конце. Чтобы идентифицировать каждый сценарий AppleScript
FDFDFDFD Используется функцией MicrosoftC/C++ debug malloc() для обозначения охранных байтов «ничейной земли» до и после выделенной памяти кучи[23] и некоторыми отладочными безопасными функциями C-Runtime, реализованными Microsoft (например. Strncat_s) [28]
FEE1DEAD , используемый Linux reboot() syscall
FEEDFACE , видимое в двоичных файлах PowerPC Mach-O на платформе macOS компании Apple Inc. На Солярисе Sun Microsystemsотмечена красная зона (KMEM_REDZONE_PATTERN)

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

FEEEFEEE , используемая Microsoftdebug HeapFree() для обозначения освобожденной памяти кучи. Некоторые близлежащие внутренние бухгалтерские значения также могут иметь высокое значение слова FEEE.[23]

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

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

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

Поскольку они часто использовались для обозначения областей памяти. Которые были по существу пусты. Некоторые из этих терминов стали использоваться во фразах. Означающих .

См. также

  1. ^ b c
  2. ^ Мартин, Роберт К. (2009). Clean Code — Справочник по гибкому программному мастерству. Бостон: Прентис-Холл. ISBN 978-0-13-235088-4.
  3. ^ Магуайр, Джеймс (2008-12-09). . Datamation.com. Архивировано с оригинала 2018-06-23.
  4. ^ Фогель, Джефф (2007-05-29). . Разработчик IBM.
  5. ^ . Bell Labs. 2002-06-22. Архивирован с оригинала 2006-11-04 годов.
  6. ^ Личное общение с Деннисом М. Ричи.
  7. ^ . Общество наследия Unix. Архивирован с оригинала на 2008-10-20 гг.
  8. ^ . Общество наследия Unix. Архивирован с оригинала на 2008-10-20 гг.
  9. ^ Подпись файла PNG. MIT. 1996-10-01.
  10. ^ Чен, Рэймонд (2008-03-24). . Старая Новая Вещь. Архивировано с оригинала 2019-02-18.
  11. ^ b c Paul, Matthias R. (2002-04-03). . Freedos-dev. Архивирован с оригинала на 2017-09-09. Получено 2017-09-09. (NB. Упоминает ряд магических значений. Используемых IBM PC-совместимыми BIOS (0000h, 1234h). Менеджерами памяти DOS. Такими как EMM386 (1234h) и дисковыми кэшами. Такими как SMARTDRV (EBABh. BABEh) и NWCACHE (0EDCh. EBABh, 6756h).)
  12. ^ . База знаний NeoSmart. 2015-01-25. Извлечено 2019-02-03.
  13. ^ . Texas Instruments, 2011-08-27.
  14. ^ Поли, Джош (2009-09-30). . MSDN.
  15. ^ Новичок, Джозеф М. (2001-10-13). . Слияние разработчиков. Проверено 2007-11-16.
  16. ^ Остерман, Ларри (2005-07-21). — Блог Ларри Остермана- Исповедь старого Чудака. MSDN. Извлечено 2007-11-16.
  17. ^ . Оракул. Проверено 2010-06-18.
  18. ^ . Gnu.org. Проверено 2014-06-26.
  19. ^ Хеддингс, Лоуэлл (2014-11-03). . Как-То Выродок. Проверено 2017-10-03.
  20. ^ Кавит, Дуг (2012-04-24). . Microsoft Secure. Проверено 2018-07-26.
  21. ^ Болейн, Эрих Стефан (1995-04-04). . Uruk.org.
  22. ^ b c d e f . Документация разработчика Apple, 2009-01-29.
  23. ^ b c d e f Биркетт, Эндрю. . Nobugs.org.
  24. ^ Макнамара. Пол (2012-07-19). Да, действительно. Сетевой мир.
  25. ^ Scheppner, Carolyn. . Cataclysm.cx. Архивирован с оригинала 2011-07-18. Проверено 2010-08-20.
  26. ^ . Документация Microsoft.
  27. ^ .
  28. ^ . Документация Microsoft. Извлечено 2019-01-16.