C ve C++ dillerinde tip güvenliği (type safety)

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,729
C++ programlama dili, C nin sağladığı bütün olanakları sağlar. Ama C'de derleyicinin sorun çıkarmadan izin verdiği birçok riskli program yapısı, C++ derleyicisinde hatayla sonuçlanır. Örneğin şu aşağıdaki C programını inceleyelim:

Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int* a = malloc(1000);

   printf("a = %p\n", a);
}

Burada int olan bir pointer'a 1000 byte büyüklüğünde ayrılan bir buffer adresini atıyoruz, sonra da pointer'in değerini ekrana yazdırıyoruz. Bunu C ve C++ derleyicileri ile derliyoruz. Derlerken de özellikle bütün uyarı mesajlarını etkin duruma getiriyoruz (-Wall, enable all warnings)

Kod:
[ta@bonsai ~]$ gcc -Wall a.c
[ta@bonsai ~]$


[ta@bonsai ~]$ g++ -Wall a.c
a.c: In function ‘int main()’:
a.c:6:19: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
    int* a = malloc(1000);


Görüldüğü gibi, C derleyicisi bir uyarı bile üretmezken, C++ derleyicisi direkt olarak HATA VERİYOR. Bu iyi birşey. Böyle bir dönüşümü gerçekten amaçlıyorsanız, özel dönüştirme operatörü kullanmanız gerekir.

Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int* a = static_cast<int*>(malloc(1000));

   printf("a = %p\n", a);
}

[ta@bonsai ~]$ g++ -Wall a.cpp
[ta@bonsai ~]$
 
Son düzenleme:
Şu programa bakalım:

Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int* a = "deneme";

   printf("a = %p\n", a);
}

[ta@bonsai ~]$ gcc -Wall a.c
a.c: In function ‘main’:
a.c:6:13: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
    int* a = "deneme";

[ta@bonsai ~]$ g++ a.cpp
a.cpp: In function ‘int main()’:
a.cpp:6:13: error: cannot convert ‘const char*’ to ‘int*’ in initialization
    int* a = "deneme";

Evet, burada C derleyicisi, ancak "bütün uyarı mesajları açık olsun" dedikten sonra bize bir "uyarı" mesajı veriyor. Birçok haylaz programcı warning'leri özellikle açmaz. Bunun dışında, uyarı mesajları derleme işlemini durdurmaz. Tüm program derlenmeye devam eder ve sonunda da bir binary program ortaya çıkar. Eğer dağınık, umursamaz bir programcı iseniz, bu uyarı mesajlarını sadece derleyiciden gelen sinir bozucu bir "dırdır" olarak algılarsınız ve gereğini yapmazsınız.

Ama aynı programı C++ derleyicisi ile derleyince, hiç "uyarı mesajları açık olsun" demeye gerek kalmadan direkt olarak HATA alıyoruz. Yani dağınık, umursamaz bir programcı iseniz bile, artık bu noktada sorunu çözmek için birşeyler yapmanız gerekiyor, çünkü derleme işlemi yarıda kesiliyor :p
 
Son düzenleme:
Şu programa bakalım:

Kod:
#include <stdio.h>

int main()
{
   unsigned int a = 3;
   char b = 8;

   if (a > b)
   {
      printf("a = %u\n", a);
   }
}

[ta@bonsai ~]$ gcc -Wall a.c
[ta@bonsai ~]$

[ta@bonsai ~]$ g++ -Wall a.cpp
a.cpp: In function ‘int main()’:
a.cpp:8:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (a > b)

Burada gene C derleyicisi hiç sesini çıkarmıyor. Ama C++ derleyicisi burada bir uyarı mesajı veriyor. Birisi işaretli bir değişken, diğeri işaretsiz. Bunların karşılaştırılması güvenli değildir. Eğer gerçekten niyet bu ise, gene dönüştürme operatörü ile niyetin belli edilmesi lazım.
 
Evet, bunun gibi birçok başka örnek de verilebilir. C derleyicisi, her birisi bir bug veya güvenlik açığı teşkil edecek birçok kod yapısını hiçbir itiraz göstermeden derliyorken, C++ derleyicisi, yerine göre ya hata mesaji, yada uyarı mesajı ile programcıyı hizaya getiriyor :)

O yüzden, eğer bir C programı yazacaksanız, bu programı C++ derleyicisi ile derleyin. C++ dilinin sağladığı ilave özelliklerden hiçbirisine ihtiyacınız olmasa bile, C++ dilinin sağladığı tip güvenliği (type safety) büyük bir avantajdır.
 
Son düzenleme:

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,789
Mesajlar
99,024
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top