- 论坛徽章:
- 1
|
本帖最后由 ecloud 于 2015-06-05 01:50 编辑
- /* Get RA and DEC from the mount*/
- write(fd,":GEC#",5);
- usleep(500000);
- n = read(fd,RADEC,20);
- RADEC[n] = 0;
- /* Get DEC*/
- dec_sign = RADEC[0];
- memcpy(DEC,&RADEC[1],8);
- DEC[8] = 0;
- dec = atoi(DEC);
- dec_d = dec/360000;
- dec_m = (dec-dec_d*360000)/6000;
- dec_s = (dec-dec_d*360000-dec_m*6000)/100;
- /* Get RA*/
- memcpy(RA,&RADEC[9],8);
- RA[8] = 0;
- ra = atoi(RA);
- ra_h = ra/3600000;
- ra_m = (ra-ra_h*3600000)/60000;
- ra_s = (ra-ra_h*3600000-ra_m*60000)/1000;
复制代码 这段代码的逻辑是,从串口读取一个17位长字符串RADEC,第0位符号,1-8给DEC转整数,9-16给RA转整数。目前为止功能实现正常,但是……
以下是第一次gdb的结果
- 50 n = read(fd,RADEC,20);
- 1: RADEC = "\000\000\000\000H\214\001@\001\000\000\000\000\000\000\000\030\217\001@"
- (gdb)
- 51 RADEC[n] = 0;
- 1: RADEC = "+3240000000642750#\001@"
- (gdb)
- 53 dec_sign = RADEC[0];
- 1: RADEC = "+3240000000642750#\000@"
- (gdb)
- 54 if (RADEC[0]=='+') dec_sign = 1;
- 1: RADEC = "+3240000000642750#\000@"
- (gdb)
- 55 if (RADEC[0]=='-') dec_sign = -1;
- 1: RADEC = "+3240000000642750#\000@"
- (gdb)
- 56 memcpy(DEC,&RADEC[1],8);
- 1: RADEC = "+3240000000642750#\000@"
- (gdb)
- 57 DEC[8] = 0;
- 1: RADEC = "+3240000000642750#\000@"
- (gdb)
- 58 dec = atoi(DEC);
- 1: RADEC = "\000\063\062\064\060\060\060\060\060\060\060\066\064\062\067\065\060#\000@"
复制代码 也就是说从57行 DEC[8] = 0;开始,RADEC的第一个字节被清0
后来经过研究发现,是编译器根据memcpy的操作长度臆断用户需要的内存空间,少给DEC分配了一个字节的内存,并且跟RADEC紧密相连,造成了DEC[8]跟RADEC[0]是同一个地址!
惊出了我一身冷汗,幸亏我这里只错了一位,没有造成太大影响,并且很凑巧的发现了这个问题。不然的话后果不堪设想,内存泄露就是这么很“正常”的产生了
我没试过X86平台是不是也这个德行,但是就ARM平台的这种情况来看,我要对gcc说一百句草泥马,你TM用得着这么帮我省内存吗??? |
|