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.
- CMake
- Faydalı: https://github.com/sakra/cotire/ build performansı için
- Faydalı: https://github.com/toeb/cmakepp geliştirilmiş kullanılabilirlik için
- Faydalı: https://cmake.org/cmake/help/v3.6/command/target_compile_features.html C++ standard flag'leri için
- Faydalı: https://github.com/cheshirekow/cmake_format CMakeLists.txt dosyasını otomatik formatlamak(stil) için.
- Faydalı Ek Okuma CMake'e özel en iyi uygulamalar
cmake --build
projeni platformdan bağımsız olarak derleme için ortak arayüz sağlar
- Waf
- FASTBuild
- Ninja - büyük projelerde artırımlı build zamanını müthiş şekilde azaltabilir. CMake target'ı için kullanılabilir.
- Bazel - Not: Yalnızca MacOS ve Linux.
- gyp - Google'ın chromium için build aracı.
- maiken - Maven-esque konfigrasyon tarzında çapraz-platform build aracı.
- Qt Build Suite - Qt'nin crossplatform build aracı.
- meson - Açık kaynaklı build sistemi, inanılmaz hızlı, daha önemlisi mümkün olduğunca kullanıcı dostu.
- premake
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 olarakdouble
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.
- american fuzzy lop
- LibFuzzer
- KLEE - fuzz bireysel fonksiyonları kullanılabilir
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ı
_GLIBCXX_DEBUG
ile GCC'nin libstdc++ implementasyonu. Bknz Krister'ın makalesi.
Heap Profilleme
- https://epfl-vlsc.github.io/memoro/ - Detaylı heap profilcisi
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