全局变量同名导致踩内存

今天遇到一个诡异的内存被踩的问题,后来发现是一个全局变量与另一个静态库中的全局变量重名了,

a.c:

#include 

int g_ctx = 0;
int g_overlap = 0;

int a_store_data(int n)
{
    g_ctx = n;
    return 0;
}

int a_read_data()
{
    printf("a_read_data: g_ctx(%d) g_overlap(%d)\n", g_ctx, g_overlap);
    return 0;
}

b.c:

#include 

typedef struct {
    int a;
    int b;
    int c;
} b_s;

b_s g_ctx;

int b_store_data(int a, int b, int c)
{
    g_ctx.a = a;
    g_ctx.b = b;
    g_ctx.c = c;
    return 0;
}

int b_read_data()
{
    printf("b_read_data: a(%d) b(%d) c(%d)\n", g_ctx.a, g_ctx.b, g_ctx.c);
    return 0;
}

main.c:

#include 

int main()
{
    a_store_data(40);
    b_read_data();
    b_store_data(1,2,3);
    a_read_data();
    return 0;
}

在a.c和b.c中都定义了全局变量g_ctx,反汇编后可以看到:


Disassembly of section .dynsym:

...skipping...
00021044 :
   21044:       00000000        andeq   r0, r0, r0

00021048 :
   21048:       00000000        andeq   r0, r0, r0

数据段中g_ctx中分配了4个字节,因此在b.c中访问g_ctx时会导致踩内存

因此全局变量尽量都用static进行修饰,加上static 后数据段如下:

Disassembly of section .dynsym:

...skipping...
   21028:       00000000        andeq   r0, r0, r0

0002102c :
        ...

00021044 :
   21044:       00000000        andeq   r0, r0, r0

00021048 :
   21048:       00000000        andeq   r0, r0, r0

0002104c :
        ...

可以看到数据段中有两个g_ctx

你可能感兴趣的:(全局变量同名导致踩内存)