如何修复代码中的malloc错误?

ctehm74n  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(246)

我试图在Linux上编写一个程序来连接客户机和服务器,然后当客户机发送消息到服务器时,服务器将该消息打印到控制台。现在我设计的程序如下:当客户端输入类似“嘿,你好吗?“构造具有一些额外信息的消息。消息的格式如下:“[客户端的PID/消息大小:消息]"。因此,如果客户端的PID为4172,则在我们的示例中,组成的消息为:”[4172/17]:嘿,你好吗?]"。此消息被发送到服务器,服务器将其分解,并且仅打印消息,而不包含客户端PID等额外信息。现在我包括了这些信息,以便不浪费内存,因为这使我能够使用动态内存分配。这个程序第一次就能运行。客户端和服务器连接,当客户端发送消息时,服务器将其打印出来。但是,当我再次尝试向它发送消息时,我得到以下错误:

server.out: malloc.c:2617: sysmalloc: Assertion (old_top == initial_t…
…op (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted(core dumped).

服务器代码的相关位是:

//delimCheckBuffer is an array of size 1

void readUntilColon(int fd, char* buffer, size_t index) {
    while(read(fd, delimCheckBuffer, 1) > 0) {
        if(delimCheckBuffer[0] == ':') {
            buffer[index] = ':';
            break;
        }
        buffer[index] = delimCheckBuffer[0];
        ++index;
    }
}

char* messageReconstruct(int fdOfFIFO) {
    char* message = calloc(15, sizeof(char)); //Took into account the 4 symbols : / [ ] and 
    long NumOfCharsInMessage;                 //assumed that PID and length of message are at most
    size_t index = 0;                         //7 and 4 digits respectively.

    readUntilColon(fdOfFIFO, message, 1);
    NumOfCharsInMessage = findNumOfCharsInMessage(message);
    
    free(message);

    message = calloc(NumOfCharsInMessage, sizeof(char));

    while(read(fdOfFIFO, delimCheckBuffer, 1) > 0) {
        if(delimCheckBuffer[0] == ']')
            break;
        message[index] = delimCheckBuffer[0];
        ++index;
    }

    return message;
}

我试着用Valgrind调试它。它在readUntilColon()上显示大小为1的无效写入。它特别指出buffer[index] = delimCheckBuffer[0];是问题所在。但是我还是不明白这一点有什么问题。如果有人能给我解释一下就太好了。谢谢

oxiaedzo

oxiaedzo1#

您需要检查是否没有覆盖缓冲区

void readUntilColon(int fd, char* buffer, size_t index, size_t size) {
    while(read(fd, delimCheckBuffer, 1) > 0) {
        if(index < size)
        {
            if(delimCheckBuffer[0] == ':') {
                buffer[index] = ':';
                break;
            }
            buffer[index] = delimCheckBuffer[0];
            ++index;
        }
    }
}

相应地称之为。再加几张支票

相关问题