我试图在网站上搜索这个问题但是并没有找到这个问题,尽管这个问题正在讨论很多......
我在cpp文件中有这个声明,而不是在任何函数中:
static const char* gText = "xxxxxxxxxxx";
虽然它有一个固定的大小,但当我试图将它复制到另一个char *变量时,我会收到静态分析工具(Klocwork)的警告 - 关于可能超出边界的违规行为:
char xText[32];
SecureZeroMemory(xText, 32);
memcpy(xText, gText, strlen(gText));
是假阳性还是后来初始化的全局变量?
谢谢!
答案 0 :(得分:1)
这是假阳性。 strlen
可能被抽象为返回未知的正数,因此在分析模式memcpy(dest,src,strlen(src));
时,只要src
是strcpy
,分析器就不会意识到副本的阅读部分是安全的。格式良好的字符串。
如果您使用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。