C语言中的幻数

C语言中的幻数,c,magic-numbers,C,Magic Numbers,我想用一个幻数作为常量来检查内存块是否被破坏,是否有“反向检查”的方法将签名恢复为十六进制格式的magic\u 32BIT #define MAGIC_32BIT 0x77A5844CU int signature = (int)MAGIC_32BIT; 还有,我想用一个更有创意的魔法数字,有没有关于生成它们的想法或者要遵循的规则?无意冒犯,但我听说了微软的0xB16B00B5,希望我的更具人性化的“可读性”。是的,我找到了答案,直接用宏检查,cegfault的wiki评论显示int变量是

我想用一个幻数作为常量来检查内存块是否被破坏,是否有“反向检查”的方法将签名恢复为十六进制格式的
magic\u 32BIT

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

还有,我想用一个更有创意的魔法数字,有没有关于生成它们的想法或者要遵循的规则?无意冒犯,但我听说了微软的
0xB16B00B5
,希望我的更具人性化的“可读性”。

是的,我找到了答案,直接用宏检查,cegfault的wiki评论显示int变量是可互变的,无需使用强制转换

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

我知道这个回答可能无法回答你的问题,但我仍然希望它能有所帮助

您的“神奇数字”实际上应该取决于您的应用程序,以及您想要检测或预期的内存损坏类型

我见过使用0xEE初始化任务整个堆栈的操作系统——这个值很容易识别,也不太可能被大多数人使用。此方法可用于通过计算0xEE字节来猜测未使用的堆栈空间量。它完美吗——不;但是它很快,(相当)便宜而且容易做。这样做的好处之一是,您有时可以轻松识别哪些字节正在损坏(例如,如果在0xEE字节的海洋中有两个非0xEE字节)。基本理念应该可以转移到其他领域

您可以使用自定义路由,每个数据结构都有一个唯一的幻数——比如CRC。它的成本更高,但在检测数据结构是否已损坏方面会更好。它不会告诉你它在哪里/如何/何时被损坏,只会告诉你它是否被损坏。不幸的是,这会使您的可读请求失败

如果您的内存块足够大,那么可以利用MMU并通过默认情况下禁用对内存块的写入来保护内存块,并且只在您需要进行更改的时间段内启用它们,这可能是可行的。此方法可能会有一些写性能损失,但它可以帮助检测何时、何地以及由谁发生损坏。这完全消除了这个神奇的数字


希望这有帮助。

0xBADF00D
?虽然这不是我的发明,苹果公司已经用它来制作他们的crashlogs了,但它很容易让人阅读。只要有创意就行了。看一看十六进制数字,它们似乎映射成字母(如果你足够交叉眼睛的话,几乎所有的十六进制数字)并生成一些单词。实验。下面是一个列表:嗯,听起来你在不了解C语言的基本知识的情况下要做一些低级记忆的事情。也许你应该首先学习关于类型系统和升级规则的所有知识。C给了你做你想做的事情的自由,但是你应该知道你在做什么。