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

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,633
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:

Forum istatistikleri

Konular
7,237
Mesajlar
122,441
Üyeler
2,924
Son üye
aytu

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top