Segmentation fault
Najčešća greška koju pravim jeste nepažnja u radu sa memorijom. Ne znam zašto, ali iako se trudim da pazim gde ide svako malloc, a gde free, gde new, a gde delete ili šta već postoji analogno na nekom desetom jeziku obavezno se potkrade greška. Čak mogu i da na prste nabrojim situacije, i iako to sve znam ponovo napravim glupost. Lepo inicijalizujem pokazivač, prenesem ga u drugu funkciju, promenim vrednost, obradim, oslobodim i onda u funkciji odakle je “potekao” ponovo uradim free. Druga mogućnost je da prenesem neinicijalizovani pokazivač u funkciju, a da po prekidu funkcije očekujem inicijalizovani iako to nisam uradio i onda sve dalje ide lepo pa se čak i gornja poruka pojavi na ekranu. Za divno čudo, greške sa buffer overflow-om mi se retko dešavaju, valjda sam na to naučio da pazim jer o tome svi pišu i pričaju.
Problem je kada se ovakva neka greška zavuče, ili kada podatke očitavam sa nepouzdanog izvora pa oni i ne stignu, a ja planiram da uradim memcpy, pa onda posle free zato što je posle u glomaznom kodu jako teško pronaći i otkloniti. Plus, što se greška uopšte ne mora manifestovati redovno porukom iz naslova pa problem postaje još veći.
Curenje memorije je pak druga priča. I tu nisam naivan, ali ipak češće oslobađam isto par puta, nego što zaboravim da oslobodim inicijalizovanu memoriju.
A onda kreće pokretanje programa pod valgrind-om uz neki JIT debuger što zna da potraje i potraje kada se radi o GUI aplikacijama koje vole da crtaju svakojake stvari po ekranu, u kombinaciji sa teškom GUI bibliotekom kao što je GTK ili sl.
Kako se braniti od ovakvih grešaka? Uzrok je trenutni manjak koncentracije, nepažnja - baš ono zbog čega mi se često desi da dobijem 3 ili 4 na nekoj proveri iz matematike. Stil pisanja koda ili stalni debug? Prvo je manje efikasno, a drugo nepraktično - naročito kada su rokovi tesni.
I posle neko kaže da se one silne warning poruke slobodno mogu ignorisati, a baš u tom grmu leži zec.
2 komentara
4 nov 2004 zsteva
1. stil pisanja (preporuka DJB)
2. efence/splint
4 nov 2004 alex
Hehe, celo jutro jurim jedan memory leak u C++ aplikaciji koju radim. Prateci staru izreku da ces se setiti resenja kad ne mislis o problemu, resih da se malo odmorim od problema i vidim ima li sta zanimljivo da se procita na Netu.. I sta imam da procitam? Ovaj tvoj tekst! :))
(mala pauza, setio sam se gde je problem)
Sva snaga C-a i C++ jezika (i svih jezika u kojima je moguca direktna manipulacija memorijom) je upravo i njihova (po mom misljenju) najveca mana. Rad sa memorijom je veoma delikatan posao, narocito u pozamasnim projektima.