Волшебные числа в C

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

 #define MAGIC_32BIT 0x77A5844CU
 int signature = (int)MAGIC_32BIT;

Кроме того, я хочу использовать более творческое магическое число, какие-нибудь идеи по их созданию или правилам для подражания? Без обид, но я слышал о Microsoft 0xB16B00B5 и хотел бы, чтобы мой был более "читабельным" человеком.

2 ответа

Да, я нашел ответ, прямо проверяя макросы, вики-комментарий cegfault показал, что переменные типа int взаимозаменяемы без необходимости приведения.

#define MAGIC_NUM 0x8BADF00D
#define CHECK_SIG(A) (A == MAGIC_NUM)

Я понимаю, что этот ответ не может ответить на ваш вопрос, но я все еще надеюсь, что он может быть полезным.

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

Я видел операционные системы, которые инициализировали весь стек задачи с 0xEE- значением, которое легко узнаваемо и вряд ли будет использоваться большинством людей. Этот метод может быть использован для оценки количества неиспользуемого пространства стека путем подсчета байтов 0xEE. Это идеально - нет; но это быстро, (довольно) дешево и легко сделать. Одним из преимуществ этого является то, что вы иногда можете легко определить, какие байты повреждены (например, если у вас есть пара не-0xEE-байтов в море 0xEE-байтов). Основная идея должна быть перенесена в другие области.

Вы можете пойти по специальному маршруту и ​​получить уникальный магический номер для каждой структуры данных - скажем, CRC. Это дороже, но лучше будет определить, была ли повреждена структура данных или нет. Он не скажет вам, где / как / когда он был поврежден, а только, был ли он или нет. Это, к сожалению, не сможет выполнить ваш читабельный запрос.

Если ваши блоки памяти достаточно велики, возможно, будет полезно и практично воспользоваться MMU и защитить ваши блоки памяти, отключив записи в них по умолчанию и включив их только на время, в течение которого вам нужно вносить изменения. Этот метод может иметь некоторые потери производительности записи, но он может помочь определить, когда, где и кем происходит повреждение. Это полностью устраняет магическое число.

Надеюсь это поможет.

Другие вопросы по тегам