代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

'std::string(strerrror(errno))'是否危险?

c c++
  •  3
  • StackedCrooked  · 技术社区  · 15 年前

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

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

    documentation 在某些情况下(这会导致我的代码崩溃),Strerrror是否会返回0还不完全清楚。有人知道它是否安全吗?

    3 回复  |  直到 15 年前
        1
  •  11
  •   anon    15 年前

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

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

    这是一种易于使用的自文档化方法,可用于重新格式化输出,并涵盖strerror()可能返回空值的可能性(我不知道是否可以)。

        2
  •  3
  •   unwind    15 年前

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

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

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

        3
  •  3
  •   Nikko    15 年前

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