“getenv...函数...可能不安全”——真的吗?

2023-11-21

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

'getenv':此函数或变量可能不安全。考虑使用 _dupenv_s 代替。要禁用弃用,请使用 _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有点争议,该功能甚至可能是removed从 C 标准的某个时刻开始...参见这份报告.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“getenv...函数...可能不安全”——真的吗? 的相关文章

随机推荐