Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sta moze da bude kada puca kod malloc-a?

[es] :: C/C++ programiranje :: Sta moze da bude kada puca kod malloc-a?

Strane: 1 2

[ Pregleda: 6958 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.36.EUnet.yu

Sajt: www.mycity.rs


+1 Profil

icon Sta moze da bude kada puca kod malloc-a?26.04.2003. u 17:35 - pre 254 meseci
Sve lepo radi, prolazi kroz petlje, izvrsava funkcije, i onda od jednom kod malloc-a tras, iz cista mira: Segmentation fault.

Fazon je sto ne puca ispred, gde ima par if-a, i par poziva funkcija, nego bas kod malloc-a, ni pre ni posle.

Ako negde 'gazim' memoriju rezervisanu za program, zasto ne pukne negde ispred, nego bas kod malloc-a?

Pukne ovde:
data = (T *)malloc (_count * sizeof(T));

data nije alociran, to odmah da otklonim kao mogucnost.

Sta moze da bude ovo?
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 18:35 - pre 254 meseci
A da probaš calloc? Koliko sam skapirao malloc ne prazni samu memoriju, samo je alocira... mada ne bi trebalo da bude problema... Takođe probaj gdb a.out pa run i onda ćeš dobiti gde je pukao (libc6 __init_malloc ili slično).
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.50.EUnet.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 18:45 - pre 254 meseci
ma nema veze calloc, ne alociram niz, obicnu memoriju za char alociram...
moracu definitivno gdb da pocnem da koristim...
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.13.EUnet.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 19:27 - pre 254 meseci
Evo:
Program received signal SIGSEGV, Segmentation fault.
0x4017ac4e in malloc_consolidate () from /lib/libc.so.6
(gdb) bt
#0 0x4017ac4e in malloc_consolidate () from /lib/libc.so.6
#1 0x4017a77f in _int_malloc () from /lib/libc.so.6
#2 0x401796b5 in malloc () from /lib/libc.so.6
#3 0x080491c4 in papi::array<char>::alloc(int) ()
#4 0x08049123 in papi::array<char>::copy(char*, int, int, int) ()
#5 0x08048b9c in example2() ()
#6 0x08048ea0 in main ()
#7 0x40119bb4 in __libc_start_main () from /lib/libc.so.6

moze li iz ovoga nesto da se sazna?
sta mu je ovo malloc_consolidate ?

ili mi kazite sta da otkucam u gdb-u, posto slabo znam da radim u njemu?
kako se dobijaju podaci sa registara?
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.12move.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 20:37 - pre 254 meseci
Jedna mogućnost: zeznuo si memoriju mnogo pre, ali je tek funkcija malloc natrčala na to.

Drugo: šta traži malloc u C++ programu?

Treće: probaj da koristiš makro assert (heder assert.h). Dosta je zgodan za hvatanje nehotičnih grešaka i za obeležavanje mesta gde treba obraditi grešku. Vrlo je interesatno uraditi recimo:

Code:

#include <assert.h>

/* negde u kodu */

   assert( pointer != 0 );
   /* radi nesto sa tim pointerom */
   /* ... itd */


pa, ako slučajno pointer bude 0 (==NULL) u trenutku kada naiđe assert() biće ispisano ime modula, ime funkcije i broj linije u kojoj je assert okinuo.

Četvrto: ako već koristiš malloc, onda to radi bez eksplicitnog pretvaranja tipova, tj bez (T*). Dobra je praksa (vidi C FAQ).

Peto: a gde je sors? Ako pošalješ, možda možemo kolektivno da izdebagiramo.

f
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 20:57 - pre 254 meseci
mislis pregazio sam negde program ?
ne znam, verovatno, ali sors izgleda tako cist da nemam reci... tesko cu ja da nadjem sta zeza ovde...
skapirao sam nesto osnovno u gdm-u, ali od toga mi slaba vajda u ovakvoj situaciji, jer je ovde klasican buffer overflow izgleda...

mada, izgleda kao da uopste nije alocirao objekat, pointer ko zna na sta pokazuje, pa pisem/citam po necemu drugom, na to mi najvise smrdi...

pointer 'data' je clanica klase, i kada njega malloc proba da izmeni, program prsne, verovatno zato sto pointer za objekat pokazuje na ko zna sta...
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.12move.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 21:04 - pre 254 meseci
Mislio sam da greška može da sedi na sasvim drugom delu programa. Tri pravila kodiranja u C-u: Careful, careful, careful.

I šta te sprečava da umesto tog „malociranja“ napišeš:

Code:

data = new T[_count]; 


Teško je išta više reći napamet, bez sorsa.

f
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 21:05 - pre 254 meseci
imam u konstruktoru :
data = 0;

ispred malloc-a imam
if (data==0) throw 0;

definitivno nije ni do sjebanog pointera na objekat, a nije ni kod alokacije objekta, jer bi prso vec kod konstruktora, kod data=0, a i dole vidi da je data==0, sto znaci da je heap objekta OK.

a sors nije bas mali, ima oko 180 + 160 linija, klasa + primer u kom puca...
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 21:26 - pre 254 meseci
A malloc koristim zbog realloc, cesto prosirujem memoriju.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 23:10 - pre 254 meseci
pokušaj da lociraš preko: http://developer.kde.org/~sewardj/ ondnosno http://developer.kde.org/~sewardj/docs-1.9.5/manual.html za dokumenataciju...
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?26.04.2003. u 23:17 - pre 254 meseci
Evo, prvo sam primer sveo na svega 6 linija, zatim sam iz klase uklonio funkcije koje ne koristim, i dosao do destructora, i bingo.

Ja mislim da je problem ovde, imam sledece u klasi:
Code:

array **pointer;


To predstavlja niz pointera na objekte klase 'array'.

U konstruktoru ide:
Code:

pointer=0;


Taj niz alociram ovako:
Code:

pointer = (array **) malloc ( count * sizeof(array *) );


count je duzina niza.
Dakle, tu smestam pointere na objekte, to je niz pointera!

Posle alociranja uradim
Code:

for (int i=0; i<count; i++) pointer[i]=0;


Tako kasnije znam da li pointer pokazuje na neki objekat, kada je 0 to znaci da ne pokazuje na nista.

E sad, objekte kreiram ovako:
Code:

if (pointer[n]!=0)
  pointer[n] = new array;


Mislim da u sledecem kodu gresim, to je destruktor objekta, i on izgleda ovako:

Code:

for (int i=0; i<count; i++)
  if (pointer[i]!=0) 
    delete pointer[i];

if (pointer!=0)
  free (pointer);


Da li gresim negde kod dealokacije niza pointer-a?

P.S. niz ponekad resize-ujem, pa zato koristim malloc/realloc/free za njega.
Za objekte koristim new i delete, posto njih ne resize-ujem :)
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 01:02 - pre 254 meseci
nadjoh gresku, na skroz drugom mestu :)
valgrind je cudo, gorane tvoj sam duznik :)

