【发布时间】:2010-10-28 08:55:32
【问题描述】:
我正在将一些代码移植到 Windows,Microsoft 编译器 (Visual C++ 8) 告诉我 strerror() 不安全。
撇开微软提供的所有安全字符串中的烦恼因素不谈,我实际上可以看到一些已弃用的函数是危险的。但我不明白strerror() 有什么问题。它接受一个代码 (int),并返回相应的字符串,如果该代码未知,则返回空字符串。
危险在哪里?
C 中有没有好的替代方法?
C++ 中有没有好的替代方案?
[编辑]
已经得到了一些好的答案,现在了解某些实现可能已经疯狂到实际写入公共共享缓冲区 - 在单线程内重入是不安全的,更不用说线程之间了! - 我的问题不再是“为什么我不能使用它,还有什么替代方案?”到“C 和/或 C++ 中是否有任何体面、简洁的替代方案?”
提前致谢
【问题讨论】:
-
你不能使用它,因为微软说“该死的 ISO C 标准 - 我们不会让你使用它,除非你用编译指示覆盖警告或错误”。他们还禁止了 memcpy() - 这很荒谬,因为你告诉它要复制多少字节,如果你不能考虑它并且知道在调用 memcpy() 之前目标空间中有足够的空间容纳字节数,您不属于使用 C 或 C++ 编写代码的团队。
-
@JonathanLeffler ISO C 标准有同样的问题,并以同样的方式解决它。他们通过添加
strerror_r解决了不安全功能,而微软通过添加strerror_s解决了不安全功能。无论哪种方式:如果你打电话给strerror你做错了;请停下来。 -
@IanBoyd:ISO C 没有用
strerror_r()解决它;那是一个 POSIX 函数,而不是标准的 C 函数。标准 C 在 C11 和 C18 的附录 K 中将strerror_s()定义为可选功能。 -
@JonathanLeffler 我们有交叉编译器标准功能吗?优秀! (一定要弃用旧的)
-
@IanBoyd — 不;我们仍然没有交叉编译器标准功能。没有编译器(库)能够完全准确地实现附件 K,甚至 MS 编译器也不行。 MS 通常不实现 POSIX 特定的功能(例如
strerror_r());非 Windows 编译器通常不实现特定于 Windows 的函数(例如str_error_s())。唯一的跨平台标准函数是strerror(),但显然一些实现不遗余力地使其线程不安全,这似乎有点愚蠢,但该行业并不因其对常识的坚持而闻名。
标签: c++ c deprecated