【问题标题】:C++17 what new with : error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s insteadC++17 新功能:错误 C4996:'getenv':此函数或变量可能不安全。考虑改用 _dupenv_s
【发布时间】:2021-02-07 16:43:49
【问题描述】:

我尝试做一个简单的任务并在 Linux 和 Windows 中获取环境变量 所有文档都指向使用:std::getenv 但是当我使用 Visual Studio 2019 在 Windows 10 中运行编译时,我得到了:

error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS

这是函数:

std::string Utils::getEnvVar(std::string const& key)
{
    char* val = std::getenv(key.c_str());
    return val == NULL ? std::string("") : std::string(val);
}

我只找到了这个thread,我不明白跨平台解决方案是什么。

【问题讨论】:

  • 如果您更一般地搜索错误消息,而不明确指定getenv,那么您应该会获得更多关于“问题”和可能解决方案的点击。作为一种快速解决方法,错误消息本身包含有关如何禁用警告的提示。
  • MS VS2019 不喜欢一些旧的 C 调用,访问原始指针和缓冲区等。他们有一个观点:可能会错误地使用它并在您的程序中创建一个后门,从而有可能被利用。所以你必须让 VS 相信你真的想使用它。
  • this评论“为什么”
  • 在 Windows 上,使用 GetEnvironmentVariableW。创建第三个函数,将其在 Windows 上和getenv 在 Linux 上包装到一个通用接口中。

标签: c++ cross-platform visual-studio-2019


【解决方案1】:

编译器消息说明了一切:

错误 C4996:“getenv”:此函数或变量可能不安全。考虑改用 _dupenv_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS

警告是特定于 MSVC 的。它会警告使用不安全的 C 标准函数。

如果你只需要在MSVC上编译,那么

考虑改用 _dupenv_s。

如果你需要跨平台兼容,那么

要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS

这是一个定义,所以只需#define _CRT_SECURE_NO_WARNINGS。另一种解决方案是禁用警告 (#pragma warning(disable: 4996))。

另见Remove secure warnings (_CRT_SECURE_NO_WARNINGS) from projects by default in Visual Studio

【讨论】:

  • 但是 std::getenv 的实际问题是什么?
  • 我找到了另一个关于它的帖子:stackoverflow.com/questions/631664/…
  • @Bernd 我不知道 MS 认为getenv 的问题是什么。他们没有在docs for getenvgetenv_s 上提及它。阅读security functions 可能他们想要更好的参数验证和增强的错误报告。或者他们想防止代码错误地写入*getenv(...),它返回char*而不是const char*
  • @WernerHenze 你可以看到this 评论“为什么”。
  • @AyxanHaqverdili From here "_dupenv_s 使用全局变量 _environ 指向的环境副本来访问环境。"因此,警告建议的替代方案与getenv 相同。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2011-08-25
  • 2013-10-05
相关资源
最近更新 更多