指针的安全性问题

2017-08-26  本文已影响8人  SDBridge

指针在提供方便的同时,也相当危险.

int main(int argc, const char * argv[]) {
    int array[4] = {9,10,11,12};
    int array2[8] = {1,2,3,4,5,6,7,8};
    
    for (int i = 0; i < 12; ++i) {
        printf("%d\n", array2[i]);
    }
    return 0;
}

运行的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12

array、array2的内存结构,在它们初始化的时,都是放在栈中,而栈的物理结构是连续的,并且按照FIFO的原则,array先初始化放在高地址,array2后初始化放在低地址。如下图所示:

array和array2在栈上的存储结构.png

可见,透明的指针带来的问题在于,开发者知道了太多他们本来不该知道的东西(比如开发者竟然可以拿到变量的真实地址,还可以不借助变量名就访问一个变量,比如这里的 array)。在某些精心构造的场合下,攻击者甚至可以通过修改字符串的值来控制程序的执行逻辑,只要计算得当,他们可以调用原本根本不会被调用的函数。

在引用的概念中,引用就是引用,它什么也不是,更不可能是数字,也就谈不上什么四则运算了。因此想要通过 A 对象的引用来访问 B 对象是完全不可能的。

上一篇下一篇

猜你喜欢

热点阅读