Волшебные числа в 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 и защитить ваши блоки памяти, отключив записи в них по умолчанию и включив их только на время, в течение которого вам нужно вносить изменения. Этот метод может иметь некоторые потери производительности записи, но он может помочь определить, когда, где и кем происходит повреждение. Это полностью устраняет магическое число.
Надеюсь это поможет.