很久以前我学会了用0xDEADBEEF填充未使用/未初始化的内存,以便在调试器或崩溃报告中,如果我看到该值,我知道我正在查看未初始化的内存.我从崩溃报告中看到iOS使用0xBBADBEEF.
人们使用了哪些其他创造性价值观?任何特定的价值观都有任何特定的好处吗?
变成单词的价值观最明显的好处是,至少在大多数人中,如果单词是用他们的语言,那么他们很容易突出,因为某些严格的数值不太可能突出.
但是,也许有其他理由选择数字?例如,奇数可能会使处理器(68000)崩溃,例如在某些存储器访问时崩溃,因此最好在0xBADBEEF0上选择0x0BADBEEF.他们的任何其他值(可能是处理器特定的)是否具有用于未初始化内存的具体好处?
解决方法
一般来说,您需要一个在解释为整数,指针或字符串时不太可能发生“工作”的值.所以,这里有一些限制:
>不要使用目标体系结构中最小“常规”对齐的倍数值.对于x86,那是4(字节),所以没有可被4整除的值.这确保了如果将值解释为指针,那么它显然是不正确的.如果您使用的是非x86体系结构,则甚至可以使用一个值,如果将其用作指针,将导致对齐陷阱.
>不要使用可能合理地为小(正或负)整数的值. C程序中典型的“int”变量永远不会超过1,000左右,因此不要使用小数字作为空数据填充.
>不要使用完全由有效ASCII字符组成的值.确保高位设置中至少有一个字节.现在,您要确保它们不是有效的UTF-8或可能的UTF-16值.
>值中没有任何零字节.有太多的情况可以帮助保持程序崩溃 – 终止字符串,给非int字段一个合理的值,等等.
>不要使用单个(或两个)字节值,反复重复.使用全字长度模式可以更容易地确定野指针如何指向它的位置,至少缩小哪些操作从模式的开始偏移它.
>不要使用映射到“典型”进程的有效地址的值.如果设置了最高位,那么在您的进程增长到足以使其成为有效地址之前,通常需要大量的malloc().
也许不出所料,像0xDEADBEEF这样的模式基本上满足了所有这些要求.