greska je nastala zato sto sam ja prvo imao klasu, a posle sam je pretvorio u template klasu, i ovde se zeznuo:

bilo je:
Code:

        for (int i=old_count*size; i<new_count*size; i++)
            data[i]=0;

'data' je bio tipa char, 1 bajt, dok je _size bio velicina objekta koga smestam, i to je radilo.

Kad sam klasu prebacio u template, prepravio sam ono u:
Code:

        for (int i=old_count*sizeof(T); i<new_count*sizeof(T); i++)
            data[i]=0;

a data je bio tipa T.

Sami nadjite gresku :)

da nije valgrind-a, ko zna kad bih ovo primetio :)
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.tiscali.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 01:55 - pre 254 meseci

Neko je kanda pregazio malo više memorije nego što treba...

f
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 02:44 - pre 254 meseci
da ti samo znaš kako sam ja danas slučajno nabasao na alat ... (gnomedesktop.org čitanje vesti > čitanje bednog intervjua na linuxjournal-u > čitanje teksta o upotrebi i alociranju memorije > čitanje fusnota >...)
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 13:40 - pre 254 meseci
ako je T 4 bajta, i ako alocira 5 mesta za taj T objekat, gazio je 12 bajta = (4-1)*4
generalno, gazio je mnogo, pogotovu kad alocira vise (10-1)*4... :)

