Mevcut Araçları Kullanma

Bu araçları çalıştıracak otomatize edilmiş çatı, geliştirme sürecenin başlangıç safhasında kurulmalı. Kaynak kod geçişi, build etme ve testleri çalıştırma 2-3 komuttan fazla olmamalıdır. Testler tamamlandığında, kodun kalitesi ve durumu büyük ölçüde görülebilmeli.

Kaynak Kontrol

Kaynak kontrol, yazılım geliştirme projelerinle olmazsa olmaz. Eğer henüz kullanmıyorsan, birini kullanmaya başlamalısın.

  • GitHub - sınırsız public repo'ya izin veriyor, private repo paralı.
  • Bitbucket - 5 kişiye kadar ortak çalışılabilen sınırsız private repo'ya izin veriyor, ücretsiz.
  • SourceForge - Yalınzca open source hosting.
  • GitLab - sınırsız public ve private repo'ya izin veriyor, sınırsız CI koşucusu var, ücretsiz.
  • Visual Studio Online (http://www.visualstudio.com/what-is-visual-studio-online-vs) - sınırsız public repo'ya izin veriyor, private repo paralı. Reposlar git veya TFVC olabilir. Ayrıca: Issue tracking, proje planlama (çoklu Agile şablonları, SCRUM gibi) entegre build'ler, Microsoft Visual Studio tam integre. Yalnızca Windows.

Build Araçları

Endüstride standard olmuş ve büyük ölçüde kabul görmüş bir build aracı kullan. Bu seni, yeni bir kütüphane keşfettiğinde / bir kütüphane eklemek istediğinde / ürününü paketlemek istediğinde vb. durumlarda tekerleği yeniden icat etmeni önler.

Unutma, bu sadece bir build aracı değil, bir programlama dili. Build script'lerini temiz ve iyi tut ve kullandığın araç için tavsiye edilen uygulamaları takip et.

Paket Yöneticisi

Paket yönetimi C++'ta önemli bir konu, şu anda açık ara kazanan bir build aracı yok. Paket yöneticisi kullanımının bağımlılıkların takibini ve projene katkı yapacak insanların işini kolaylaştıracağını unutma.

  • Conan - C++ için crossplatform bağımlılık yöneticisi
  • hunter - C/C++ için CMake güdümlü çapraz-platform paket yöneticisi
  • C++ Archive Network (CPPAN) - C++ için çapraz-platform bağımlılık yöneticisi
  • qpm - Qt paket yöneticisi
  • build2 - cargo-benzeri paket yöneticisi
  • Buckaroo - C/C++ ve diğer bazı diller için çapraz platform dağınık bağımlılık yöneticisi
  • Vcpkg - Windows, Linux ve MacOS için Microsoft C++ Kütüphane Yöneticisi - açıklama

Sürekli Entegrasyon

Build aracını belirledikten sonra, sürekli entegrasyon ortamını ayarla.

Sürekli Entegrasyon (CI, continuous integration) araçları, değişimler repo'ya push edildiğinde kaynak kodu otomatik olarak build eder. Bunlar private hostlarda veya CI hostlarında tutulabilir. Travis CI

  • C++ ile iyi çalışıyor
  • GitHub ile beraber kullanmak için tasarlandı
  • GitHub'taki public repolar için ücretsiz
  • Windows, MSVC ve MinGW'yi destekliyor
  • GitHub'taki public repolar için ücretsiz
  • Java Application Server için gerekli
  • Windows, OS X ve Linux'u destekliyor
  • pek çok plugin ile genişletilebilir
  • açık kaynak projeler için ücretsiz seçeneği var
  • basit ad-hoc sürekli entegrasyon, sonuçları GitHub'a gönderiyor
  • Windows, OS X ve Linux'u destekliyor
  • ChaiScript bunu kullandı
  • Visual Studio Online kaynak repo'larına sıkı şekilde entegre
  • Windows, OS X ve Linux'ta erişilebilir olan MSBuild'i(Visual Studio'nun build motoru) kullanıyor
  • Self-hosted build agent'leri sağlar ve kullanıcı tarafından sağlanan build agent'lere izin verir
  • Microsoft Visual Studio'dan izlenebilir ve kontrol edilebilir
  • Microsoft Team Foundation Server ile beraber yüklenir
  • özelleştirilmiş Docker image'leri kullanır, bu yüzden C++ için kullanılabilir
  • ücretsiz shared runner'lara sahip
  • kapsama analizinin sonuçları için basit işleme

Eğer Github'ta public-host, açık kaynak bir projeniz varsa:

  • Hemen şimdi git ve Travis CI ve AppVeyor entegrasyonunu etkinleştirin. Dönüşünü bekliyor olacağız. CMake-tabanlı C++ uygulamasının nasıl etkinleştireceğini gösteren basit bir örnek için bkz: https://github.com/ChaiScript/ChaiScript/blob/master/.travis.yml
  • aşağıda listelenen kapsama araçlarının birini etkinleştir (Codecov ya da Coveralls)
  • etkinleştir Coverity Scan

Bu araçlar ücretsiz ve kurması görece kolay. Kurduğunda sürekli build, test etme, analiz ve raporlama yapmış oluyorsun. Ücretsiz.

Derleyiciler

Mevcut tüm warning seçeneklerini kullan. Bazı warning seçenekleri yalnızca optimizasyonlar etkinleştirildinde çalışır ya da yüksek seviye bir optimizasyonla çalış, mesela -Wnull-dereference with GCC.

Platform(lar)un için olabildiğince çok derleyicici kullanmalısın. Her derleyici standardı çok az farkla implemente eder ve herbirinden desktek almak en taşınabilir, en güvenli kodun sağlanmasına yardımcı olur.

GCC / Clang

-Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic

  • -Wall -Wextra olması gereken ve standard
  • -Wshadow eğer bir değişken tanımı, daha yukarı seviyesindeki bir tanımı maskeliyorsa kullanıcıyı uyar
  • -Wnon-virtual-dtor eğer bir sınıf virtual fonksiyonlara sahipse ve non-virtual bir destructor varsa uyar. Bu yakalanması zor hafıza hatalarını bulmamızı kolaylaştırır.
  • -Wold-style-cast C-stili cast'larda uyar
  • -Wcast-align cast'larda potansiyel performans probleminde uyar
  • -Wunused kullanılmayan birşey olduğunda uyar
  • -Woverloaded-virtual bir virtual fonksiyonu overload (override değil) ettiğinde uyar
  • -Wpedantic (GCC'nin tüm versiyonları, Clang >= 3.2) standard olmayan (non-standard) C++ kullanıldığında uyar
  • -Wconversion tip dönüşümünde veri kaybı oluşabilecekse uyar
  • -Wsign-conversion işaret dönüşümünde uyar
  • -Wmisleading-indentation girintiler(indent) blokları ifade ediyorsa ve girintinin ifade edeceği blok yoksa uyar
  • -Wduplicated-cond if / else zinciri aynı şartı kontrol ediyorsa uyar
  • -Wduplicated-branches if / else dallanmaları aynı koda sahipse uyar
  • -Wlogical-op mantıksal ifadeleri kullanıldığı ama bitwise ifadelerinin kullanılmak istenebileceği yerlerde uyar
  • -Wnull-dereference null referans algılandığında uyar
  • -Wuseless-cast aynı tipe cast yapıldığında uyar
  • -Wdouble-promotion float implicit olarak double olmuşsa uyar
  • -Wformat=2 formatlı output yapan fonksiyonlar arasında güvenlik problemi olan varsa uyar (printf gibi)
  • -Wlifetime (şu anda yalnızca clang) nesne yaşam süresi sorunlarını gösterir

Clang'da -Weverything kullanmayı ve bazı uyarıları disable etmeyi dene

-Weffc++ uyarı modu fazla gürültülü olabiir, ama projen için faydalıysa onu da kullan.

MSVC

/permissive- - Enforces standards conformance.

/W4 /W14640 - bunları kullan ve aşağıdakileri kullanmayı düşün (açıklama aşağıda)

  • /W4 Tüm makul uyarılar
  • /w14242 'değişken': 'tip1'den 'tip1'e dönüştürürken olası veri kayıplarında
  • /w14254 'operatör': 'type1:field_bits'den 'type2:field_bits'e dönüştürürken olası veri kayıplarında
  • /w14263 'fonksiyon': üye fonksiyon ana sınıftaki hiçbir virtual üye fonksiyonu override etmediğinde
  • /w14265 'sınıfadı': sınıf üye fonksiyonlara sahip ama destructor virtual değil, bu sınıfın örnekleri düzgün biçimde destruct edilmeyebilir
  • /w14287 'operatör': unsigned/negatif sabit uyumsuzluğu:
  • /we4289 standard olmayan (nonstandard) bir uzantı kullanıldı: 'değişken': for döngüsünda kullanılan döngü kontrol değişkeni, for döngüsünün scopu'unun dışında kullanıldı
  • /w14296 'operatör': ifade her zaman bir 'boolean_value'
  • /w14311 'değişken': 'tip1'den 'tip2'ye pointer yuvarlama (truncation)
  • /w14545 virgülden önceki ifade argüman listesi tam olmayan bir ifadeyi çalıştırdığında
  • /w14546 virgülden önceki fonksiyon çağrısının argüman listesi eksik olduğunda
  • /w14547 'operator': virgülden önceki operatörün bir etkisi yok; yan etkisi olan argüman bekleniyordu
  • /w14549 'operator': virgülden önceki operratörün bir etkisi yok; bir 'operator' mü yapmak istedin?
  • /w14555 ifadenin bir etkisi yok; yan etkisi olan bir ifade bekleniyordu
  • /w14619 pragma warning: 'number' numaralı uyarı yok
  • /w14640 thread güvenli olmayan statick üye atamalarında uyarıyı etkinleştir
  • /w14826 'tip1'den 'tip2'ye dönüşüm işaret uzatmalı. Bu öngörülemeyen çalışma zamanı davranışına neden olabilir
  • /w14905 wide string literal cast to 'LPSTR'
  • /w14905 'LPSTR'ye genişletilmiş string cast'ı
  • /w14906 'LPSTR'ye string cast'ı
  • /w14928 illegal copy-initialization; more than one user-defined conversion has been implicitly applied
  • /w14928 illegal kopyalama ataması; birden fazla kullanıcı tanımlı dönüşüm implicit olarak uygulandı

Önerilmez

  • /Wall - Standard kütüphaneden eklenen dosyalarda da uyarı üretir ve kullanışlı olmayan fazladan uyarılar gösterir.

Genel

Baştan sıkı uyarı ayarlarıyla başla. Sonradan uyarı seviyesini artırmak acı verici olabilir.

uyarıları hata olarak algıla ayarlarını kullanmayı dene. MSVC'de /Wx, GCC / Clang'ta -Werror

LLVM-tabanlı araçlar

LLVM tabanlı araçlar en iyi derleme komutu veritabanını çıktı olarak veren build sistemleri (cmake gibi) ile çalışır, örneğin:

$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

Eğer böyle bir build sistemi kullanmıyorsan Build EAR kullanmayı deneyebilirsin, build sistemine bakacak ve derleme komutu veritabanı üretecektir.

CMake normal derleme sırasında clang-tidy çağırmayı build-in olarak destekliyor

Statik Analizörler

Statik analizörün yaptığı en iyi şey otomatize build sisteminin bir parçası olarak çalışabilmesidir. Cppcheck ve clang bu ihtiyaçları ücretsiz olarak karşılayan seçenekler.

Coverity Scan

Coverity her commit'te Travis CI ve AppVeyor ile entegre çalışabilen, ücretsiz (açık kaynak için) statik analiz araç kiti.

PVS-Studio

PVS-Studio C, C++ ve C# dillerinde yazılmış programların kaynak kodunda bug tespiti için bir araç. Kişisel akademik projeler, açık kaynaklı ticari olmayan projeler ve bireysel developerların bağımsız projeleri için ücretsiz. Windows ve Linux ortamlarında çalışıyor.

Cppcheck

Cppcheck özgür ve açık kaynak. 0 hata için gayretlidir ve iyi bir iş çıkarır. Bu yüzden de tüm uyarılan etkinleştirilmelidir: --enable=all

Notlar:

  • Düzgün çalışması için iyi ayarlanmış header path'leri gerektirir, bu yüzden kullanmadan önce --check-config geçmeyi unutma.
  • Kullanılmyan header'ları bulma -j 1'den fazla olduğunda çalışmıyor.
  • Kod çok sayıda #ifdef içeriyorsa ve hepsini kontrol etmek istiyorsan --force eklemeyi unutma.

cppclean

cppclean - Büyük kod tabanlarında, geliştirmenin yavaş olduğu C++ kaynak kodundaki hataları bulmaya odaklanan açık kaynaklı statik analizör.

CppDepend

CppDepend C/C++ kod tabanını analiz ederek, kod bağımlılıklarını görselleştirerek, tasarım kuralları tanımlayarak, etki analizi (impact analysis) yaparak ve kodun farklı versiyonlarını karşılaştırark sadeleştirir.

Clang'ın Statik Analizörü

Clang'ın analizörünün default ayarları kullanıldığı platformda iyidir. Doğrudan CMake ile kullanılabilir. LLVM-tabanlı Araçlarda clang-check ve clang-tidy üzerinden de çağrılabilir.

Ayrıca, CodeChecker clang'ın statik analizi için bir ön-yüz olarak erişilebilir.

clang-tidy, Visual Studio'da Clang Power Tools uzantısıyla kolayca kullanılabilir.

MSVC'nin Statik Analizörü

/analyze komut satırı seçeneği ile etkinleştirilebilir. Şimdilik default ayarlarla idare edeceğiz.

Flint / Flint++

Flint ve Flint++ Facebook'un kodlama standardına göre analiz yapan araçlar.

OCLint

OCLint C++ kodunun kalitesini pek çok yönden artırmaya çalışan, ücretsiz, özgür ve açık kaynaklı bir statik kod analiz aracı.

ReSharper C++ / CLion

İki araç da JetBrainsden, belli seviyede statik analiz ve sık ortaya çıkan şeyler için otomatik düzelme seçenekleri sunuyor. Açık kaynak projesi liderleri için ücretsiz lisans seçenekleri var.

Cevelop

Eclipse tabanlı Cevelop IDE çeşitli statik analiz ve refactoring / kod onarma araçları sunuyor. Mesela, macro'ları C++ constexpr ile yerdeğiştirebilir, namespace'leri (inline using/ayıklama,) refactör edebilir, ve kodunu C++11'in uniform atama sözdizimine refaktör edebilirsin. Cevelop ücretsiz.

Qt Creator

Qt Creator clang statik analizörünü eklenti olarak kullanabilir.

clazy

clazy, Qt kullanımı için clang tabanlı bir analiz aracı.

IKOS

IKOS NASA tarafından geliştirilmiş bir açık kaynak statik analizörü. Soyut Yorumlama (Abstract Interpretation)'yı temel alıyor. C++ ile yazıldı ve LLVM kullanarak C ve C++ için analiz sağlıyor. Kaynak kodu Github üzerinden erişilebilir.

Çalışma Zamanı Kontrolcüleri (Runtime Checkers)

Kod Kapsama Analizi

Bir kapsama aracı tüm uygulamanın test edildiğinden emin olmak için testler yapılırken çalışabilir. Maalesef, kapsama analizi derleyici optimizasyonunun kapatılmasını gerektirir.

  • Codecov
    • Travis CI ve AppVeyor ile entegre olabilir
    • açık kaynak projeler için ücretsiz
  • Coveralls
    • Travis CI ve AppVeyor ile entegre olabilir
    • açık kaynak projeler için ücretsiz
  • LCOV
    • son derece ayarlanabilir
  • Gcovr
  • kcov
    • codecov ve coveralls entgre olabilir
    • yalnızca debug sembollerini kullanarak, özel derleyici flag'lerine ihtiyaç duymaksızın kod kapsama yapabilir.
  • OpenCppCoverage - Windows için açık kaynak kapsama raporlama aracı

Valgrind

Valgrind hafıza akıntısını, yarış durumlarını ve diğer bağlantılı sorunları algılayan bir çalışma vakti kod analizcisidir. Çeşitli Unix platformlarınca desteklenir.

Dr Memory

Valgrind benzeri. http://www.drmemory.org

GCC / Clang Sanitizers

Bu araçlar Valgrind'deki pek çok özelliği sağlar ama derleyici ile birlikte gelir. Kullanımı kolaydır ve birşeyler yolunda gitmediğinde rapor eder.

  • AddressSanitizer
  • MemorySanitizer
  • ThreadSanitizer
  • UndefinedBehaviorSanitizer

Mevcut sanitizer seçeneklerinin farkında olmak faydalıdır, çalışma zamanı seçenekleri de dahil. https://kristerw.blogspot.com/2018/06/useful-gcc-address-sanitizer-checks-not.html

Fuzzy Analyzers (Bulanık Analizciler)

Eğer projen kullanıcı tanımlı input giriyorsa, bir fuzzy input tester çalıştırmayı düşünebilirsin.

Bu araçların her ikisi de, yeni kod yürütme yollarını bulmak için kapsam raporlamasını kullanır ve kodunuz için yeni girdiler üretmeye çalışır. Bu araçlar çökmeleri, takılmaları ve farkında olmadığın halde geçerli olarak kabul edilen input'ları bulur.

Mutasyon Testçileri

Bu araçlar unit test koşarken çalışan kodu alır ve çalışan kodu mutate eder. Eğer mutate edilmiş kod testi geçmeye devam ediyor ise, muhtemelen testinde bir kusur vardır.

Control Flow Guard (Kontrol Akışı Kalkanı)

MSVC'nin Control Flow Guard aracı, yüksek performanslı çalışma zamanı güvenlik kontrolü ekler

Kontrol Edilmiş STL Implementasyonları

Heap Profilleme

Uyarıları Göz Ardı Etme

Derleyici veya analizörün yanlış ya da kaçınılmaz olan bir şey hakkında uyarıda bulunduğu takım konsensüsüyle belirlenirse, ekip, belirli hatayı mümkün olduğunca kodun yerelleştirilmiş kısmı olarak devre dışı bırakır.

Kodu bir bölümü için devre dışı bıraktıktan sonra uyarıyı yeniden etkinleştirdiğinizden emin olun. Engellenmiş uyarılarınızın diğer kodlara sızmasını istemezsiniz.

Test Etme

CMake, yukarıda bahsedildi, testleri çalıştırmak için yerleşik bir çatıya (framework'e) sahip. Kullandığınız build sisteminin yerleşik testleri çalıştırma özelliğine sahip olduğunda emin olun.

Testleri çalışmayı kolaylaştırmak için ve organize etmenize yardımcı olması için Google Test, Catch, CppUTest or Boost.Test gibi kütüphaneleri düşünebilirsin.

Unit Testler

Unit test fonksiyonları bağımsız olarak test etmede kullanılan küçük kod parçalarıdır.

Entegrasyon Testleri

Her bir feature ve bug için bir test olmalıdır. Ayrıca bknz Kod Kapsama Analizi. Bunlar unit testten daha yüksek seviyeli testlerdir. Entegrasyon testleri, kapsam dahilinde belirli özelliklerle sınırlı kalmalıdır.

Negatif Test Etme

Hata yakalama yöntemini de test ettiğinden ve düzgün çalıştığından emin ol. Eğer %100 kod kapsamayı hedefliyorsan bu daha belirgin olacaktır.

Debug Etme

uftrace

uftrace can be used to generating function call graphs of a program execution uftrace fonksiyon çağrı grafikleri oluşturmada kullanılabilir.

rr

rr, C++'ı destekleyen ücretsiz (açık kaynak) reverse debugger.

Diğer Araçlar

Lizard

Lizard C++ kod tabanında karmaşıklık analizi çalıştırmak için çok basit bir arayüz sağlar.

Metrix++

Metrix++ kodun en karmaşık bölümlerini algılayıp raporlayabilir. Kodun karmaşıklığını azaltmak senin ve derleyicinin kodu daha iyi anlamasına ve optimize etmesine yardımcı olur.

ABI Uyumluluk Denetleyicisi

ABI Uyumluluk Kontrolcüsü (ACC ,ABI Compliance Checker) iki kütüphane versiyonunu analiz edip, o API ve C++ ABI değişimleri üzerine detaylı bir uyumluluk raporu üretebilir. Bu kütüphane geliştiricisine geriye dönük uyumluluğun istemeden kırılmadığını anlamasına yardımcı olur.

CNCC

Customizable Naming Convention Checker belli isimlendirme kriterlerine uymayan değişken adlarını saptamaya yardımcı olur.

ClangFormat

ClangFormat topluluğun belirlediği kod formatına uyması için kontrol ve düzeltme sağlar. clang-format'ın yapılandırlması üzerine bir dizi makale.

SourceMeter

SourceMeter ücretsiz versiyonu çok sayıda metrik sunar ve cppchek ile kullanılabilir.

Bloaty McBloatface

Bloaty McBloatface unix-like platformlar için binary boyu analizör/profiler'i

results matching ""

    No results matching ""