我想使用一个幻数作为常量来检查是否违反了内存块,是否有一种"反向检查"方法将签名恢复为十六进制格式MAGIC_32BIT
#define MAGIC_32BIT 0x77A5844CU
int signature = (int)MAGIC_32BIT;
另外,我想使用更具创造力的魔术数字,关于生成数字或遵循规则的任何想法? 没有冒犯,但我听说过Microsoft的0xB16B00B5,并希望我的语言对人类更具"可读性"。
0xBADF00D? 虽然不是我的发明,但苹果已经将其用于崩溃日志,但是它很容易被人读懂。
只要有创造力。 查看看起来映射到字母字母的十六进制数字(如果您足够睁开眼睛,几乎全部都用十六进制数字表示)并制作一些单词。 实验。
以下是列表:http://en.wikipedia.org/wiki/Hexspeak#Notable_magic_numbers
我知道此回复可能无法回答您的问题,但我仍然希望它能有所帮助。
您的"魔数"实际上应该取决于您的应用程序以及要检测或期望的内存损坏类型。
我已经看到过使用0xEE初始化任务整个堆栈的操作系统,该值既易于识别,也不可能被大多数人使用。该方法可用于通过计数0xEE字节来估算未使用的堆栈空间量。完美吗?但它很快((相当)便宜且容易实现)。这样做的好处之一是,您有时可以轻松地识别出哪些字节已损坏(例如,如果在0xEE字节中有几个非0xEE字节)。基本思想应该可以转移到其他领域。
您可以采用自定义路线,并且每个数据结构都有一个唯一的幻数-例如CRC。它更昂贵,但是在检测数据结构是否已损坏时会更好。它不会告诉您损坏的位置/方式/时间,而仅告诉您是否损坏。不幸的是,这将使您的可读请求失败。
如果您的内存块足够大,则可以通过默认情况下禁用对它们的写入,并仅在需要进行更改的时间内启用它们,来利用MMU并保护您的内存块。此方法可能会有一些写入性能的损失,但是它可以帮助检测损坏的时间,地点和人员。这完全消除了幻数。
希望这可以帮助。
是的,我找到了答案,直接检查了宏,ceffault的Wiki评论显示int变量可以互换,而无需使用强制转换。
#define MAGIC_NUM 0x8BADF00D
#define CHECK_SIG(A) (A == MAGIC_NUM)
嗯,听起来您将在不了解C的基本知识的情况下做一些低级的内存工作。也许您应该首先学习有关类型系统和提升规则的所有知识。 C给您所有自由去做您想做的事,但是您应该始终知道自己在做什么。