Ara 23

C Programlama Dilinde En Sık Yapılan 10 Hata

source-code-583537_1280

C programlama dilinin tarihi 70’li yıllara dayansa da günümüzde hala yaygın olarak kullanılan dillerden birisi. Özellikle gömülü sistemlerde en çok kullanılan dil olma özelliğini koruyor. Oldukça esnek yapısıyla assembly’de yazılmış programlara yakın performanslı programlar yazılmasını sağlıyor. Ancak bu esneklik bütün sorumluluğu programcıya bıraktığından birçok hatanın yapılmasına da yol açabiliyor. Zaman zaman birçok güvenlik açığının sebebi de olabilen C programlama diline yapılan hatalardan en yaygın olan 10 tanesini burada paylaşacağım.

  1. Noktalı virgülü kullanılmaması gereken yerde kullanmak
    C’de zaman zaman karıştırılan durumlardan birisi de noktalı virgülün (;) kullanımıyla ilgili. Hemen hemen bütün ifadelerin sonuna konulduğu halde if, for, while gibi ifadelerin sonlarında noktalı virgül olmaması gerektiği bazen unutulabiliyor. O zaman da aşağıdaki koddaki gibi durumlar ortaya çıkabiliyor.

    for( x = 1; x<10; x++ );
    {
    printf( "%d\n", x )
    }

    Yukarıdaki örnekte for ifadesi ile 1’den 9’a kadar olan sayıların yazdırılması amaçlanıyor. Ancak for ifadesi sonundaki noktalı virgün yüzünden for ifadesinin sonrasında “boş” bir ifade varmış gibi işlem yapılıyor ve prinf() fonksiyonu 1 kere çağırılıp devam ediliyor.

  2. Süslü parantez kullanılmayan if ifadeleri
    if ( degisken == 12) 
    fonk1();
    fonk2();

    Continue reading

Nis 07

C programlama dili : Kral mı baş belası mı?

Ne dersek diyelim C dili gömülü sistemlerde “kral” konumundadır. Sevenleri de nefret edenleri de çok… Ancak C dilinin gömülü sistemlerde %80 oranında bir kullanımı bulunmaktadır. Hemen hemen bütün mikrodenetleyicilerin bir C derleyicisi var. Başlangıçta gömülü sistemler için tasarlanmış bir dil olmamasına rağmen C’yi bu kadar önemli kılan etkenler ne peki:

Donanıma olan yakınlık : C dilinin belki de en önemli özelliği yüksek seviyeli bir dildeki kontrol, veri yapıları gibi özellikleri assembly dilinde bulunan donanıma yakınlık gibi özelliklerle birleştirmiş olan “orta seviyeli” bir dil olmasıdır. Programcıya assembly dilinin zorluklarından izole olurken aynı zamanda donanımla direk olarak konuşma imkanı vermektedir.

C bilen programcıların çokluğu : C dili en eski programlama dillerinden olması sebebiyle bu dili bilen ve oldukça tecrübeli programcıların sayısı fazladır. Ayrıca C++ ve Java gibi dilleri bilen programcıların C dilini de kavraması oldukça kolay olmaktadır.

Taşınabilirlik : C dilinde belirli bir işlemci için yazılmış yazılımlarbaşka bir işlemciye taşınabilmektedir.Bu dille uzun süre uğraşmış olanlar bunun aslında göründüğü kadar kolay olmadığını bilse de C dili assembly dillerine göre oldukça “taşınabilir” bir dildir.

Hız ve esneklik: C dilinde yazılan programlar diğer yüksek seviyeli dillerde yazılan programlara göre daha hızlı çalışır. Bunun nedeni diğer dillerde bulunan birçok kontrolün C dilinde bulunmamasıdır.Yani C dili programcının ne yaptığını bildiğini varsayar ve bütün sorumluluğu programcıya bırakır. Bu aynı zamanda C’nin kötü özellikleri arasında da yer alır. C dilinde hata yapmak diğer dillere göre çok daha kolaydır.

C’nin bazı güzel özelliklerini gördük.Şimdi gelelim hayatın acı gerçeklerine. Bu dilde programcılık yapanlar çok iyi bilir ki C başımıza çok kolay bir şekilde oldukça büyük belalar açabilmektedir. C’de belirli bir süre kod yazmış birçok yazılımcı uzun uğraşlar sonucu çalışmayan programındaki hatanın nedeninin aşağıdaki gibi birşey olduğunu bulmuştur:

if ( herhangiBirDegisken = 5 )
{
     BirseyYap();
     BirseyDahaYap();
}

Yukarıdaki kod parçacığında programcının kastettiği şey eğer herhangiBirDegisken degiskeninin değeri 5 ise BirseyYap ve BirseyDahaYap fonksiyonlarının çalıştırılmasıdır.Ancak yukarıdaki koda göre bu fonksiyonlar her zaman çağırılacaktır.Çünkü C dili if ifadesinin içinde atama yapılmasına izin vermektedir ve atamanın sonucu da her zaman 1 değerini döndürmektedir. Buradaki basit hata “=”atama operatörü ile “==” karşılaştırma operatörünün karıştırılmış olmasıdır. Bu basit hata yıllardır belki de binlerce programcı tarafından yapılmıştır.Ayrıca birçok yazılım kazasının da sorumlusudur.

C’nin yol açtığı belalardan biraz olsun kurtulabilmek için firmalar kodlama standartları oluşturmaktadırlar. Örneğin yukarıdaki gibi bir hatanın ortaya çıkmaması için sabit sayının başa yazılması bir yöntemdir :

if ( 5 = herhangiBirDegisken)
{
     BirseyYap();
     BirseyDahaYap();
}

Yukarıdaki kod derlemeye çalıştığınızda derleyici “sabit bir sayıya atama” yapılamayacağını belirterek hata verecektir ve siz de “=” yerine “==” yazmanız gerektiğini bileceksiniz.Bu tür basit “alışkanlıklar” sayesinde birçok hatanın ortaya çıkmasını önleyebiliriz.

Ayrıca bu konuda bazı genel standartların da oluşturulmaya çalışılıyor. .Örneğin *MISRA C adı verilen kurallar bütünü MISRA (Motor Industry Software Reliability Association- Motor Endüstrisi Güvenilirlik Kurumu) tarafından oluşturulmuş çeşitli kurallar bütünüdür.Buradaki amaç C dilinin hatalara yola açan özelliklerinin kullanımını en aza indirerek hataları önlemektir.

Eğer gömülü sistemler alanında çalışıyorsak (ya da çalışacaksak ) C diliyle yaşamayı öğrenmemiz gerekiyor.C’yi keskin bir bıçak olarak düşünürsek yetenekli biri onunla harikalar yaratırken beceriksiz biri ise kendini kolaylıkla yaralayabilir.Mühim olan araçları nasıl kullandığımızdır.

Kaynaklar:

* http://en.wikipedia.org/wiki/MISRA_C