visual-c++ - "getenv... function ... may be unsafe"- 真的吗?

标签 visual-c++ compiler-warnings crt getenv c-standard-library

我正在使用 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



问题:
  • 为什么这在理论上是不安全的——而不是在其他平台上使用?
  • 在实践中在 Windows 上不安全吗?
  • 假设我没有编写面向安全的代码 - 我应该禁用这个警告还是实际上开始为一堆标准库函数设置别名?
  • 最佳答案

    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/

    相关文章:

    objective-c - 如何抑制 Xcode 上的 "dead store"编译器警告?

    c++ - 如何在 -std=c++11 -Weverything -Werror 中使用 clang++

    c++ - _CrtSetAllocHook 从不显示文件名/行号

    c++ - _sopen_s 如何管理对同一文件的多次写入

    c++ - SDL 纹理透明背景

    c++ - 查询中的 SQLite Int 到 Hex 和 Hex 到 Int

    c++ - GCC: "__unused__"与变量属性中的 "unused"

    c++ - C++ 中的安全 cookie 是什么?

    c++ - 更改窗口中的标签

    visual-c++ - MonoDevelop 不受支持的项目类型 vcxproj