- 论坛徽章:
- 3
|
楼主就快要解决了, bug都是自己干的, 怀疑系统和硬件只是一个过程..
这位朋友讲得真是精辟啊!!!虽说自己经验浅薄,但也明白了一个道理“认识是需要一个过程的”{:3_193:}
我的程序现在好像暂时安全了,可以交差了 ,我的结论是由于我的一个数组下标是用一个宏来标识的,这个宏的值小了,导致数组溢出了......
但是我又还是非常怀疑我的结论,所以下面我把具体的代码场景给大家展示一下,望前辈们给我定夺定夺!!!{:3_193:}
#define MAX_NAME 15
...
struct TB{
char tb_name[MAX_NAME];
unsigned short tb_id;
int length;
char tb_ins[MAX_NAME];
};
...
struct TB* p_tb = calloc(N,sizeof(struct TB));
for(i = 0;i < N;i++ ){ /*这个N的值并不大,最多就十几*/
...
strncpy(p_tb.tb_name,name,sizeof(name));
p_tb.tb_id = id;
p_tb.length = len;
strncpy(p_tb.tb_inst,inst,sizeof(inst));
...
func(..,..,..);
...
}
...
func(){
...
p_locoal = calloc(M,1); /*这个M的值也并不大,100以内*/
...
}
“偶尔”会在FUNC函数(进行到for 循环的最后一次时)的calloc函数处CORE DUMPED 出现realfree segv错误,当然并不一定完全就是CALLOC函数才CORE DUMPED,如果换作其它的接口,只要底层调的是maloc接口(分配堆空间)都会出现以上错误。注意这里,说的“偶尔”指的是我的程序的参数换一下,或许就不会出错。当我把这个宏调到足够大时,程序“暂时”稳定了下来。
经过调查发现,在调用FUNC函数之间的填充操作中,strncpy函数的第三个参数的值很可能会超出宏定义的MAX_NAME的大小,导致堆中的结构体数组成员溢出,这里我对于这个时候因数组溢出而导致的后果的推断是会覆盖结构体后序的成员,好像并不会导致CORE DUMPED,顶多填充的数据全乱了,这是我的疑问1??
针对这个问题我又做了相关的测试,下面更让人感到郁闷了!{:3_198:}
当我又增加了一组数据,也就是说STRUCT TB多分配了一个,循环也多了一层,这样程序竟然正常地跑了起来!!!{:3_183:}我DBX 跟踪了一下,留意看了下我填充的STRUCT TB结构,发现即使strncpy第三个参数要比MAX_NAME大,填充后,结构体的tb_id 并不没有被覆盖,tb_name被截断了!{:3_183:} |
|