2010-06-08 124 views
3

在我的代码中一些地方,我打印调试消息是这样的:`std :: string(strerror(errno))`危险吗?

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

documentation它并不完全清楚,如果字符串错误在一定条件下返回0(这将导致我的代码崩溃)。有谁知道它是否安全?

+0

根据其linux手册页:“在某些系统上,如果错误编号未知,strerror()将返回NULL。” – 2010-06-08 10:29:05

回答

11

为什么不写一个函数来做到这一点:

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

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

+1

我会返回e?e:“未知错误”;至少包含这样的错误描述的消息不会看起来不完整。 – 2010-06-08 14:27:48

3

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

有点务实的想法,here是GNU libc的实现。它返回一个指向静态字符串缓冲区的指针,所以它不能返回0.

回应p00ya的评论,在面对冲突,模糊或不完整的规范时要做的安全(也是非常实用的,heh)是当然假设最差,并且 而不是假定返回值总是一个有效的字符串。

+0

根据POSIX,在strerror本身有错误的情况下,返回值是未定义的(尽管将设置errno)。只按规范去做,我认为你不能依赖一个可返回的缓冲区(无论它是否为0)。 – p00ya 2010-06-08 09:01:31

+0

'strerror()'在C标准中定义,它不允许失败。 – caf 2010-06-08 11:26:25

3

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