【发布时间】:2011-05-16 06:36:11
【问题描述】:
我注意到 MS 编译器会针对 cstdlib 函数(如 getenv)给出“已弃用”警告。 MS 发明了自己的标准,例如_dupenv_s。
问题 1
AFAIK 主要的“不安全”事情是关于重入 *。既然 MS 的 CRT 被标记为“多线程”(/MT),他们为什么不直接用可重入的线程安全版本替换getenv?是否有人会依赖不安全的行为?
问题 2
我用 GCC g++ -Wall -Wextra -Weff++ -pedantic foo.cpp 编译了相同的代码,它没有产生任何警告。所以我想这在 POSIX 上不是问题吗?这是如何解决的? (好吧,也许他们只是改变了getenv 的行为,很高兴能得到证实)。
* 说它只是关于可重入性是一种过度概括。当然,我们有像strncpy_s 这样的东西,它完全改变了签名并处理缓冲区大小。但不会改变这个问题的核心
【问题讨论】:
-
IMO,g++ 根本不认为通知您“不安全”功能是它的职责。就 VC++ 而言,实际上整个 C 标准库都被认为是不安全的。
-
但是你提到的函数之间的区别在于,在一种情况下,
free返回的指针是你的责任。 -
@UncleBen:我认为这不是真的。我刚刚在 Linux 上与 MS 的
crtdbg.h和 Valgrind 确认了一个简单的单行程序int main(){getenv("PATH");}并且都报告没有内存泄漏:P 事实上,int main(){free(getenv("PATH"));}会产生一个断言错误。 -
VC++ 的
getenv看起来已经是线程安全的了(你可以自己检查源代码,它在getenv.c中);我想弃用是由于非const返回值造成的,这使得在没有类型系统甚至警告您这种可能性的情况下写入内部缓冲区末尾的可能性仍然存在。但这只是一个猜测,因为似乎没有任何记录在案的理由来解释这些……
标签: c++ windows visual-c++ gcc