webgame遭遇double free or corruption (!prev):

星期二, 2012-12-04 | Author: Lee | linux, webgame, 游戏开发 | 4,238 views

游戏在内测的时候遭遇到double free or corruption (!prev):
单从上面的理解很简单就是说 有地方调了2次 free();的内存释放函数.
查了下,这种低级错误的可能性不大,但是游戏的环境是在 一个多线程的代码,在主线程中申请了一块内存,在另一个线程中释放内存,估计是这个原因.

*** glibc detected *** /home/sara/webgame/t1: double free or corruption (!prev): 0x090634c8 ***
======= Backtrace: =========
/lib/libc.so.6[0x7c7261]
/home/sara/webgame/t1[0x804891e]
/home/sara/webgame/t1[0x9804fb0]
/lib/libpthread.so.0[0x8dcab5]
/lib/libc.so.6(clone+0x5e)[0x83383e]
00759000-008c7000 r-xp 00000000 fd:00 158979 /lib/libc-2.11.so
008c7000-008c8000 —p 0016e000 fd:00 158979 /lib/libc-2.11.so
008c8000-008ca000 r–p 0016e000 fd:00 158979 /lib/libc-2.11.so
008ca000-008cb000 rw-p 00170000 fd:00 158979 /lib/libc-2.11.so

进过排查和结合网上的遇到的说明修正如下函数:(另:可以在你做free()的统一函数地方做赋值指针为null做检测)

1.使用函数snprintf() 代替函数sprintf()

1
2
3
4
5
6
7
8
9
10
11
12
13
void f(const char *p)
{
    char buf[11]={0};
    sprintf(buf,"s",p); // very dangerous  p 的长度大于10个字符的时候会发生缓冲区溢出
    printf("%sn",buf);
}
 
void f(const char *p)
{
    char buf[11]={0};
    snprintf(buf, sizeof(buf), "s", p); // 注意:这里第2个参数应当用sizeof(str),而不要使用硬编码11,也不应当使用sizeof(str)-1或10
    printf("%sn",buf);
}

2.strncpy()、strncmp()、strncat()、strnicmp() 和 strnset() 相应地代替strcmp()、strcat()、stricmp() 和 strset()

Tags: , ,

文章作者: Lee

本文地址: https://www.pomelolee.com/1067.html

除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址

No comments yet.

Leave a comment

Search

文章分类

Meta