我正在将一些代码移植到 Windows,Microsoft 编译器 (Visual C++ 8) 告诉我 strerror()
不安全。
撇开微软提供的所有安全字符串中的烦恼因素不谈,我实际上可以看到一些已弃用的函数是危险的。但我不明白 strerror()
有什么问题。它接受一个代码 (int
),并返回相应的字符串,如果该代码未知,则返回空字符串。
危险在哪里?
C 中有没有好的替代方法?
C++ 中有没有好的替代方案?
[编辑]
已经得到了一些好的答案,现在了解到某些实现可能已经疯狂到实际写入公共(public)共享缓冲区 - 在单线程中重入是不安全的,更不用说线程之间了! - 我的问题不再是“为什么我不能使用它,还有什么替代方案?”到“C 和/或 C++ 中是否有任何体面、简洁的替代方案?”
提前致谢
最佳答案
strerror
已被弃用,因为它不是线程安全的。 strerror
在内部静态缓冲区上工作,该缓冲区可能会被其他并发线程覆盖。您应该使用名为 strerror_s
的安全变体。
安全变体要求将缓冲区大小传递给函数,以便在写入之前验证缓冲区是否足够大,这有助于避免可能导致恶意代码执行的缓冲区溢出。
关于c++ - 为什么我不能使用 strerror?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900338/