1

我正在对一些旧的 C++ 代码做一些静态分析工作,而我的 C++ 不是最强的。我有这段代码:

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 吗?

感谢所有帮助。

4

1 回答 1

3

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

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

于 2012-04-10T10:45:49.327 回答