C中的幻数

时间:2012-08-19 05:21:09

标签: c magic-numbers

我想在检查没有违反内存块的情况下使用幻数作为常量,是否有“反向检查”方法将签名恢复为十六进制格式MAGIC_32BIT

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

另外,我想使用更具创意的幻数,有关生成它们的想法或要遵循的规则吗?没有冒犯,但我听说过微软的0xB16B00B5,并希望我更加人性化“可读”。

2 个答案:

答案 0 :(得分:1)

是的,我找到答案,直接检查宏,cegfault的维基评论显示int变量是可互换的,无需使用所需的转换。

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

答案 1 :(得分:1)

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

您的“幻数”应该取决于您的应用程序以及您想要检测或期望的内存损坏类型。

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

你可以去自定义路线并且每个数据结构都有一个唯一的幻数 - 比如CRC。它更昂贵,但它会更好地检测数据结构是否已损坏。它不会告诉你它在哪里/如何/何时被破坏,而只是它是否存在。遗憾的是,这将使您的人类可读请求失败。

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

希望这有帮助。