1

程序遇到了不可能的执行例程,if( len >= sizeof(buff) )在现实中不应该是真的,但是它发生了。如printf输出len:-1__1024:所示len,其值为 -1,大于 sizeof(buff)1024。这很神奇。

select return value -1 ,4
select: Interrupted system call
-1_0x66a1e0
len:-1__1024  
*** glibc detected *** /home/fang/Desktop/work/fw: free(): invalid pointer: 0x000000000066a1e0 ***

以下是执行代码。

while (1) {
        if( len >= sizeof(buff) ) {   //here len==-1, sizeof(buff)==1024
            printf("len:%d__%d  %s\n", len, sizeof(buff), tmp1); //oops
            free(tmp1);
            tmp1 = buff;
        }
        len = get_next_event(&tmp1, sizeof(buff));
        printf("%d_%p\n",len, tmp1);
        if( len > 0 ){
            tmp = strtok_r(tmp1, "\n\r", &saveptr);
            // ignore following codes ......

我认为这个错误是由于堆栈污染造成的,但很难找出其中的秘密。更重要的是,我列出了 function 的代码get_next_event。希望得到您的帮助^_^

int get_next_event(char **buf, int len)
{
    struct timeval tv;
    int tmp;
    socklen_t sin_size;
    struct sockaddr_in client_addr; 

    sin_size = sizeof(client_addr);
    FD_ZERO(&fdsr);
    FD_SET(sock_fd, &fdsr);
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    if (new_fd != 0) {
       FD_SET(new_fd, &fdsr);
    }

    tmp = select(maxsock + 1, &fdsr, NULL, NULL, &tv);
    if (tmp < 0) {
       printf("select return value %d ,%d\n", tmp, errno);
       perror("select");
       return -1;
    } else if (tmp == 0) {
       return 0;
    }
4

1 回答 1

3

-1,大于 sizeof(buff)。太奇妙了。

这是。

len >= sizeof(buff)-1 >= sizeof(buff)(size_t)-1 >= sizeof(buff)--> -->相同,SIZE_MAX >= sizeof(buff)这当然是正确的。

当将intlikelenunsigned type进行比较size_t时,其中一种类型的结果将sizeof转换为具有更广泛范围的另一种类型。

在这种情况下,通常是int转换为unsigned size_t(size_t)-1是 的最大值,size_t并且肯定大于sizeof(buff)


目前尚不清楚为什么len == -1没有看到更多代码。

然而在这种情况下,我建议使用size_t len = 0来修改代码。


打印时,使用匹配的打印说明符,如"%zu"

printf("size:%zu\n", sizeof buff);

OP 的代码,缺少警告,printf("%d\n", sizeof(buff));暗示警告未完全启用。省时间。启用所有警告。

于 2018-07-24T03:37:44.687 回答