程序运行到getsockname
,其中返回值为-1,errno
为9(EBADF
,错误的文件描述符)。但是,在Android应用程序中检测的代码运行良好。
void sysLibCSendHookHandler(CPUState* env, int isStart){
if(isStart){
int fd = env->regs[0];
int buf = env->regs[1];
int len = env->regs[2];
int flags = env->regs[3];
DECAF_printf("xxxxx send(%d, %p, %d, %d)\n", fd, buf, len, flags);
extern int errno;
struct sockaddr_un sock_addr;
socklen_t sock_addr_len;
sock_addr_len = sizeof(sock_addr);
int t = getsockname(fd, (struct sockaddr*)&sock_addr, &sock_addr_len);
DECAF_printf("fd:%d",fd);}
答案 0 :(得分:2)
此代码导致未定义的行为:
extern int errno;
the C Standard的每 7.5错误< errno.h> (请注意粗体部分):
标题定义了几个宏,都与之相关 报告错误情况。
宏是
EDOM EILSEQ ERANGE
扩展为类型为
int
的不同的整数常量表达式 正值,适用于#if
预处理 指令;和errno
扩展为具有
int
类型的可修改左值 线程本地存储持续时间,其值设置为a 多个库函数的正误差数。 如果是宏 为了访问实际对象,禁止定义, 或者程序定义名称为errno
的标识符 行为未定义。
根据Google Android source code,errno
是定义为
extern int *__geterrno(void);
#define errno (*__geterrno())
在这种情况下,您在extern int errno
中看到的价值毫无意义。