很久以前,我学会了如何填充未使用/未初始化的内存0xDEADBEEF
这样,在调试器或崩溃报告中,如果我看到该值,我就知道我正在查看未初始化的内存。我从 iOS 使用的崩溃报告中看到0xBBADBEEF
.
人们还使用了哪些其他创造性价值观?任何特定的价值观是否有任何特定的好处?
将值转化为单词的最明显的好处是,至少对大多数人来说,如果单词是他们的语言,那么它们很容易突出,而某些严格的数字值则不太可能突出。
但是,也许还有其他选择数字的原因?例如,奇数可能会导致处理器崩溃(68000),例如在某些内存访问上,因此最好选择0x0BADBEEF
over 0xBADBEEF0
。它们的任何其他值(可能是特定于处理器的)对于使用未初始化的内存有具体的好处吗?
一般来说,您需要一个在解释为整数、指针或字符串时不太可能“起作用”的值。因此,这里有一些限制:
不要使用目标架构上最小“通常”对齐的倍数的值。对于 x86,这是 4(字节),因此没有可以被 4 整除的值。这确保了如果该值被解释为指针,那么它显然是不正确的。如果您使用的是非 x86 体系结构,您甚至可以使用一个在用作指针时会导致对齐陷阱的值。
不要使用合理的小(正或负)整数值。 C 程序中典型的“int”变量永远不会大于 1,000 左右,因此不要使用较小的数字来填充空数据。
不要使用完全由有效 ASCII 字符组成的值。确保其中至少有一个字节设置了高位。如今,您需要确保它们不是有效的 UTF-8 值或可能不是有效的 UTF-16 值。
值中没有任何零字节。在很多情况下,这对于防止程序崩溃“有帮助”——终止字符串、为非 int 字段提供看起来合理的值等。
不要一遍又一遍地重复使用单个(或两个)字节值。拥有全字长模式可以更轻松地确定通配指针最终如何指向它所在的位置,至少缩小哪些操作将其从模式开头偏移。
不要使用映射到“典型”进程的有效地址的值。如果设置了最高位,则通常需要大量的 malloc() 才能使进程变得足够大以使其成为有效地址。
也许并不奇怪,像这样的模式0xDEADBEEF
基本上满足所有这些要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)