首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效读写法

无效读写法
EN

Stack Overflow用户
提问于 2016-02-11 06:46:10
回答 3查看 2K关注 0票数 4

下面的行给出无效的读和写错误。你能解释一下我错过了什么吗。我已经初始化了变量,但仍然会导致错误。

代码语言:javascript
复制
==26319==   Invalid read of size 4

==26319==    at 0x4035CC: connection_handler (thread.c:26)

==26319==    by 0x4E36A50: start_thread (in /lib64/libpthread-2.12.so)

==26319==    by 0x61E06FF: ???

==26319==   Address 0x53e02c0 is 0 bytes inside a block of size 1 alloc'd

==26319==    at 0x4C27A2E: malloc (vg_replace_malloc.c:270)

==26319==    by 0x40335C: main (send_server.c:154)


==26319==   1 errors in context 3 of 3:

==26319==   Thread 1:

==26319==   Invalid write of size 4

==26319==    at 0x4033C3: main (send_server.c:157)

==26319==  Address 0x53e02c0 is 0 bytes inside a block of size 1 alloc'd

==26319==    at 0x4C27A2E: malloc (vg_replace_malloc.c:270)

==26319==    by 0x40335C: main (send_server.c:154)

代码

代码语言:javascript
复制
int *new_sock = NULL;

while (1) 
{
    client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); 

    if (client_sock < 0)
    {
        fprintf(stderr,"accept failed\n");
        LOGGER("Accept failed\n");
        continue;
    }

    else
    {   
        LOGGER("\nConnection accepted\n");
        pthread_t sniffer_thread;       //assign thread for each client
        if (NULL ==(new_sock = malloc(1))) //invalid read
            continue;       
        printf("VAlue of new sock %p \n",new_sock);
        *new_sock = client_sock; // invalid write of size 4

        if ( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)  //Serving each thread
        {
            fprintf(stderr,"could not create thread\n");
            LOGGER("ERROR could not create thread\n");
            free(new_sock);

        }
        pthread_detach(sniffer_thread);
        LOGGER("Handler assigned\n");
    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-11 07:10:19

您在malloc中使用了一个不正确的参数。您可以使用sizeof(int)获得一个int的正确大小,这通常会产生4。尝试用malloc(sizeof(int))替换malloc(1)

new_sock = malloc(1)分配一个字节的内存,并将该内存的地址分配给变量new_sock

*new_sock = client_sock;将一个int存储到该内存区域;将四个字节写入一个字节的内存区域会溢出分配。

然后,当您尝试从分配的内存中读取一个int (应该在另一个线程中)时,一个字节从分配的区域读取,而另三个字节是从无效内存中读取的。

票数 3
EN

Stack Overflow用户

发布于 2016-02-11 07:10:08

无效的读取没有显示在您发布的代码中。

无效的写入是由于malloc(3)使用以字节为单位分配的空间作为参数。

您正在分配一个字节,并使用int *指向该字节。因此,当取消引用指针时,您将访问sizeof(int)字节,这比平台上的1要大。

尝试使用malloc(sizeof (int))或更好的malloc(sizeof *new_sock)代替。

票数 2
EN

Stack Overflow用户

发布于 2016-02-11 07:10:20

代码语言:javascript
复制
 if (NULL ==(new_sock = malloc(1)))

必须是

代码语言:javascript
复制
 new_sock = malloc(sizeof(int));
 if(new_sock == NULL)
    continue;

马洛接受一个size_t参数,该参数是要分配的内存量的大小(以字节为单位)。在您的示例中,您希望存储int变量的空间,然后sizeof(int)将合适的大小返回给alloc。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35332557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档