C6001 关于使用未初始化值的地址。为什么?

C6001 on using the address of uninitialized value. Why?

这是我的 C++ 代码:

void somefn(char* string){
    char *current, *next;
    current = strtok_s(string, "a", &next);  // next is unitialized -> C6001 in VS 2020
}

int main(){
    char buf[] = "foobar";
    return 0;
}

某些具有某些标志的编译器认为这是值得警告的(我相信应该无关紧要)。

唯一的问题是:

  1. 这会导致未定义的行为吗?我目前认为未初始化变量的地址是编译时常量。
  2. 这是否可以出于任何原因被视为不良做法?为什么?

编辑:承诺的屏幕截图

reference documentation for strtok_s 表明上述代码是完全有效的 假设 string 不是 NULL 指针 。 “未初始化变量的地址是编译时常量”是否完全无关,与诊断没有任何关系。编译器认为您正在使用未初始化的内存。

然而,根据文档,strtok_s 的第 4 个参数仅在第一个参数为 [=14 时才需要初始化指向指针(通过先前调用 strtok_s) =].

编译器似乎有点挑剔。看起来编译器无法向自己证明 string 永远不会是 NULL,所以它抱怨这个。

但是,如果您从不在此处使用 NULL 指针调用 strtok_s,那么这没有任何问题。