strcpy引起的内存溢出

项目中有一段代码调用函数C_DataBaseInterface::BulkExecSql,函数部分代码如下:

 

if(strncmp("SELECT",sql,6)==0) { #ifdef DEBUG printf("in SELECT/n"); #endif strcpy(tablename,strstr(sql,"FROM")+5); for(i=1;i<50;i++) { if(tablename[i]==' '||tablename[i]=='('|| tablename[i]=='/t'||tablename[i]=='/0') { tablename[i]=0; break; } } #ifdef DEBUG printf("tablename:%s/n",tablename); #endif c=strstr(sqlstmt,"SELECT"); while(csize()resize(DEFAULTARRAYLINE*fieldnum); } DataOutExec(pos,DEFAULTARRAYLINE,s); if(s>DEFAULTARRAYLINE) { s%=DEFAULTARRAYLINE; } nTotal+=s; for(j=0;jresize(nTotal*fieldnum); #ifdef DEBUG printf("nTotal==%d/n",nTotal); #endif if(nTotal 

这是一个库函数,但是在调用这个库函数中的BulkExecSql函数时发生了coredump,跟进代码时发现函数coredump发生在函数执行完成时,就是在函数返回时发生了coredump,在进一步检查程序时发现strcpy(tablename,strstr(sql,"FROM")+5);这句话似乎存在隐患,因为char tablename[50]="";但是sql的长度可能远远超过50,在实际测试中发现并不是每次都会发生coredump,取决于sql的长度,但是似乎在sql在100以内是可以的,太长就会出现coredump,那么现在问题基本可以定位,就是因为这次的strcpy引起了内存溢出,strcpy将tablename后的内存覆盖,那么本来存放的程序信息被覆盖,导致在返回时出错,进而coredump。

现在的问题是超过不多是没有关系的,可能要研究研究编译的内存是如何存放的,有空继续研究研究

 

你可能感兴趣的:(strcpy引起的内存溢出)