C 中的幻数

  • 本文关键字: c magic-numbers
  • 更新时间 :
  • 英文 :


我想使用幻数作为常量来检查内存块是否未被侵犯,有没有一种"反向检查"方法将签名恢复为十六进制格式MAGIC_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 并通过默认禁用对内存块的写入并仅在需要进行更改的持续时间内启用它们来保护内存块可能是可行且切实可行的。 此方法会有一些写入性能损失,但它可以帮助检测何时、何地以及由谁发生损坏。 这完全消除了幻数。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新