0xDEADBEEF эквивалент для 64-битного?

для разработки C++ для 32-битных систем (будь то Linux,Mac OS или Окна,PowerPC или x86) у меня начинаются указатели, которые в противном случае будет неопределенным (например, они не могут сразу получите правильное значение) вот так:

int *pInt = reinterpret_cast<int *>(0xDEADBEEF);

(сохранить ввод и сухой правая сторона нормально быть в константе, например BAD_PTR.)

Если pInt разыменован, прежде чем он получит правильное значение, то он разобьется. сразу на большинстве систем (вместо сбой гораздо позже, когда какая-то память перезаписывается или идет в очень длинную петлю).

конечно, поведение зависит от базовых аппаратное обеспечение (получение 4-байтового целого числа из нечетного адрес 0xDEADBEEF из пользовательского процесса может быть идеально действительно), но сбой был 100% надежным для всех системы, которые я разработал до сих пор (Mac OS 68xxx, Mac OS Для PowerPC, Линукс Редхат Пентиум, Pentium с графическим интерфейсом Windows, Окна консоль Пентиум). Например, на PowerPC это незаконно (шина ошибка), чтобы получить 4-байтовое целое число из нечетного адреса.

что является хорошим значением для этого на 64-битных системах?

11 ответов


Как правило, это не имеет значения ровно какой шаблон вы пишете, имеет значение, что вы можете определить шаблон, чтобы определить, где возникают проблемы. Просто так получилось, что в ядре Linux они часто выбираются так, что они могут быть захвачены, если адреса разыменованы.

посмотрите в ядре Linux на включить / linux / poison.h. Этот файл содержит различные значения яда для многих различных подсистем ядра. Нет одна подходящая отравляющая ценность.

кроме того, вы можете проверить для каждой архитектуры включить файлы в исходное дерево ядра Linux для получения информации о том, что используется на конкретных архитектурах.


0xBADC0FFEE0DDF00D


согласно Википедии, BADC0FFEE0DDF00D используется в 64-разрядных системах IBM RS/6000 для указания неинициализированных регистров ЦП.


большинство текущих 64-битных систем позволяют использовать только самые низкие 248-252 биты адресного пространства; старшие биты адреса должны быть равны нулю. Некоторые чипы (например, amd64) также позволяют использовать высокий 248-252. Адреса вне этих диапазонов никогда не могут быть сопоставлены с доступной памятью; аппаратное обеспечение просто не позволит этого.

Я рекомендую вам использовать значение, близкое к 263, который ни в одном из возможных мест. Если ведущие четыре шестнадцатеричные цифры 7ff8, значение будет двойной точности с плавающей запятой NaN, что удобно. Поэтому моя предлагаемая милая шестнадцатеричная фраза-0x7FF8BADFBADFBADF.

кстати, вы действительно не хотите использовать значение, близкое к 0, потому что это делает его трудно сказать смещение разыменование NULL-доступа к элементу структуры, например - из разыменования шаблона poison.


Я предполагаю, что вы уже дисконтировали NULL (т. е. 0 без typecast). Это определенно самый безопасный выбор, так как, теоретически, действительный указатель может укажите адрес памяти 0xDEADBEEF (или любой другой ненулевой адрес памяти).


0xDEADBEEFBAADF00D может работать.


У меня нет хорошего выбора для вас, но вот список шестнадцатеричных слов что вы можете использовать, чтобы сделать ваши фразы.


двух 0xDEADBEEFs должно быть достаточно, я думаю..


Я вижу несколько ответов, утверждающих, что NULL-хороший выбор, но я не согласен.

NULL часто используется в качестве допустимого возвращаемого значения из функций. Это указывает на возврат ошибки или неизвестное значение. Это другое значение, чем "неинициализированный указатель"."

использование отладчика в коде и просмотр NULL оставят две возможности: указатель никогда не был инициализирован или не удалось выделить память.

установка неинициализированного указателя на 0xDEADBEEF или 64-разрядный эквивалент означает, что нулевой указатель указывает на преднамеренное значение.


Это зависит от ОС и окружающей среды, конечно. Я не думаю, что 0xDEADBEEF обязательно является плохим указателем в произвольной 32-битной системе.

реалистично, любая современная ОС должна защищать доступ к первым нескольким страницам памяти процесса, поэтому NULL должно быть хорошим недопустимым значением указателя. Достаточно удобно, это уже предопределено для вас.


0x42 может работать как на 32bit, так и на 64bit ? (Он все равно должен вызвать сбой, так как он достаточно близок к нулевому указателю, и, учитывая, что он довольно большой, скорее всего, у вас не будет его в регулярном разыменовании поля структуры с указателем структуры, равным нулю).