"'getenv':这个函数或变量可能不安全." - 真的吗?

ein*_*ica 5 crt compiler-warnings visual-c++ getenv c-standard-library

我正在使用MSVC来编译一些C代码,这些代码使用标准库函数,例如和其他函数getenv(),sprintf/W3设置了警告.MSVC告诉我:

'getenv':此函数或变量可能不安全.请考虑使用_dupenv_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS

问题:

  • 从理论上讲,为什么这会不安全 - 而不是在其他平台上使用?
  • 在实践中,它在Windows上不安全吗?
  • 假设我没有编写面向安全的代码 - 我应该禁用此警告还是实际开始别名一堆标准库函数?

小智 7

getenv()可能不安全,因为后续对同一函数的调用可能使先前返回的指针无效.结果,用法如

char *a = getenv("A");
char *b = getenv("B");
/* do stuff with both a and b */
Run Code Online (Sandbox Code Playgroud)

可能会破裂,因为a在那一点上仍然无法保证.

getenv_s()通过立即将值复制到调用者提供的缓冲区来避免这种情况,调用者可以完全控制缓冲区的生命周期.dupenv_s()通过使调用者负责管理分配的缓冲区的生命周期来避免这种情况.

  • 根据 co [cppreference](https://en.cppreference.com/w/cpp/utility/program/getenv),C++11 及更高版本的情况并非如此。旧结果可能会因调用 POSIX setenv()、unsetenv() 和 putenv() 而失效,但不会因其他 getenv 调用而失效。 (2认同)