为什么我不能使用 strerror?

新手上路,请多包涵

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

撇开微软提供的所有安全字符串中的烦恼因素不谈,我实际上可以看到一些已弃用的函数是危险的。但我不明白 strerror() 可能有什么问题。它需要一个代码( int ),并返回相应的字符串,如果该代码未知,则返回空字符串。

危险在哪里?

C中有一个好的选择吗?

C++ 中有没有好的替代方案?

[编辑]

得到了一些好的答案,现在明白了一些实现可能足够疯狂,以至于实际写入一个公共共享缓冲区——在单线程内重入是不安全的,更不用说线程之间了! - 我的问题不再是“为什么我不能使用它,还有什么替代方案?”到“C 和/或 C++ 中是否有任何体面、简洁的替代方案?”

提前致谢

原文由 JamieH 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 507
1 个回答

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

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

原文由 dfa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题