çağırır, ben böyle kaynak kodunu buldum Aynı modelle üç kez çağrıldı (burada "::").otomatik özdeş ardıl std algılamak :: dize bulmak ::() bir kod inceleme sırasında
Bu kod elbette
bulmak sadece bir kez denirvoid f(std::string &className, std::string &testName)
{
const size_t endOfClassNamePos = className.find("::");
if (endOfClassNamePos != std::string::npos)
{
testName = className.substr(endOfClassNamePos + 2);
(void)className.erase(endOfClassNamePos, std::string::npos);
}
}
refactored edilebilir.
Soru
herkes böyle böyle bir modelin belirlenmesi için bir strateji biliyor mu? Bu deseni tespit etmek istediğim büyük bir kod tabanı yaşıyorum. Bir Windows veya Linux ortamı kullanmayı planlıyorum.
Potansiyel Stratejiler
- Kullanım/tuhaflıklar bu tür algılamaya cppcheck gibi bir statik kod analiz aracı uyarlar.
- Düzenli ifade ile kod tabanında arama yapın.
- Bu desenin algılanması için clang-tidy kullanın/uyarlayın.
- Bazı sorunları (ör. Python) bu sorunları algılayan bir özel denetleyici yazın. Bu durumda, kontrol önceden işlenmiş kod üzerinde yapılmalıdır.
Devam Etme en
- Manuel inceleme
Güncelleme 1
Ben potansiyel strateji 1) ile başlamaya karar verdik. Bu sorunu yakalamak için cppeck'leri uyarlamayı planlıyorum.
Cppcheck, PCRE düzenli ifadelerine dayanan özelleştirilmiş kurallar yazma olanağı sunar. Bunun için, cppcheck etkin PCRE desteği ile derlenmelidir. aşağıdaki gibi aracı Bundan sonra
git clone https://github.com/danmar/cppcheck.git && cd cppcheck
derlemek ve yüklemek:: Mevcut test ortamı Linux tabanlı olduğundan, aşağıdaki komutlar cppcheck en son sürümünü indirmek için kullanılabilir
sudo make install HAVE_RULES=yes
Şimdi temel araç kurulumu tamamlandı. Bir cppcheck-kuralı geliştirmek için, bu makalenin ilk bölümünde örnek koduna benzer basit bir test durumu (dosya: test.cpp) hazırladım. Bu dosya üç işlev içerir ve cppcheck-kuralı, f_odd
ve f_odd1
üzerinde ardışık std::string::find
çağrıları hakkında bir uyarı yayınlayacaktır.
testi.cpp:
Şimdiye kadar çok iyi. Şimdi cppcheck, birbirini izleyen std::string::find
çağrılarını yakalamak için ayarlanmalıdır. Bunun için ben ardışık özdeş std::string::find
çağrıları eşleşen bir düzenli ifade içeren bir cppcheck_rule-file yarattık:
<?xml version="1.0"?>
<rule>
<tokenlist>normal</tokenlist>
<pattern><![CDATA[([a-zA-Z][a-zA-Z0-9]*)(\s*\.\s*find)(\s*\(\s*\"[ -~]*\"\s*\))[ -\{\n]*(\1\2\3)+[ -z\n]]]></pattern>
<message>
<severity>style</severity>
<summary>Found identical consecutive std::string::find calls.</summary>
</message>
Bu dosya
yeni çek konusunda cppcheck uzatmak için kullanılabilir.cppcheck --rule-file=rules/rule.xml test/test.cpp
ve çıkış Şimdi, aynı ardışık std::string::find
aramalar C/C++ kodları tespit edilebilir
Checking test/test.cpp...
[test/test.cpp:14]: (style) Found identical consecutive std::string::find calls.
[test/test.cpp:26]: (style) Found identical consecutive std::string::find calls.
olup: deneyin sağlar. Daha iyi/daha verimli veya daha akıllı bir çözüm bilen var mı?
Referanslar:
Bunu tespit etmek için kendi [clang-tidy] (http://clang.llvm.org/extra/clang-tidy/) kontrolünü yazabilirsiniz. – Jonas
@Jonas Teşekkür ederim clang-tidy, işi yapabilecek başka bir potentia aracıdır. Potansiyel çözümler bölümünü güncelleyeceğim. – orbitcowboy
Sorunuzu, araç önerileri için bir istek gibi görünmeyecek şekilde yeniden ifade edebilir misiniz? Bunlar, bu sitede [açıkça konu dışı] (https://stackoverflow.com/help/on-topic). – 5gon12eder