我注意到MS编译器会对cstdlib
函数,如getenv
发出"已弃用"警告。MS发明了自己的标准,比如_dupenv_s
。
问题1
据我所知,主要的"不安全"问题是关于可重入性的*。由于MS的CRT被标记为"多线程"(/MT
),为什么他们不只是用可重入、线程安全的版本来代替getenv
?这是因为任何人都会依赖于不安全的行为吗?
问题2
我使用GCC编译相同的代码g++ -Wall -Wextra -Weff++ -pedantic foo.cpp
,它没有产生任何警告。所以我猜在POSIX上这不是一个问题吗?这是如何解决的呢?(好吧,也许他们只是改变了getenv
的行为,确认一下会很好)。
* 说它仅仅关于可重入性是过于概括。当然我们还有像strncpy_s
这样完全改变签名并处理缓冲区大小的东西。但这不改变本质问题
crtdbg.h
和 Linux 上的 Valgrind 对一个简单的一行程序int main(){getenv("PATH");}
进行了确认,两者都没有报告内存泄漏 :P 实际上,int main(){free(getenv("PATH"));}
会导致断言错误。 - kizzx2getenv
看起来已经是线程安全的了(你可以自己查看源代码,它在getenv.c
中);我想这个弃用是由于其非const
返回值,这可能导致在没有类型系统警告的情况下写入超出内部缓冲区末尾的位置。但这只是一个猜测,因为似乎没有任何关于这一切的记录理由... - please delete me