代码输出如下:
Original ptr: 3216722220
ptr with data: 3216722223
data stored in ptr: 3
Cleansed ptr: 3216722220
Dereferencing cleansed ptr: 701
我们可以在指针中存储任何可以用两个比特位表示的数据。使用 put_data() 函数,设置指针的最低两位为要存储的数据。该数据可以使用get_data() 函数获取。此处除了最后两位所有的位都被覆盖为零,于是我们隐藏的数据就显示出来。
cleanse_pointer() 函数将最低两位置零,保证指针安全地解引用。注意虽然有些 CPU(像 Intel 允许我们访问未对齐内存地址,但其余 CPU(像 ARM)会出现访问错误。所以,要牢记在解引用前保证指针指向已对齐内存地址。
这在实际中有应用吗?
是的,有应用。查看 Linux 内核中红黑树的实现(链接:https://www.easck.com/p>
树的结点定义如下:
struct rb_node {
unsigned long __rb_parent_color;
struct rb_node *rb_right;
struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));
此处 unsigned long __rb_parent_color 存储了如下信息:
父节点的地址
结点的颜色
色彩的表示用 0 代表红色,1 代表黑色。










