bugün
- sözlük kızlarının ayak falları7
- kız kardeş ağda yaparken odasına dalmak5
- sözlük kızlarının kombileri7
- sözlüğün en güzel kız yazarı12
- ben aslında kızım7
- en köylü özelliğiniz3
- ctrlx abla12
- tecavüze ceza önerisi3
- yazarların en muhteşem özelliği3
- buddy dude'nin fotosunun yapay zeka çıkması28
- oytunkaran'ı özlemek6
- eski sevgiliye 6 yıl sonra mesaj atmak2
- bugün hangi sözlük kızına evlenme teklif etsem15
- ben ahmet sezer bey sorularınızı yanıtlıyorum15
- yapay zekanın rüyaların esrarını çözmesi2
- aym'nin süresiz nafaka kararını iptal etmesi4
- nervio sözlüğün en asil kadınıdır4
- yılan hikayesi erkan2
- antipanik8
- o son birayı içmek5
- ktç'nin beni açık oylaması2
- arkadaşlar bi durum mu var3
- kürtler olmasaydı yaşanabilecek sıkıntılar2
- kitap okuyan erkek10
- benim liderim özgür özel dir3
- bir kadının kalçalarına veya ayaklarına aşık olmak2
- rastgele diyalog etkileşimi2
- beş büyük kişilik özelliği3
- uyuşturucu kullanan oğlunu öldüren baba20
- gocu31
- nervio abla6
- kavga etmeyin lan hepinizi döverim5
- cilgincapkin7
- kolye4
- galatasaray4
- kih kih kih diye gülen erkeklerin çekici olması5
- 40 yaşını aşmış bunaklar kulübü12
- vexillarius the slayer'in ırkı6
- nick değiştiren yazarlar5
- sözlüğün abazalarla dolması5
- dersimci aleviler de pkk kadar tehlikelidir3
- cilgincapkin2'nin sarı teker olması4
- sedat pekmez adam mıdır5
- yapay zeka ile flört uygulaması prototipi2
- erkeklerin fetişleri8
- silvermist8
- çok osurmak4
- üniversite okumak5
- türk faşisti vs kürt faşisti3
- nervio isimli yazarin tam olarak neye yaramasi2
Daha önce bir sitede paylaştım. Buraya da paylaşayım.
Bir pointer düşünelim bu pointer’ı bir değişkene atayalım. Sonra ikinci bir pointer olduğunu varsayalım bu ikinci pointer’ı da ilk pointer’a atayalım. Bu durumda iki pointer da aynı adrese bakmış oluyor. Bu durum segmentation fault hatasina sebep olmaktadir ve buffer overflow yapılmasına davet çıkardığı için güvenlik açığı oluşturabilir.
ilk pointer fflush ve stding parametresiyle temizleniyor yani deallocate ediliyor varsayalım. Bu durumda bu bölgenin değeri nil olmakta. Ve bu durumda ikinci pointer dangling pointer yani sarkıtılmış gösterge (o kadar çevirisini aradım en mantıklısı bu oldu) olmakta.
Çözüm için bazı yöntemler var. Bunlardan birisi akıllı pointer kullanımıdır. C++11 ile kullanımı biten auto_ptr ve onun yerine gelen unique_ptr kullanılabilir ilk yöntemlerdir.
Bir de bunun başka bir alternatifi olarak tombstone metodu var. Burada da yapılan şey pointer değişkenin başına başka bir değer ekliyoruz.
Öncelikle bahsettiğimiz konuya dair bir örnek kod verelim:
görsel
Bu hataya yakalanmış bir kodun çıktısı şöyle olacaktır. Tabii bu sistemden sisteme göre değişir. Aslında bu çıktı çöp bir değerdir.
Örneğin koding.com sanal makinesinde yaptığım denemenin sonucu:
görsel
Bu da kendi makinemde yaptığım işlemin sonucu:
görsel
Bu hatanın bize verdiği çıktılar compile time’da şöyle olacaktır:
warning: function returns address of local variable [-Wreturn-local-addr]
ya da
warning: function returns address of local variable
Bu hataları alıyorsak derleme zamanında demek ki bir yerlerde dangling pointer oluşmuştur. Bunu çözmemiz aslında basit. Verdiğimiz kodda oluşturduğumuz x değişkenini static variable’a çevirmemiz yetecektir.
Yani bu durumda şöyle bir değişiklik olacak:
görsel
Şimdi artık bu kodumuz dangling pointerdan arındırılmış vaziyette. Buradaki x değişkeni yerel bir değişkendir. x değişkeninin adresi cagri işlevi içerisinde döndürüldükten sonra sıfırlanıyor. Ancak pointer hala bu adresi işaret ediyordu. Dangling pointer hatasının açıklaması buydu. Biz bu değişiklik ile bu hatayı çözüme kavuşturmuş olduk.
Koding sanal makinesindeki çıktı:
görsel
Kendi makinemdeki çıktı:
görsel
Bir pointer düşünelim bu pointer’ı bir değişkene atayalım. Sonra ikinci bir pointer olduğunu varsayalım bu ikinci pointer’ı da ilk pointer’a atayalım. Bu durumda iki pointer da aynı adrese bakmış oluyor. Bu durum segmentation fault hatasina sebep olmaktadir ve buffer overflow yapılmasına davet çıkardığı için güvenlik açığı oluşturabilir.
ilk pointer fflush ve stding parametresiyle temizleniyor yani deallocate ediliyor varsayalım. Bu durumda bu bölgenin değeri nil olmakta. Ve bu durumda ikinci pointer dangling pointer yani sarkıtılmış gösterge (o kadar çevirisini aradım en mantıklısı bu oldu) olmakta.
Çözüm için bazı yöntemler var. Bunlardan birisi akıllı pointer kullanımıdır. C++11 ile kullanımı biten auto_ptr ve onun yerine gelen unique_ptr kullanılabilir ilk yöntemlerdir.
Bir de bunun başka bir alternatifi olarak tombstone metodu var. Burada da yapılan şey pointer değişkenin başına başka bir değer ekliyoruz.
Öncelikle bahsettiğimiz konuya dair bir örnek kod verelim:
görsel
Bu hataya yakalanmış bir kodun çıktısı şöyle olacaktır. Tabii bu sistemden sisteme göre değişir. Aslında bu çıktı çöp bir değerdir.
Örneğin koding.com sanal makinesinde yaptığım denemenin sonucu:
görsel
Bu da kendi makinemde yaptığım işlemin sonucu:
görsel
Bu hatanın bize verdiği çıktılar compile time’da şöyle olacaktır:
warning: function returns address of local variable [-Wreturn-local-addr]
ya da
warning: function returns address of local variable
Bu hataları alıyorsak derleme zamanında demek ki bir yerlerde dangling pointer oluşmuştur. Bunu çözmemiz aslında basit. Verdiğimiz kodda oluşturduğumuz x değişkenini static variable’a çevirmemiz yetecektir.
Yani bu durumda şöyle bir değişiklik olacak:
görsel
Şimdi artık bu kodumuz dangling pointerdan arındırılmış vaziyette. Buradaki x değişkeni yerel bir değişkendir. x değişkeninin adresi cagri işlevi içerisinde döndürüldükten sonra sıfırlanıyor. Ancak pointer hala bu adresi işaret ediyordu. Dangling pointer hatasının açıklaması buydu. Biz bu değişiklik ile bu hatayı çözüme kavuşturmuş olduk.
Koding sanal makinesindeki çıktı:
görsel
Kendi makinemdeki çıktı:
görsel
C' de
int * doWhateverIsayYouIdiotFunction( int a ){
int x = a * a;
return &x;
}
seklinde bir fonksiyon kullandigimizda, x degiskeni fonksiyon deger dondurdugu an ulasilamaz oldugu icin x in adresini gosteren ve fonksiyonun donus degerini atadigimiz pointer artik bir dangling pointer dir.
Vatana millete hayirli olsun.
int * doWhateverIsayYouIdiotFunction( int a ){
int x = a * a;
return &x;
}
seklinde bir fonksiyon kullandigimizda, x degiskeni fonksiyon deger dondurdugu an ulasilamaz oldugu icin x in adresini gosteren ve fonksiyonun donus degerini atadigimiz pointer artik bir dangling pointer dir.
Vatana millete hayirli olsun.
Gündemdeki Haberler
güncel Önemli Başlıklar