sad sam pustio valgrind da pregleda jedan drugi (moj) projekat, i nasao sam par mojih nebuloza, ne mnogo opasnih, ali ipak mogu da sruse program u odredjenim situacijama...

program je strava :)
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.12move.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 14:40 - pre 254 meseci

A sad još da te pitam zašto ne koristiš vektore iz STL gde ti se ovakve stvari nikada ne bi rešavale, a povrh toga ne bi morao da se patiš sa promenom veličine?

f


 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.12.EUnet.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 16:34 - pre 254 meseci
zato sto je moj vektor mocniji, mozes da mesas tipove objekata koje smestas...
i plus izazov da napisem :)
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.dial.12move.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 16:48 - pre 254 meseci

Ispravi me ako grešim, ali STL vektori mogu isto to, dokle god su elementi izvedeni iz iste klase. To je posledica polimorfizma. Sve što treba je da imaš roditeljsku klasu prema kojoj specijalizuješ šablon. Elemente kontejnera izvodiš iz dotične roditeljske klase i oni se mogu savršeno dobro smestiti u isti kontejner.

Ako pišeš kontejnersku klasu kao vežbu, onda je to sasvim u redu. Ali ako ti je potrebna da bi je koristio kasnije, vredi razmisliti a) da iskoristiš implementaciju koja je data u STL ili bar b) da koristiš isti interfejs kao što je onaj u STL jer onda sebe rešavaš mnogih problema. Napraviti stvar koja je slična po funkcionalnosti sa STL je ogroman posao i pitanje je da li ga ima smisla raditi, pogotovo kad su funkcionalna rešenja na dohvat ruke.

f

 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.55.EUnet.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?27.04.2003. u 20:15 - pre 254 meseci
epa ovde mozes da trpas bas svasta, od char-a do slozenih objekata :)
kao sto rekoh, izazov je razlog, i sto hocu da se oslanjam na sto manje tudjih lib-ova.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.beg.sezampro.yu



+62 Profil

icon Re: Sta moze da bude kada puca kod malloc-a?28.04.2003. u 11:15 - pre 254 meseci
Citat:
filmil:

Ispravi me ako grešim, ali STL vektori mogu isto to, dokle god su elementi izvedeni iz iste klase. To je posledica polimorfizma. Sve što treba je da imaš roditeljsku klasu prema kojoj specijalizuješ šablon. Elemente kontejnera izvodiš iz dotične roditeljske klase i oni se mogu savršeno dobro smestiti u isti kontejner.



Izvini, ali upravo gresis.
Vector, strogo uzevsi, NIJE polimorfni kontejner. Obrazlozenje sledi.
Vector je, kao sto svi znamo, template klasa. Dakle, ako kao argument vector-a stavis tip T, a T je neka klasa, i alociras vector na recimo 10 instanci klase T, zauzeta memorija iznosi upravo 10*sizeof(T). Dodajmo na kraj vectora instancu klase T1 koja je izvedena od klase T, i koja recimo ima (private) 2 pointera vise; drugim recima instanca T1 je veca od instance T za 8 bajtova.
Sta se desava kada pokusamo da na kraj vectora dodamo instancu T1? Vector ce na kraju bloka doalocirati sizeof(T) bajtova, i u to pokusati da strpa sizeof(T1) bajtova. Karambol...ili nesto slicno.
Ali, sasvim druga je prica ako upotrebimo vector sa argumentom T*; tada ce raditi polimorfizam. Medjutim, tada si sveo vector na klasican Delphi kontejner. Vector koji alocira 10*sizeof(T*) ustvari alocira 10*4 = 40 bajtova. A gde je memorija za same objekte? Pa na heap-u, obzirom da se oni kreiraju sa new. U stvari, vector sa T* uopste nece dobro raditi, jer moras sam da kreiras i ubijas objekte; vector samo alocira i oslobadja memoriju za pointere (T*).
Doduse, moguce je da u stl-u vec postoji neka klasa koja ovo resava; ali za vector znam pouzdano da ne funkcionise.
Pozdrav

Rajko
 
Odgovor na temu

[es] :: C/C++ programiranje :: Sta moze da bude kada puca kod malloc-a?

Strane: 1 2

[ Pregleda: 6958 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.