Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我在测试期间手动设置errno时,strerror\u r返回垃圾_C++_Unit Testing_Ubuntu_Error Handling_Mocking - Fatal编程技术网

C++ 当我在测试期间手动设置errno时,strerror\u r返回垃圾

C++ 当我在测试期间手动设置errno时,strerror\u r返回垃圾,c++,unit-testing,ubuntu,error-handling,mocking,C++,Unit Testing,Ubuntu,Error Handling,Mocking,在测试期间,我有一个模拟对象,它设置errno=ETIMEDOUT我正在测试的对象看到错误并调用以获取错误字符串: 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));

在测试期间,我有一个模拟对象,它设置
errno=ETIMEDOUT我正在测试的对象看到错误并调用以获取错误字符串:

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\u r
会退回垃圾。我甚至试着打电话

strerror_r(ETIMEDOUT, err, 128)
直接和仍然得到垃圾。我一定错过了什么。看起来我得到的是gnu版本的函数,而不是posix版本的函数,但在这种情况下这不会有任何区别

编辑

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

根据本页,如果您使用的是GNU版本的
strerror\r()
,函数可能会决定不在您提供的缓冲区中存储任何内容;您需要使用从函数返回的字符串(似乎是一个相当奇怪的接口):

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


因此,如果您使用的是GNU版本,那么您不能依靠
err
缓冲区将任何有用的内容放入其中,除非
strerror\r()
返回
err

的地址。问题是Linux有两个strerror\r函数。如果你读了手册

   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_SOURCE,因此您使用的是函数的GNU版本,它不一定在您提供的缓冲区中存储消息

如果用perror替换strerror,您会收到什么消息?
perror
显示:连接超时。我将调用放在调用
strerror\r
之前,那么我如何获得xsi/posix版本呢?那么我如何获得xsi/posix版本呢?我认为您无法阻止g++编译器定义_GNU__源代码,所以您不妨编写程序来使用该变体。