`std :: string(strerror(errno))`危险吗?

时间:2010-06-08 08:24:11

标签: c++ c

在我的代码中的某些地方,我打印这样的调试消息:

int ret = getLinkSpeed(device.getSysName(), linkSpeed);
if (ret < 0)
{
    logDebug("Failed to obtain port speed for this device. Error: " + std::string(strerror(errno)));
}

documentation开始,并不完全清楚strerror在某些条件下是否会返回0(这会导致我的代码崩溃)。有谁知道它是否安全?

3 个答案:

答案 0 :(得分:11)

为什么不写一个函数来执行此操作:

string ErrStr() {
   char * e = strerror(errno);
   return e ? e : "";
}

这很容易使用,自我记录,可以适应重新格式化输出,并涵盖strerror()可能返回NULL的可能性(我不知道是否可以)。

答案 1 :(得分:3)

好问题(+1),文档似乎很模糊。我不确定是否存在“更难”的来源,例如POSIX规范。

有点务实地思考,here是GNU libc的实现。它返回一个指向静态字符串缓冲区的指针,因此它不能返回0.

在回应p00ya的评论时,面对冲突,模糊或不完整的规范,安全(也是非常实用,嘿)的事情当然是假设最坏的, not 假设返回值始终是有效字符串。

答案 2 :(得分:3)

如果您使用多线程应用程序,可能会遇到问题。在这种情况下,您需要使用strerror_r