1

我想用一个幻数作为常数来检查内存块是否被违反,是否有一种“反向检查”的方法可以将签名恢复为十六进制格式MAGIC_32BIT

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

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

4

2 回答 2

1

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

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

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

你可以走自定义路线,每个数据结构都有一个唯一的幻数——比如 CRC。它更昂贵,但在检测数据结构是否已损坏方面会更好。它不会告诉您它在何处/如何/何时损坏,而只会告诉您是否损坏。不幸的是,这会使您的人类可读请求失败。

如果您的内存块足够大,则可以利用 MMU 并通过默认禁用对它们的写入来保护您的内存块,并且仅在您需要进行更改时启用它们。这种方法会产生一些写入性能损失,但它可以帮助检测何时、何地以及由谁发生损坏。这完全消除了幻数。

希望这可以帮助。

于 2012-08-19T12:37:58.580 回答
1

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

#define MAGIC_NUM 0x8BADF00D
#define CHECK_SIG(A) (A == MAGIC_NUM)
于 2012-08-19T05:48:04.770 回答