c++ - 什么时候初始化全局静态常量变量?

标签 c++ static constants global-variables static-analysis

我试图在网站上搜索这个问题,但没有找到确切的答案,尽管这个主题正在被广泛讨论......

我在 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/

相关文章:

c++ - typedef 之间的兼容性问题

c++ - 将非静态方法指针作为参数传递给另一个方法

c++ - "static functions with block scope are illegal"错误取决于初始化样式?

c++ - std::set 迭代器自动 const

objective-c - 如何在 Objective-C 中使用 Swift 结构

ios - 在运行时覆盖常量值

C++ 11 : Calling a C++ function periodically

c++ - 编译器之间的浮点不匹配(Visual Studio 2010 和 GCC)

java - 静态字段是否为垃圾收集打开?

c++ - c++对象中静态变量的默认初始化值是多少?