sprintf,vsprintf越界问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sprintf,vsprintf越界问题
1sprintf,vsprintf越界问题
函数sprintf((CHAR *)pDest , format , ArgList)的第一个参数是要拷贝的目的地址,有长度限制,一般是数组。
函数vspintf函数也有类似情况。由于vsprintf一般封装后使用,如果传入的参数太长,调用vsprintf也会导致越界。
最近发现了几个sprintf,vsprintf导致越界问题,表现严重的是一段时间后单板异常复位,但AMPDEBUG没有打印;或者是更奇怪的现象,导致其他单板运行异常。这类故障很难发现和定位,需要引起重视。
目前改造sprintf,vsprintf函数不大现实,最有效的办法是仔细检查所有调用sprintf 的地方是否存在着拷贝越界现象。尤其要对于循环拷贝的sprintf进行仔细的分析。
建议有时间也检查检查数组和堆栈的越界,这些越界也会导致单板运行异常,并且不容易定位故障原因。
2检查和避免这类问题
●sprintf函数
例:char strLog[150]
StrLen = sprintf(strLog, "Except:0x%x,tno:0x%x,tname:%s, pno:0x%x,state:%d, signal:0x%x, EA:0x%x, MSR:0x%x, LA(%d-%d-%d-%d)",pExceptRecord->ExceptOffset, …..);
搜索所有的sprintf函数,计算字符串最大可能的长度(注意串的末尾有个’\0’)是否超过strLog所申请的空间150。
●vsprint函数
例:
D_K_dbException (PCHAR IerrMsg,...)
{
va_list apl; /* Argument list pointer */
BYTE message[255];/* Buffer to build string into */
。。。
va_start (apl, IerrMsg); /* Initialize va_ functions */
vsprintf (message, IerrMsg, apl); /* 如果不注意,可能覆盖message后面的区域,越界*/
va_end( apl ); /* close va_ functions */
。。。。
}
如果D_K_dbException所输入的参数太长,也会导致vsprintf调用越界。需要所有调用D_K_dbException的入参数所组装串的最大可能的长度是否超过了255。类似的函数也请进行检查。
3 可通过更换函数彻底解决这个问题
目前比较常用的有校验的做法有:
va_start(ArgList , format);
TaskMsg[1] = vsprintf((CHAR *)TaskMsg[0] , format , ArgList);
va_end(ArgList) ;
if(DBGMSG_MAXLEN < TaskMsg[1])
在版本运行中,这个拷贝个数判断已经没有什么意义了.如果越界的话,则已对其它的内存造成了影响.
所以,我们必须避免拷贝越界.