我试图在网站上搜索这个问题,但没有找到确切的答案,尽管这个主题正在被广泛讨论......
我在 cpp 文件中有这个声明,而不是在任何函数中:
static const char* gText = "xxxxxxxxxxx";
虽然它有固定大小,但当我试图将它复制到另一个 char* 变量时,我从静态分析工具 (Klocwork) 收到警告——关于可能的越界违规:
char xText[32];
SecureZeroMemory(xText, 32);
memcpy(xText, gText, strlen(gText));
是误报还是全局变量在后面初始化?
谢谢!
最佳答案
这是误报。 strlen
可能被抽象为返回一个未知的正数,因此在分析模式时 memcpy(dest,src,strlen(src));
分析器没有意识到只要 src
是格式正确的字符串,就可以安全地读取部分拷贝。
如果您使用的是 strcpy
,分析器可能会得出结论认为在这种情况下是可以的。你有理由不这样做吗?函数 strcpy
被认为是“不安全的”,但您的 memcpy(..,src,strlen(src))
也很不安全。
编辑:此外,sellibitze 在评论中提出了一个非常好的观点:原始代码中的 const
属性仅适用于 gText
指向的字符,不适用于 gText
本身。
关于c++ - 什么时候初始化全局静态常量变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3082950/