C/C++ Hafıza Sızıntılarını Tespit Etme

kondanta

Katılımcı Üye
29 Tem 2017
910
0
CNCF

Merhabalar,
Yakın bir zaman diliminde, bir arkadaşımın yazdığı, easyly, C kütüphanesini inceledim. Daha doğrusu "at da inceleyelim, belki problem vardır" diyerek zorla incelemek için kodu alıkoydum da diyebiliriz. Burada kodun tamamını paylaşmayacağım lakin belli başlı noktalarından alıntılar yapacağım

Öncelikle memory leak nedir diye soralım kendimize. Garbage collector FTW. Memory leak,
“Memory leak”, programın kullandığı hafıza ile işi bittiği halde ilgili hafıza bloğunu serbest bırakmaması durumudur. Bu durum;

Gerçekte kullanılmayan hafıza bloklarının referans edilmeye devam edilmesinden veya
Native resource’ların düzgün bir şekilde serbest bırakılmamasından kaynaklanmaktadır [1]

Özellikle bu durumu C/C++ raw pointerlarında yaşamaktayız, sebebi belki garbage collector kullanan bir dilden geçiş yapıldığı için belki de basitçe unuttuğumuz için. Peki bu durumun önüne nasıl geçebiliriz. Sizi valgrind adlı program ile tanıştırayım. Nedir bu program derseniz, amacı memory leak, yani sızıntıları size gösterip acaba nerede sızıntı olmuştur diye tracing yapmanızı hızlandıran bir araçtır.

Öncelikle, kullanacağımız kodun gerekli kısımlarını sizinle de paylaşayım.


Kod:
typedef struct{
	char *key;
	char *value;
}Part;

typedef struct{
	int index;
	Part *partlst;
}Dict;

// Some logic I don't want to share

**** clean_dict(Dict* dict){
	free(dict->partlst);
	free(dict);
}

int main...

Uzun süre C ve türevi dillerde pointer mantığı ile iş yapınca, yukarıdaki clean_dict fonksiyonun eksik olduğunu, yani leake sebep olduğunu direk görebilirsiniz. Lakin bu konu için hiç bilmiyormuşuz gibi devam edelim.

Öncelikle kodumuzu derleyelim. Baktık çalışıyor. Akabinde valgrind'ı çalıştıralım. Bizim için compile edilmiş dosyayı tekrardan run edecek bu işlemi yaparken.
xSabHa.png

ls komutu ile görebileceğiniz gibi, çalıştırdığımız script "valgrind-out.txt" şeklinde belirttiğimiz bir sonuç dosyası yaratmış. İçine girip bakıyoruz.

a3BMGR.png

KRyOyS.png

Görüldüğü üzere, valgrind outputu bize memory leaklerin nerelerde olduğunu satır numarası olarak belirtmekle birlikte sonda bir özet geçiyor. Burada leak summarydeki tiplerin ne anlama geldiğine uzun uzadıya değinmek istemiyorum, orayı size bırakıyorum. Kendiniz araştırıp detaylarını öğrenirsiniz diye.

Özetle, yazdığınız C/C++ kodlarını muhakkak valgrind gibi memory leak ve sanitizer ve ya linterlara sokmayı unutmayın. Sanitizer nedir, C/C++ linterları nedir gibi sorularınız olursa şayet onlarla başka konularda ilgileniriz.




Kaynaklar
[1] : Memory Leak'in Tanımı ve Önemi » Hakan Uzuner

 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.