我们知道在linux下多线程之间,是共用同一片存储区域的,可以访问共享的全局变量等,但是能否访问线程内部的局部变量呢,会不会出现越界异常呢?今天笔者尝试了一下,发现可以在线程间越界访问!

代码如下:

/*
 * Author:yaronli <jidalyg_8711@163.com>
 * http://www.yaronspace.cn/blog
 *
 * File: hookpthread.c
 * Create Date: 2011-03-27 21:22:31
 *
 */
#include <stdio.h>
#include <pthread.h>
void * fun(void * i)
{
    int a=20;
    printf("fun: &a:[%x]-----a:[%d]\n", &a,a);
    sleep(3);
    printf("fun: &a:[%x]-----a:[%d]\n", &a,a);
    pthread_exit(NULL);
 
}
 
void * hook(void * a)
{
    int b=10;
    sleep(1);
    printf("hook: &b:[%x]\n", &b);
    printf("hook: &a:[%d]\n", *(&b-10489856/4));
    *(&b-10489856/4)=30;
    pthread_exit(NULL);
}
int main()
{
    pthread_t pidfun,pidhook;
    pthread_create(&pidfun, NULL, fun, NULL);
    pthread_create(&pidhook, NULL, hook, NULL);
    sleep(5);
    return 0;
}
/* vim: set ts=4 sw=4: */

该程序首先是在启动两个线程,在fun线程中设置局部变量a=20并显示出来,在hook线程中尝试读取a的变量值并试图更改它,然后再次显示变量a的值
在我的机器上的输出如下:

fun: &a:[419c512c]-----a:[20]
hook: &b:[423c612c]
hook: &a:[20]
fun: &a:[419c512c]-----a:[30]

可以发现a的在值在线程hook中被修改成功了,并没有出现越界访问异常

TIPS:
1. 10489856/4 关于这个值的获取是通过&b和&a的地址相减得到的,至于为什么除4,是因为&b是int型的指针,而指针的加减法的单位是4个字节,所以需要除以4,这里我也是调试好半边才搞明白的.

来自yaronspace.cn  本文链接:http://yaronspace.cn/blog/archives/1241