Soru:
Kaynak koddan fonksiyon tanımlarını çıkarma
Dominik H
2015-12-12 18:11:17 UTC
view on stackexchange narkive permalink

Çok sayıda kaynak dosya (* .cpp, * .c, * .h, * .hpp vb.) içeren büyük bir çalışma alanım var ve üzerinde bazı otomatik analizler yapmak istiyorum.

Bana bir test sırasında çalıştırılan kod satırlarını söyleyen cobertura formatını kullanan bir kapsama analizim zaten var, ancak şimdi işlev düzeyinde bir Analiz yapmak istiyorum, bu nedenle yürütülen satırları eşlemeliyim.

İşlevlerin listesini kendi kendime uygulamaya çalıştım, ancak tüm farklı işlev türlerini (satır içi, sanallar, de- / yapıcılar, yapı kurucuları vb.) bulmak son derece karmaşık

Öyleyse, kod satırı analizini onunla eşleştirebilmem için belirli bir kaynak dosyada yer alan işlevlerin bir listesini oluşturmak için kullanılabilecek bir araç bilen var mı?

Çok teşekkürler

Alternatif olarak, size bu haritayı doğrudan sağlayan bir kapsam aracı da edinebilirsiniz.
Iki yanıtlar:
Ira Baxter
2016-01-09 17:32:54 UTC
view on stackexchange narkive permalink

C ++ 14 ön ucuna sahip DMS Yazılım Yeniden Yapılandırma Araç Setimiz bunu yapmak için kullanılabilir.

DMS genel amaçlı bir programdır derleyici teknolojisine dayalı analiz ve dönüştürme aracı. Kaynak konum bilgisi, sembol tabloları ve kontrol akış grafikleriyle damgalanmış AST'ler gibi veri yapılarını derlemek için kullandığı ön uca dayalı olarak kaynak kodunu ayrıştırır. Bu derleyici veri yapıları üzerindeki eylemleri belirtmek için çeşitli kitaplıklar ve DSL'ler sağlar; bunlara yürüme AST'leri, yüzey sözdizimi kalıplarını kullanarak AST'lere göre model eşleştirme, AST'leri değiştirme ve son olarak herhangi bir değiştirilmiş kodu yorumlarla derlenebilir kaynak formuna geri yazdırma gibi.

OP'nin görevini yerine getirmek için, DMS, ilgilenilen dosyalar için AST'ler oluşturmak üzere kaynak kodunu "sadece" ayrıştıracak (bu görev için ad çözümlemesini ve akış analizini atlayabilirsiniz). Ardından satır numaralarını kullanarak, satır numaralarıyla eşleşen düğümleri aramak için AST'yi gezebilir, düğüme karşılık gelen işlev alt ağacını seçebilir ve tüm işlev tanımını görmek için yalnızca bu alt ağaçları önceden yazdırabilir veya yalnızca işlev imzasını önceden yazdırabilirsiniz. Voila.

Alternatif bir yaklaşım dosyaları ayrıştırır ve ardından ad çözümleme yapar. Sembol tablosunu geçmek kolaydır ve işlevin AST'sine yapılan referanslar sayesinde işlev imzasına ve konuma erişim sağlar.

Her iki durumda da, yalnızca işlev adlarını / imzaları / gövdeleri yazdırmak yerine kullanılabilir Tercih edilen statik analizleri uygulamak için DMS.

DMS, on yıldan fazla bir süredir büyük C ++ kod tabanlarını analiz etmek ve dönüştürmek için kullanılmaktadır.

Yazar benim, yani yapma bunu bir öneri olarak kabul edin. Bir çözüm olarak varlığını belgeliyorum.

Steve Barnes
2016-02-08 23:55:24 UTC
view on stackexchange narkive permalink

İlk seçenek, doxygen gibi bir kod dokümantasyonu oluşturma aracı kullanmak olabilir. Belgelenmemiş işlevleri içermesini söylerseniz, size hangi işlevlerin hangi dosyalarda olduğu gibi değerli taşlar ve ayrıca arama ve arayan haritaları verebilir.

Doxygen Özellikleri:

  • Ücretsiz
  • Çapraz Platform OS-X, Linux & Windows
  • Çok sayıda diyagram oluşturma seçeneği
  • C ++, C, Objective-C, C #, PHP, Java, Python, IDL (Corba, Microsoft ve UNO / OpenOffice tatları), Fortran, VHDL, Tcl ve bir dereceye kadar D
  • Kodunuzu HTML, Lateks, RTF, PostScrript, PDF, Compressed HTML or man.

Kodunuzun karmaşıklığını izleyebilen ve hangi işlevlerin hangi dosyalarda bulunduğunun bir listesini veren SourceMonitor da kullanıyorum.

SourceMonitor özellikleri:

  • Ücretsiz
  • Yalnızca Windows - XP ..
  • Ölçümleri hızlı, tek geçişte toplar kaynak dosyaları.
  • C ++, C, C #, VB.NET, Java, Delphi, Visual Basic (VB6) veya HTML ile yazılmış kaynak kod metriklerini ölçer.
  • Beni içerir C ++, C, C #, VB.NET, Java ve Delphi için thod ve işlev düzeyi ölçümleri.
  • XML veya CSV olarak dışa aktarın.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...