sprintf,vsprintf越界问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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])

在版本运行中,这个拷贝个数判断已经没有什么意义了.如果越界的话,则已对其它的内存造成了影响.

所以,我们必须避免拷贝越界.

相关文档
最新文档