Yazdığımız kodlar içerisinde birçok uyarı ve hata ile (“warning” ve “error”) karşılaşırız. Kullandığımız derleyiciler bu uyarı ve hataları derleme sırasında bizim için ortaya çıkartır ve buna bağlı olarak düzeltilmesi gereken yerlerde bu düzenlemeleri yaparız. Birçok derleyici bunu kendi içerisinde yaparken harici olarak yapılma ihtiyacı olan durumlar da olmaktatır. Bu işleme statik analiz adı verilir. Statik analiz işlemini gerçekleştirmek için de birçok araç mevcuttur. Bu yazımda CppCheck aracı ile nasıl statik analiz yapabileceğimiz hakkında bilgi vermeye çalışacağım.

Statik Analiz

Statik analiz, kodu derlemeden (yani pre-compile) tespit edilebilecek hataları tespit ederek bunları düzeltmemize olanak tanır. Bu sayede oluşabilecek bug’ları erken dönemde tespit etmeye ve tanımlanmamış davranışları ve tehlikeli kod yapılarını (undefined behaviour ve dangerouscoding constructs) tespit etmeye odaklanır. Aşağıda kullanabileceğiniz bazı statik analiz araçları yer alıyor. Biz yazının ilerleyen kısmında CppCheck ile devam edeceğiz.

CppCheck

Cppcheck, C/C ++ derleyicimizin görmediği hataları algılamaya çalışan bir (CLI) komut satırı aracıdır. Yaptığı iş aslında basit bir şekilde kodun tamamını derlemeden sadece içinde bulundurduğu bazı makrolar ve ön işlemci komutları ile kendi içerisinde bir derleme işlemi gerçekleştirmektir. Sadece belirli parametreleri incelediği için bu işlem normal derleme işlemine göre çok hızlı bir şekilde yapılmaktadır.

CppCheck kurulumu için isterseniz bu adresten kurulumu yapabilirsiniz ancak ben işlemleri Ubuntu 18.04 içerisinde terminal üzerinden gerçekleştireceğim. İlk olarak

sudo apt update
sudo apt install -y cppcheck

yazarak kurulumu yapıyoruz. Sonrasında direkt olarak CLI üzerinden kullanmaya başlayabiliriz. Örnek dosya yapısı olarak:

  • source
    • demo.cpp
    • main.cpp
  • test
    • test_demo.cpp
    • test_main.cpp
  • example
    • example1.cpp

bu yapıyı kullandığımızı varsayarak işlemlerimize başlayalım. İlk olarak basit bir analiz istiyorsak

cd source && cppcheck main.cpp

komutunu yazarak source/main.cpp dosyasının analizini gerçekleştirebiliriz. Eğer her şey doğru ise

Checking main.cpp ...
1/1 file checked 100% done

çıktısı ile tamamlanacaktır. Bu işlemi bir dosya özelinde değil de komple bir dizin altında gerçekleştirmek istiyorsanız aşağıdaki komutu kullanabilir ve çıktıyı elde edebilirsiniz.

cppcheck source
Checking source/main.cpp ...
1/2 files checked 50% done
Checking source/demo.cpp ...
2/2 files checked 100% done

Proje klasörü altında yer alan tüm klasör ve dosyaları dahil ederek kontrol işlemini tamamlamak için “.” operatörünü kullanabilirsiniz.

cppcheck .
Checking source/main.cpp ...
1/5 files checked 20% done
Checking source/demo.cpp ...
2/5 files checked 40% done
Checking test/test_main.cpp ...
3/5 files checked 60% done
Checking test/test_demo.cpp ...
4/5 files checked 80% done
Checking example/example1.cpp ...
5/5 files checked 100% done

CppCheck ile kullanabileceğiniz bazı parametreler

  • –file-filter=<str>
  • -i<path>
  • –platform
  • –std
  • –suppress
  • –inline-suppr
  • –xml
  • –enable
–file-filter=<str>

Bir dizin altındaki belirtilen filtreden geçebilen dosyalar üzerinde analiz yapmanızı sağlar. Aşağıdaki gibi bir kullanım ile test klasörü altında sadece “test” kelimesi ile başlayan dosyaların seçilmesini ve analiz edilmesini sağlayabilirsiniz.

cppcheck . --file-filter=test/test*
-i<path>

-i parametresi kullanılarak analize dahil edilmek istenmeyen klasörler belirlenebilir. -i aslında “ignore” kelimesinden gelmektedir ve dizini verilen klasörün analiz sırasında gözardı edilmesini sağlar. Aşağıdaki örnekte “test” klasörünü analiz etmeyecektir.

cppcheck . -itest
–platform=<type>

İşletim sistemlerinin ve işlemcilerin bazı değişkenler için ayırdıkları hafıza boyutu birbirinden farklı olabiliyor. Bu gibi durumların önüne geçmek için standart olarak tanımlanmış değerleri kullanmak için –platform parametresi ile Unix veya Windows seçimi yapabilir veya kendi konfigurasyon dosyanızı tanımlayabilirsiniz.

–std=<version>

Bir C / C ++ standardı belirtmek için kullanılabilir, varsayalılan olarak c++20 ile geliyor ancak farklı versiyonlarda kullanılmak istenirse bu parametre girilebilir. Kullanılabilecek parametreler: c89, c99, c11, c++03, c++11, c++14, c++17, c++20 (varsayılan)

–suppress=<spec>

Özellikle göz ardı edilecek bir özellik varsa onu belirtmeye yarar. Örnek olarak “missingIncludeSystem” parametresi veya “memleak” parametresi kullanılabilir. Bu sayede bulunamayan sistem dosyaları veya memory leak’ler dahil edilmemiş olur.

–inline-suppr

Kod içerisinde yorum satırı olarak özellikle belirtilen yerler varsa onların da dahil edilerek kontrolden geçmesini sağlayan bir parametredir.

–xml=<output>

Statik analiz işlemi tamamlandıktan sonra oluşan sonucun xml formatında dışarı çıkartılabilmesini sağlar. Bu sayede çeşitli görselleştirme programlarını kullanarak çıktınızı görsel halde sunabilirsiniz.

–enable=<id>

CppCheck içerisinde birçok farklı parametreye göre kontrol yapma seçeneği vardır. Style, Performance vb. farklı parametreleri kontrol etmek istiyorsanız parametre olarak girmeniz gerekmektedir ancak en çok tercih edilen yöntem “all” parametresidir. Bu sayede tüm olası durumları kontrol edilebilir.

Parametrelerden de basitçe bahsetmeye çalıştım. Daha detaylı bilgi için CppCheck’in dokümantasyon sayfasını inceleyebilirsiniz.

CppCheck ile kodlarımız içerisinde statik analiz yaparak derleme öncesi kontrolden geçirmiş olduk. Bu sayede oluşabilecek hataların önüne geçmeye çalışabiliriz.

Author

Genel dünya problemleri ile çok ilgili olmasa da teknolojik gelişmeleri yakından takip eden, sistemleri geliştirmek için çalışmalar yapan, bolca kod yazmaya çalışan ve öğrendiklerini paylaşmaya çalışan birisi.

Write A Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogcu bunu beğendi: