何时初始化全局静态const变量?

时间:2010-06-21 08:01:16

标签: c++ static const global-variables static-analysis

我试图在网站上搜索这个问题但是并没有找到这个问题,尽管这个问题正在讨论很多......

我在cpp文件中有这个声明,而不是在任何函数中:

static const char* gText = "xxxxxxxxxxx";

虽然它有一个固定的大小,但当我试图将它复制到另一个char *变量时,我会收到静态分析工具(Klocwork)的警告 - 关于可能超出边界的违规行为:

char xText[32];
SecureZeroMemory(xText, 32);
memcpy(xText, gText, strlen(gText));

是假阳性还是后来初始化的全局变量?

谢谢!

2 个答案:

答案 0 :(得分:1)

这是假阳性。 strlen可能被抽象为返回未知的正数,因此在分析模式memcpy(dest,src,strlen(src));时,只要srcstrcpy,分析器就不会意识到副本的阅读部分是安全的。格式良好的字符串。

如果您使用strcpy,分析器可能会认为在这种情况下它没问题。你有理由不去吗?函数memcpy(..,src,strlen(src))被视为“不安全”,但您的const也非常不安全。

编辑:此外,sellibitze在评论中提出了一个非常好的观点:原始代码中的gText属性仅适用于gText指向的字符,而不适用于{{1}}本身。

答案 1 :(得分:1)

我认为这不是误报。存在潜在的风险,有人可能会出现并改变gText的长度而不会意识到它不能超过32个字符。我肯定会在memcpy之前进行某种检查,以确保不会有缓冲区溢出。

e.g。

char xText[32];
SecureZeroMemory(xText, 32);
size_t lenToCopy = MIN(strlen(gText), 32);
memcpy(xText, gText, lenToCopy);

另外,我用常数替换幻数32。