0xDEADBEEF等同于64位开发?
对于32位系统(无论是Linux, Mac OS还是Windows, PowerPC
或x86)的C ++开发,我已经初始化了指针,否则这些指针可能是未定义的(例如,它们不能立即得到适当的值)
int *pInt = reinterpret_cast<int *>(0xDEADBEEF);
(为了节省打字和DRY的右手边通常是一个常数,例如BAD_PTR。)
如果pInt在得到适当的值之前被解引用,那么它会在大多数系统上立即崩溃(而不是在一些内存被覆盖或进入很长的循环时崩溃太多)。
当然,行为依赖于底层硬件(从用户进程的奇数地址0xDEADBEEF获得一个4字节的整数可能是完全有效的),但是到目前为止我开发的所有系统的崩溃已经100%可靠Mac OS 68xxx ,Mac OS PowerPC,Linux Redhat Pentium,Windows GUI Pentium,Windows控制台Pentium)。 例如在PowerPC上,从一个奇数地址中取出一个4字节的整数是非法的(总线故障)。
这对于64位系统有什么价值?
一般来说,你写的是什么模式并不重要,重要的是你可以识别模式,以确定发生问题的地方。 在Linux内核中,经常会select这样的地址,以便在地址被解除引用时可以被困住。
在include / linux / poison.h下查看Linux内核。 该文件为许多不同的内核子系统包含不同的毒性值。 没有一个毒素值是合适的。
此外,您可以检查Linux内核源代码树中的每个体系结构包含文件,以获取有关特定体系结构上所用内容的信息。
0xBADC0FFEE0DDF00D
根据维基百科 ,在IBM RS / 6000 64位系统上使用BADC0FFEE0DDF00D来指示未初始化的CPU寄存器。
大多数当前的64位系统只允许使用地址空间的最低2 48 -2 52位; 地址的高位必须全零。 一些芯片(例如amd64)也可以使用最高的 2 48 -2 52 。 这些范围以外的地址不能映射到可访问的内存; 硬件根本不会允许它。
因此,我build议你使用一个接近2 63的值,这个值在任何可用的空格都没有。 如果前四个hex数字是7ff8,则该值将是双精度浮点型NaN,这很方便。 所以我build议可爱的hex短语是0x7FF8BADFBADFBADF。
顺便说一下,你真的不希望使用接近于0的值,因为这使得很难通过解引用中毒模式来告诉NULL的偏移解引用(例如结构成员访问)。
我假设你已经打折空(即没有typecast 0)。 这绝对是最安全的select,理论上,一个有效的指针可以指向内存地址0xDEADBEEF(或任何其他非NULL内存地址)。
0xDEADBEEFBAADF00D
可能工作。
我没有一个好的select,但这里有一个hex的单词列表 ,你可以使用它来做你的短语。
两个0xDEADBEEF应该就够了,我想..
我看到几个声称NULL的答案是一个不错的select,但我不同意。
NULL通常用作函数的有效返回值。 它表示失败返回或未知值。 这与“未初始化的指针”不同。
在代码上使用debugging器并查看NULL会产生两种可能性:指针从未初始化,或者内存分配失败。
将未初始化的指针设置为0xDEADBEEF或等效的64位意味着空指针指示有意的值。
当然,这取决于操作系统和环境。 我不认为0xDEADBEEF在任意的32位系统中也是一个不好的指针。
实际上,任何现代操作系统都应该访问保护前几页的进程内存,所以NULL应该是一个很好的无效指针值。 方便,它已经为您预先定义。
0x42
可以在32位和64位上工作? (它应该仍然会触发一个崩溃,因为它与NULL指针足够接近,并且由于它相当大,所以在结构指针为NULL的结构字段的常规解引用中,您可能不会有这种情况)。