В Visual Studio у всех нас было «baadf00d», мы видели «CC» и «CD» при проверке переменных в отладчике в C ++ во время выполнения.
Из того, что я понимаю, "CC" находится в режиме отладки только для указания, когда память была новой () или alloc () и унитилизована. В то время как «CD» обозначает удаление или освобождение памяти. Я видел только baadf00d в RELEASE build (но я могу ошибаться).
Время от времени мы попадаем в ситуацию с утечками памяти, переполнением буфера и т. Д., И такая информация оказывается полезной.
Будет ли кто-нибудь достаточно любезен, чтобы указать, когда и в каких режимах памяти установлены распознаваемые байтовые шаблоны для целей отладки?
debugging
visual-c++
HidekiAI
источник
источник
Ответы:
Эта ссылка имеет больше информации:
http://en.wikipedia.org/wiki/Magic_number_(programming)
источник
BAADF00D
(плохая еда),BEEFCACE
(говяжий пирог),BAADCAB1E
(плохой кабель),BADCAFE
(плохое кафе) иDEADDEAD
(мертвый мертвец). Это намеренно?0xDEADBEEF
,0xC0EDBABE
Также классика , даже если они не попадают в просторечии МСBEA71E5
На самом деле к отладочным выделениям добавлено довольно много полезной информации. Эта таблица является более полной:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
источник
Что касается
0xCC
и ,0xCD
в частности, эти реликвии от Intel 8088 / 8086 набор команд процессора еще в 1980 - х годах.0xCC
это особый случай программного кода прерывания . Специальная однобайтовая версия позволяет программе генерировать прерывание 3 .INT
0xCD
0xCC
Хотя номера программных прерываний, в принципе, произвольны,
INT 3
традиционно использовались для функции прерывания отладчика или функции точки останова , соглашение, которое сохраняется и по сей день. Каждый раз, когда запускается отладчик, он устанавливает обработчик прерываний для тогоINT 3
, чтобы при выполнении этого кода операции был запущен отладчик. Обычно это приостанавливает текущее программирование и отображает интерактивное приглашение.Обычно
INT
код операции x86 составляет два байта:0xCD
за ним следует номер прерывания от 0 до 255. Теперь , хотя вы могли бы выпустить0xCD 0x03
наINT 3
, Intel решила добавить специальный version--0xCC
без дополнительного байта - потому что опкод должен быть только один байт, чтобы функционировать в качестве надежного «заполнения байта» для неиспользуемой памяти.Суть здесь в том, чтобы обеспечить постепенное восстановление, если процессор ошибочно переходит в память, которая не содержит каких-либо предполагаемых инструкций . Многобайтовые инструкции не подходят для этой цели, так как ошибочный переход может привести к любому возможному смещению байта, где он должен был бы продолжаться с правильно сформированным потоком команд.
Очевидно, что однобайтовые коды операций работают для этого тривиально, но могут быть и причудливые исключения: например, рассматривая последовательность заполнения
0xCDCDCDCD
(также упомянутую на этой странице), мы можем видеть, что она достаточно надежна, поскольку независимо от того, где находится указатель инструкции ( кроме, возможно, последнего заполненного байта), CPU может возобновить выполнение действительной двухбайтовой инструкции x86CD CD
, в этом случае для генерации программного прерывания 205 (0xCD).Что еще более странно, в то время
CD CC CD CC
как 100% интерпретируемо - дает либоINT 3
илиINT 204
- последовательностьCC CD CC CD
менее надежна, только 75%, как показано, но обычно 99,99%, когда повторяется как заполнитель памяти целого размера.Справочник по макросам , 1987
источник
NOP
для? Разве недостаточно ввода одного0xCC
байта с помощью командыeb
(введите байты)?