2012-04-10 109 views
1

我正在对一些旧的C++代码做一些静态分析工作,而我的C++并不是最强大的。我有这样一段代码:C++索引TCHAR字符串

void NIDP_clDPLogger::log(TCHAR *logString) 
{ 
    TCHAR temp_logString[1024] = {0}; 
    _tcsncpy(temp_logString,logString,1024); 
    temp_logString[1023] = NULL; 
      ... 

静态分析工具是在1024抱怨索引logString(传递给函数的参数)的位置时,它可能更短(大小各不相同,1024是最大大小我猜)。所以,我想我的解决方法是检查logString的大小和使用,就像这样:

void NIDP_clDPLogger::log(TCHAR *logString) 
{ 

    size_t tempSize = sizeof(logString); 
    TCHAR temp_logString[tempSize] = {0}; 
    _tcsncpy(temp_logString,logString,tempSize); 
    temp_logString[tempSize-1] = NULL; 

我只是想知道,将这项工作好不好?任何人都可以看到任何缺陷/问题吗?构建和测试这个项目有点困难,所以我基本上只是在完成所有这些之前寻找一个完整的检查。还是有更好的方法来做到这一点?我可以将size_t值传递给_tcsncpy,因为之前有一个硬编码的int吗?

感谢您的帮助。

回答

3

sizeof(logString)将返回TCHAR*的大小,而不是传递数组时传递的数组大小作为参数传递时衰减为指针。

如果确保logString为空终止,则可以使用_tcslen()获取其长度。否则,知道logString大小的唯一方法就是将它作为另一个参数传递给函数。

+0

好的,非常感谢这个hmjd! – DukeOfMarmalade 2012-04-10 10:49:42