[solved][C, ncurses] Naruszenie pamięci

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
pixelenter
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 194
Rejestracja: 31 gru 2009, 15:41
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

[solved][C, ncurses] Naruszenie pamięci

Post autor: pixelenter »

Witam. Mam problem z biblioteką ncurses. Kompilacja (jak i linkowanie) przebiega prawidłowo. Przy wykonaniu initscr, program wypluwa

Kod: Zaznacz cały

*** glibc detected *** ./browser: malloc(): memory corruption: 0x08c594d8 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0xb7653501]
/lib/libc.so.6(+0x6f2fc)[0xb76562fc]
/lib/libc.so.6(__libc_calloc+0xb2)[0xb7657682]
/lib/libncurses.so.5(_nc_setupterm+0x7d)[0xb7768afd]
/lib/libncurses.so.5(newterm+0x84)[0xb7758284]
/lib/libncurses.so.5(initscr+0x75)[0xb7754be5]
./browser[0x8048b3f]
/lib/libc.so.6(__libc_start_main+0xe7)[0xb75fdce7]
./browser[0x8048831]
======= Memory map: ========
itd.
Oto fragment kodu w którym występuje błąd:

Kod: Zaznacz cały

    while( (len=recv(sockfd, buf, 50, 0)) != 0)
    {
        if( len == -1 )
        {
            perror("recv");
            exit(1);
        }
        buf[len]='\0';
        strcat(page, buf);
    }
    printf("Display page %s\n", argv[2]);
    
    initscr();
Dodam że bez pętli initscr działa prawidłowo.
http://uwolnijlaptopa.pl
http://counter.li.org/cgi-bin/certificate.cgi/528644
otokan
Sędziwy Jeż
Sędziwy Jeż
Posty: 65
Rejestracja: 11 gru 2008, 11:20
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [C, ncurses] Naruszenie pamięci

Post autor: otokan »

A co to jest buf i page ?
Nie podoba mi się: buf[len]='\0'; Nie piszesz przypadkiem poza granicami buf?
I drugie pytanie: czy napis ,,page'' jest odpowiednio duży żeby pomieścić wszystko co odbierze recv?
Awatar użytkownika
pixelenter
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 194
Rejestracja: 31 gru 2009, 15:41
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [C, ncurses] Naruszenie pamięci

Post autor: pixelenter »

A co to jest buf i page ?
Nie podoba mi się: buf[len]='\0'; Nie piszesz przypadkiem poza granicami buf?
I drugie pytanie: czy napis ,,page'' jest odpowiednio duży żeby pomieścić wszystko co odbierze recv?
buf[len]='0' musi być aby strcat mógł je ładnie skleić.
Jeżeli napiszę po pętli

Kod: Zaznacz cały

printf("%s", page);
To wyświetli mi poprawnie wszystkie dane jakie otrzymałem. Jak wezmę w pętli aby wyświetlało mi pakiety jeden po drugim, to widzę z parę pakietów a wyświetlając page wszystkie ładnie sklejone, a więc łączenie ciągów działa. Jeżeli zrobię initscr przed pętlą(nie ważne w jakim miejscu programu), program kończy się w którymś miejscu wyświetlając napis "Aborted". Po za tym tekst nie wyświetla się w całości i nie działa clear().
Page i buf to

Kod: Zaznacz cały

char *page;
char buf[51];
http://uwolnijlaptopa.pl
http://counter.li.org/cgi-bin/certificate.cgi/528644
kklimonda
Zakręcona Traszka
Zakręcona Traszka
Posty: 585
Rejestracja: 20 kwie 2008, 04:21
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME

Odp: [C, ncurses] Naruszenie pamięci

Post autor: kklimonda »

Sprawdź, co valgrind ma do powiedzenia na ten temat.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Odp: [C, ncurses] Naruszenie pamięci

Post autor: ethanak »

pixelenter pisze: Page i buf to

Kod: Zaznacz cały

char *page;
char buf[51];
Dobra, ale na razie masz tylko że page jest wskaźnikiem... mógłbyś nas jakoś oświecić na co ów page wskazuje i co się tam dzieje przed pierwszym strcat? Bo mi to wygląda na przypadkowe śmieci.
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
pixelenter
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 194
Rejestracja: 31 gru 2009, 15:41
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [C, ncurses] Naruszenie pamięci

Post autor: pixelenter »

Kod: Zaznacz cały

page=(char*)malloc(1);
page[0]='\0';
Mi też wydaje się to dziwne, dopiero teraz zacząłem przypuszczać że tu może być błąd.
http://uwolnijlaptopa.pl
http://counter.li.org/cgi-bin/certificate.cgi/528644
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Odp: [C, ncurses] Naruszenie pamięci

Post autor: ethanak »

pixelenter pisze:

Kod: Zaznacz cały

page=(char*)malloc(1);
page[0]='\0';
Mi też wydaje się to dziwne, dopiero teraz zacząłem przypuszczać że tu może być błąd.
Mi to się wcale dziwne nie wydaje :)

page ma pojemność jednego bajta, a Ty tam pchasz na przykład 50 - sama się pamięć nie rozcapierzy :)

Pomyślałeś o tym żeby użyć gliba i GStringa na przykład? I mieć święty spokój z przydziałami pamięci?
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
pixelenter
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 194
Rejestracja: 31 gru 2009, 15:41
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [C, ncurses] Naruszenie pamięci

Post autor: pixelenter »

Kod: Zaznacz cały

page ma pojemność jednego bajta, a Ty tam pchasz na przykład 50 - sama się pamięć nie rozcapierzy
Ale głupi jestem. Taki błąd i pisać na forum. To chyba jeden z moich najgłupszych wątków :). No niestety, zdarza się.

Kod: Zaznacz cały

Pomyślałeś o tym żeby użyć gliba i GStringa na przykład? I mieć święty spokój z przydziałami pamięci?
Pomyślałem, ale chciałem sobie odświeżyć trochę podstawy C, ostatnio programowałem tylko w C++, tam korzystałem ze stringów(stl) i nie martwiłem się przydziałami pamięci. Po za tym co za problem dodać jedną linijkę z realloc :)
Jeszcze raz przepraszam za bezsensowny wątek i dzięki za pomoc. Dalej już sobie poradzę.
Temat do zamknięcia
http://uwolnijlaptopa.pl
http://counter.li.org/cgi-bin/certificate.cgi/528644
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości