我正在使用 MSVC 编译一些使用标准库函数的 C 代码,例如 getenv()
, sprintf
和其他人,与 /W3
设置为警告。 MSVC 告诉我:
'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS
问题:
最佳答案
getenv()
可能不安全,因为对同一函数的后续调用可能会使先前返回的指针无效。因此,使用如
char *a = getenv("A");
char *b = getenv("B");
/* do stuff with both a and b */
可能会损坏,因为无法保证
a
那个时候还是可以用的。getenv_s()
- 自 C11 起在 C 标准库中可用 - 通过立即将值复制到调用者提供的缓冲区中来避免这种情况,调用者可以完全控制缓冲区的生命周期。 dupenv_s()
通过让调用者负责管理已分配缓冲区的生命周期来避免这种情况。但是,
getenv_s
的签名有点有争议,该函数甚至可能在某个时候从 C 标准中删除...参见 this report .
关于visual-c++ - "getenv... function ... may be unsafe"- 真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48568707/