1

程序运行到getsockname返回 -1 和errno9 的地方(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);}
4

1 回答 1

2

此代码导致未定义的行为:

extern int errno;

根据C 标准7.5 错误 <errno.h>(注意粗体部分):

头文件定义了几个宏,都与错误条件的报告有关。

宏是

EDOM
EILSEQ
ERANGE

扩展为具有 type int、不同正值且适用于#if预处理指令的整数常量表达式;和

errno

它扩展为具有类型int和线程本地存储持续时间的可修改左值,其值由几个库函数设置为正错误数。 如果为了访问实际对象而禁止宏定义,或者程序定义了名称为 的标识符errno,则行为未定义。

根据谷歌Android源代码errno是一个宏定义为

extern int *__geterrno(void);

#define errno (*__geterrno())

既然如此,你在你身上看到的价值extern int errno是没有意义的。

于 2017-07-03T23:57:38.590 回答