gpt4 book ai didi

c++ - 用于调试的未初始化内存的常见值是什么?

转载 作者:IT王子 更新时间:2023-10-28 23:39:09 25 4
gpt4 key购买 nike

很久以前,我了解到使用 0xDEADBEEF 填充未使用/未初始化的内存,以便在调试器或崩溃报告中,如果我看到该值,我知道我正在查看未初始化的内存。我从崩溃报告中看到 iOS 使用 0xBBADBEEF

人们还使用了哪些其他创意值(value)?任何特定的值(value)观是否有任何特定的好处?

将值转化为单词的最明显好处是,至少对大多数人来说,如果单词是他们的语言,它们很容易突出,而某些严格的数字值不太可能突出。

但是,也许还有其他理由选择数字?例如,奇数可能会使处理器 (68000) 崩溃,例如在某些内存访问时,因此最好选择 0x0BADBEEF 而不是 0xBADBEEF0。它们是否有任何其他值(可能是特定于处理器的)对用于未初始化内存有具体好处?

最佳答案

一般来说,您需要一个在解释为整数、指针或字符串时不太可能发生“工作”的值。所以,这里有一些限制:

  • 不要使用目标架构上最小“通常”对齐方式的倍数的值。对于 x86,这是 4(字节),因此没有可被 4 整除的值。这确保了如果该值被解释为指针,它显然是不正确的。如果您使用的是非 x86 架构,您甚至可以使用一个如果用作指针会导致对齐陷阱的值。

  • 不要使用合理的小(正或负)整数值。 C 程序中的典型“int”变量永远不会大于 1,000 左右,因此不要使用小数字作为空数据填充。

  • 不要使用完全由有效 ASCII 字符组成的值。确保其中至少有一个字节设置了高位。现在,您需要确保它们不是有效的 UTF-8 或可能的 UTF-16 值。

  • 值中没有任何零字节。在很多情况下,这对于防止程序崩溃“有帮助”——终止一个字符串,给一个非 int 字段一个看起来合理的值等等。

  • 不要使用一个(或两个)字节值,一遍又一遍地重复。拥有一个全字长模式可以更容易地确定你的野指针如何最终指向它所在的位置,至少缩小了哪些操作从模式开始偏移它。

  • 不要使用映射到“典型”进程的有效地址的值。如果设置了最高位,通常需要大量 malloc() 才能使您的进程变得足够大以使其成为有效地址。

也许不出所料,像 0xDEADBEEF 这样的模式基本上可以满足所有这些要求。

关于c++ - 用于调试的未初始化内存的常见值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39158799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com