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

时间:2014-10-07 06:13:10

标签: c unix

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

我得到错误:

  

all:malloc.c:3096:sYSMALLOc:断言`(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)'失败。   中止

代码有问题

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的第二个循环中(客户端选择了一个选项,它正常工作,然后菜单再次显示,他再次选择(不管选择哪个选项),并且发生错误。< / p>

在线错误

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

这个问题可能是什么原因?在几个gorums上我读过有关内存损坏的内容,但我不知道如何解决这个问题。

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

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

我知道代码质量很糟糕,但由于我的工作和第二大学,我会分开执行此程序,通常不会记住我已停止的位置以及现在的位置。 由于程序大部分完成,我解决这个问题后可能会有更多问题(现在修复任何问题可能会产生更多代码数量和质量问题)。

当然所有这些TEMP消息都只在这里,为了缩短代码 - 我向客户端发送了正常的消息,但我怀疑他们对这个问题有所帮助。

1 个答案:

答案 0 :(得分:1)

源代码是内存损坏,无疑是由于代码中的某些undefined behaviour引起的,可能是buffer overrun。内存错误的本质是这样的,根本原因可能远离你得到错误的地方(说实话,你很幸运得到一个明智的错误信息)。

最简单的调试方法可能是通过Valgrind运行程序。