c - UNIX:recv 的内存问题 - malloc.c:3096:sSYSMALLOC:断言

标签 c unix

就像在主题中一样,我的大学项目有问题。我已经尝试自己做很长时间了,但由于我的全职工作,我的空闲时间是不够的。

我得到的错误:

all: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. Aborted

代码的错误部分

void obslugagracza(int sock, int numergracza){
    int wybor, read_size, kto, ile;
    char client_message[1000];
    char message[1000];
    time_t rawtime;
    while(wyscig==0)
    {
        wypisz("Co chcesz zrobic?\n\n1 - Sprawdz ilosc kredytow\n2 - Dodaj kredytow\n3 - Wyplac kredyty\n",sock);
        wypisz("4 - Kto w nastepnym wyscigu?\n5 - Wyniki poprzedniego wyscigu\n6 - Obstaw najblizszy wyscig\n7 - Kiedy wyscig?\n\n", sock);
        while( (read_size = recv(sock , client_message , 100 , 0)) > 0 )
        {
            if(wyscig==1)
                break;
            wybor=atoi(client_message);
            if(wybor==1)
            {
                sprintf(message,"TEMP %i  \n",plist[numergracza].money);
                wypisz(message,sock);
                sleep(4);
            }
            else if(wybor==2)
            {
                wypisz("TEMP", sock);
                read_size = recv(sock , message , maxnamel , 0);
                message[read_size-1]=0;
                plist[numergracza].money+=atoi(message);
                sprintf(message,"TEMP",plist[numergracza].money);
                wypisz(message,sock);
                sleep(4);
            }
            else if(wybor==3)
            {
                wypisz("TEMP", sock);
                read_size = recv(sock , message , maxnamel , 0);
                message[read_size-1]=0;
                if(atoi(message)>plist[numergracza].money)
                    wypisz("TEMP", sock);
                else
                {
                    plist[numergracza].money-=atoi(message);

                    sprintf(message,"TEMP",plist[numergracza].money);
                    wypisz(message,sock);
                }
            }
            else if(wybor==4)
            {
                wypisznastepnych(sock);

            }
            else if(wybor==5)
            {
                if(firstrace==0)
                    wypisz("TEMP", sock);
                else
                {
                    char messaget[100];
                    int i, horsen=8;
                    if (hnumber<horsen)
                        horsen=hnumber;
                    wypisz("TEMP", sock);
                    for(i=0;i<horsen;i++)
                    {
                        if(results[i].inrace==1)
                            sprintf(messaget,"TEMP %s \n", results[i].name);
                        wypisz(messaget,sock);
                    }
                }
            }
            else if(wybor==6)
            {
                wypisznastepnych(sock);
                sleep(3);
                wypisz("TEMP", sock);
                read_size = recv(sock , client_message , maxnamel , 0);
                client_message[read_size-1]=0;
                kto=atoi(client_message);
                wypisz("TEMP", sock);
                read_size = recv(sock , client_message , maxnamel , 0);
                client_message[read_size-1]=0;
                ile=atoi(client_message);
                if(ile>plist[numergracza].money)
                    wypisz("TEMP", sock);
                else
                {
                    plist[numergracza].money-=ile;
                    plist[numergracza].bet+=ile;
                    plist[numergracza].bethorse=kto;
                    sprintf(message,"TEMP",race[kto], ile);
                    wypisz(message,sock);
                }
            }
            else if(wybor==7)
            {
                time( &rawtime);
                sprintf(message,"TEMP",(int)(nextr-rawtime)/60, (int)(nextr-rawtime)%60);
                wypisz(message,sock);
            }
            else
            {
                wypisz("TEMP",sock);
            }
            sleep(3);
            wypisz("Co chcesz zrobic?\n\n1 - Sprawdz ilosc kredytow\n2 - Dodaj kredytow\n3 - Wyplac kredyty\n",sock);
            wypisz("4 - Kto w nastepnym wyscigu?\n5 - Wyniki poprzedniego wyscigu\n6 - Obstaw najblizszy wyscig\n7 - Kiedy wyscig?\n\n", sock);
        }
    }   
}

如果我理解正确,错误发生在 while 的第二个循环上(客户端选择了一个选项,它工作正常,然后菜单再次显示,他再次选择(哪个选项无关紧要),然后发生错误。

所以线路错误

while( (read_size = recv(sock , client_message , 100 , 0)) > 0 )

此问题的根源可能是什么?在一些 gorum 上我读到过有关内存损坏的信息,但我不知道如何解决这个问题。

还有一个小问题 - 这是分配内存的正确方法吗?

char *messagew ;
messagew=malloc(sizeof(char)*100+1);

我知道代码质量很差,但由于我的工作和第二所大学,我把这个程序分成几个部分,通常不太记得我在哪里停止了以及现在做什么。 由于程序大部分已完成,因此在解决此问题后我可能会有更多问题(现在修复任何内容可能会在代码数量和质量方面产生更多问题)。

当然,所有这些 TEMP 消息都只是在这里,以使代码更短 - 我有正常的消息发送给客户端,但我怀疑它们对解决问题有任何帮助。

最佳答案

来源是内存损坏,毫无疑问是由于某些 undefined behaviour 引起的在你的代码中,可能是 buffer overrun 。内存错误的本质是,根本原因可能与您收到错误的点相去甚远(说实话,您很幸运能够收到一条明智的错误消息)。

调试此问题的最简单方法可能是通过 Valgrind 运行您的程序.

关于c - UNIX:recv 的内存问题 - malloc.c:3096:sSYSMALLOC:断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26229617/

相关文章:

linux - 将前一天的文件发送到 unix 中的服务器

从终端编译 C 代码,返回 fatal error ?

c - snprintf 未创建正确的命令

c - 如何在 unix 上以 C 图形方式打印到控制台

c - 如何在 Ubuntu 上打开一个非修饰的全屏窗口

linux - 编写shell脚本的shell脚本

c - 如何同步线程?

c - 交换文件中的两行

c - 如何访问结构体原始功能之外的成员?

c - 如何将文本文件中的矩阵分配给 C 中的变量?