最近迁移代码测试功能的时候发现一个段错误,打印堆栈显示std::string析构时段错误。最后分析原因:sprintf造成字符数组内存溢出,踩内存,导致附近std::string对象被改修,析构时产生段错误。
原代码
if(response_code == 200) { sprintf(temp,"HTTP请求成功[%s]", strResponce.c_str()); dispPlayMsg("HTTP请求",index,temp,WEB_LOG); return TRUE; }
strResponce为http的响应结果,平时的都是本公司的soap服务,返回
字节数都很少,测试时的服务返回长度超过temp长度,溢出,踩内存。
修改后
if(response_code == 200) { //sprintf易造成越界,导致段错误 snprintf(temp, sizeof(temp), "HTTP请求成功[%s]", strResponce.c_str()); dispPlayMsg("HTTP请求",index,temp,WEB_LOG); return TRUE; }
慎用sprintf,尽量使用snprintf。
原来工作中就遇到过sprintf造成的段错误。