代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

当我在测试期间手动设置errno时,strerror返回垃圾桶

  •  4
  • Robert S. Barnes Antoni  · 技术社区  · 14 年前

    在测试期间,我有一个模拟对象 errno = ETIMEDOUT; 我测试的对象看到错误并调用 strerror_r 要返回错误字符串:

    if (ret) {
        if (ret == EAI_SYSTEM) {
            char err[128];
            strerror_r(errno, err, 128);
            err_string.assign(err);
        } else {
            err_string.assign(gai_strerror(ret));
        }
        return ret;
    }
    

    我不明白为什么 strerror_r 正在返回垃圾。我甚至试着打电话

    strerror_r(ETIMEDOUT, err, 128)
    

    直接还是有垃圾。我一定错过了什么。似乎我得到的是函数的GNU版本,而不是POSIX版本,但在本例中这不会有任何区别。

    编辑

    我在Ubuntu 8.04。glibc版本在features.h中看起来像2.7。

    2 回复  |  直到 14 年前
        1
  •  10
  •   Michael Burr    14 年前

    根据这一页, http://linux.die.net/man/3/strerror_r ,如果您使用的是GNU版本 strerror_r() ,函数可能决定不将任何内容存储到您提供的缓冲区中;您需要使用从函数返回的字符串(似乎是一个非常奇怪的接口):

    GNU特定 StruthRoR() 返回指向包含错误消息的字符串的指针。这可以是指向函数存储在buf中的字符串的指针,也可以是指向某些(不可变)静态字符串的指针(在这种情况下,buf未使用)。如果函数在buf中存储字符串,则最多存储buflen字节(如果buflen太小,则字符串可能会被截断),并且字符串始终包含终止的空字节。

    因此,如果您碰巧使用GNU版本,则不能依赖 err 把有用的东西放进去,除非 StruthRoR() 返回的地址 厄尔 .

        2
  •  4
  •   Unknown    14 年前

    问题是Linux有两个strError函数。如果你读了手册,

       int strerror_r(int errnum, char *buf, size_t buflen);
                   /* XSI-compliant */
    
       char *strerror_r(int errnum, char *buf, size_t buflen);
                   /* GNU-specific */
    
    
    The XSI-compliant version of strerror_r() is provided if:
           (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE
    

    G++编译器会自动定义GNU源代码,因此您使用的是函数的GNU版本,该版本不一定将消息存储在您提供的缓冲区中。