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__源代码,所以您不妨编写程序来使用该变体。