我正在将一些代码移植到Windows,Microsoft编译器(Visual C++ 8)告诉我strerror()是不安全的。

除了Microsoft的所有安全字符串中的烦人因素之外,我实际上可以看到一些不推荐使用的函数很危险。但是我不明白strerror()可能有什么问题。它接受一个代码(int),并返回相应的字符串;如果该代码未知,则返回空字符串。

危险在哪里?

C语言中有很好的替代方法吗?

在C++中是否有很好的替代方法?

[编辑]

有了一些不错的答案,并且现在了解到某些实现可能疯狂到实际上无法写入公共(public)共享缓冲区-对单线程内的重入是不安全的,不要管线程间的关系! -我的问题不再是“我为什么不能使用它,还有其他选择?”到“在C和/或C++中是否有任何体面,简洁的选择?”

提前致谢

最佳答案

不推荐使用strerror,因为它不是线程安全的。 strerror在内部静态缓冲区上工作,该缓冲区可能会被其他并发线程覆盖。您应该使用一个名为strerror_s的安全变体。

安全变体要求将缓冲区大小传递给函数,以便在写入缓冲区之前验证缓冲区是否足够大,从而有助于避免可能导致恶意代码执行的缓冲区超载。

09-08 05:36