Alat analisis statis C ++ open source apa yang tersedia? [Tutup]


301

Java memiliki beberapa alat analisis statis open source yang sangat baik seperti FindBugs , Checkstyle dan PMD . Alat-alat itu mudah digunakan, sangat membantu, berjalan pada banyak sistem operasi dan gratis .

Produk analisis statis C ++ komersial tersedia. Meskipun memiliki produk seperti itu bagus, biayanya terlalu banyak untuk siswa dan biasanya agak sulit untuk mendapatkan versi percobaan.

Alternatifnya adalah menemukan alat analisis statis C ++ open source yang akan berjalan pada banyak platform (Windows dan Unix). Dengan menggunakan alat open source, itu dapat dimodifikasi agar sesuai dengan kebutuhan tertentu. Menemukan alat bukanlah tugas yang mudah.

Di bawah ini adalah daftar pendek alat analisis statis C ++ yang ditemukan atau disarankan oleh orang lain.

Apa adalah beberapa lainnya portabel open source C ++ alat analisis statis yang ada yang tahu dari dan dapat direkomendasikan?

Beberapa tautan terkait.


Komersial, DMS Software Reengineering Toolki, menangani Java, C, C ++, dan COBOL, menyediakan parsing, bangunan AST, resolusi nama / tipe, analisis aliran / data aliran, analisis dan transformasi kustom. Lihat semanticdesigns.com/Products/DMS/DMSToolkit.html .
Ira Baxter

1
Untuk alat komersial ada juga CppDepend ( cppdepend.com ), dan mungkin versi uji coba mungkin cukup untuk siswa.

Jawaban:


21

Oink adalah alat yang dibangun di atas front-end Elsa C ++. Babi Mozilla adalah garpu dari Elsa / Oink.

Lihat: http://danielwilkerson.com/oink/index.html


1
Saya telah menyusun 1000+ program dalam hidup saya, tetapi demi kasih Tuhan saya tidak dapat mengkompilasi paket ini, apa pun yang terjadi. Saya mencoba menggunakan Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - tetapi tidak. Sesuatu selalu hilang dan dokumentasinya sangat buruk. Jangan salah paham, saya rasa alat ini luar biasa. Tetapi situs web dan dokumentasi sepertinya tidak ada yang menyentuh mereka dalam 10-15 tahun.
Apache

73

CppCheck adalah open source dan cross-platform.

Mac OSX:

brew install cppcheck

1
@gio Saya belum melihat masalah apa pun secara pribadi. Saya percaya CppCheck memiliki kemampuan untuk mengabaikan atau mengecualikan jalur atau file tertentu, yang membantu mempersempit ruang lingkup.
Soo Wei Tan

1
Di Windows:choco install cppcheck
KindDragon

53

Mengenai kompiler GNU, gcc sudah memiliki opsi builtin yang memungkinkan peringatan tambahan bagi mereka -Dinding. Opsinya adalah -Weffc ++ dan ini tentang pelanggaran beberapa pedoman Scott Meyers yang diterbitkan dalam buku-bukunya " C ++ Efektif dan Lebih Efektif ".

Khususnya opsi mendeteksi item berikut:

  • Tetapkan konstruktor salin dan operator penugasan untuk kelas dengan memori yang dialokasikan secara dinamis.
  • Lebih suka inisialisasi daripada penugasan dalam konstruktor.
  • Jadikan destructor virtual di kelas dasar.
  • Minta "operator =" mengembalikan referensi ke * ini.
  • Jangan mencoba mengembalikan referensi ketika Anda harus mengembalikan objek.
  • Bedakan antara operator increment dan decrement dengan bentuk awalan dan postfix.
  • Jangan pernah membebani "&&", "||", atau ",".

7
Selain gcc -Wall dan -Weffc ++, -Wextra melakukan beberapa analisis statis bebas yang baik, misalnya cabang yang tidak mengembalikan nilai, atau memeriksa tanda unsigned karena kurang dari nol. Ini luar biasa seberapa sering programmer profesional pikir yang terakhir adalah ide yang baik ...
flash Sheridan

24
Yuck, -Weffc++memperingatkan tentang ton konstruksi yang baik-baik saja dalam basis kode besar. Namun, saya mendukung saran -Wextra; jangan tinggalkan rumah tanpanya!
Tom

29

Dalam pengembangan untuk saat ini, tetapi dentang melakukan analisis C dan ditargetkan untuk menangani C ++ seiring waktu. Itu bagian dari proyek LLVM .

Pembaruan : Sementara halaman arahan mengatakan "Penganalisis adalah pekerjaan yang sedang berlangsung", namun sekarang didokumentasikan sebagai penganalisa statis untuk C dan C ++.

Pertanyaan: Bagaimana saya bisa menjalankan GCC / Dentang untuk analisis statis? (hanya peringatan)

Opsi kompiler: -fsyntax-only


1
LLVM adalah proyek yang sangat menarik yang dibandingkan dengan gcc, menghasilkan lebih banyak binari yang dioptimalkan dalam waktu yang lebih singkat; dan dentang, ketika selesai, akan menjadi ujung depan ...
Nicola Bonelli

Editor lain menambahkan informasi pada saklar -fsyntax-only. Perhatikan bahwa pada dasarnya permintaan untuk menjalankan analisis yang akan dijalankan oleh kompiler tanpa benar-benar mengkompilasi, dan memancarkan peringatan. Saya tidak yakin, tapi saya pikir itu berbeda dari analisis statis.
Don Wakefield

17

Orang lain menyebutkan -Weffc ++, tapi itu sebenarnya satu-satunya peringatan GCC yang tidak saya nyalakan secara default. Namun, rangkaian peringatan yang saya nyalakan adalah alat analisis statis paling penting dalam kit saya. Anda dapat melihat daftar lengkap peringatan yang direkomendasikan .

Singkatnya:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimisasi -Wformat = 2 -Winit-sendiri -Wlogical-op -Wmissing-deklarasi -Wmissing-termasuk-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-tidak digunakan

Perhatikan bahwa beberapa di antaranya memerlukan versi gcc baru, jadi Anda mungkin perlu menghilangkannya dari daftar jika Anda terjebak pada 4,5 atau sesuatu.



7

Jika dengan Open Source, Anda benar-benar berarti "gratis", maka analisis cepat Microsoft adalah bagus. Khusus Windows saja. Ini sepenuhnya terintegrasi dalam Visual Studio & kompiler. misalnya:

cl /analyze Sample.cpp

Versi & edisi mana ini tersedia?
twk

Tampaknya dibangun ke dalam kompiler, yang gratis. Integrasi ini mungkin hanya edisi Tim.
JBRWilkinson


4

Belat tampaknya mengisi tagihan untuk C.

Jika Anda tidak menentukan open source saya akan mengatakan Gimpel Software 's PCLint mungkin salah satu alat terbaik yang tersedia untuk statis memeriksa kode dalam C ++. Tapi, tentu saja, itu bukan open source.

Mac OSX:

brew install splint

2
Tapi mahal untuk pengembang tunggal :) Saya suka gratis lebih baik
Robert Gould

6
belat untuk C, bukan C ++. Saya tidak tahu apakah mereka berencana untuk memperluas cakupan atau tidak. Semoga saja!
Harold Bamford

Ya, pclint patut dicoba, itu counter-part di unix disebut flexe-lint, versi 9.0 harus lebih cepat dari versi 8.x, versi 9.0 juga mendukung header yang dikompilasi sebelumnya untuk mempercepat analisis. Butuh waktu bagi Anda untuk menjinakkan pc-lint, ia memiliki false-positive yang dapat membawa Anda ke masalah jika Anda tidak bisa mengabaikannya secara selektif.
zhaorufei

3

PREFast Microsoft juga tersedia di Kit Driver Windows. Versi 7.0 dapat diunduh di sini .

Dokumen Microsoft menyatakan bahwa itu hanya boleh dijalankan terhadap kode driver tetapi posting blog ini (lama) menjabarkan langkah-langkah untuk menjalankannya. Mungkin bisa diintegrasikan ke dalam proses pembangunan normal?


PREFast akan banyak memperlambat proses build Anda, untuk proyek nyata apa pun, server build Anda mungkin tidak mampu membelinya.
zhaorufei

@zhaorufei: Kebanyakan analisis statis tidak "cepat"; mereka memiliki tugas analisis kode yang cukup rumit untuk dilakukan, menurut definisi. Jika Anda tidak suka biaya build sepanjang waktu, cukup buat opsional.
Ira Baxter

2

Kami sedang mengerjakan plug-in Eclipse CDT yang disebut metriculator. Ini masih dalam pengembangan tetapi beberapa metrik utama (misalnya LSLOC, McCabe, EfferentCoupling) sudah diterapkan.

Lihat http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation untuk detail lebih lanjut seperti demonstrasi dan dokumentasi video.

Bangunan malam terbaru tersedia untuk instalasi melalui situs pembaruan di: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Keterangan Lebih Lanjut

Metrikulator secara statis menganalisis kode sumber C ++ dan menghasilkan metrik perangkat lunak. Metrik diimplementasikan sebagai catur Codan. Hasil analisis dapat dieksplorasi dalam tampilan terpisah. Setiap metrik memiliki properti yang dapat dikonfigurasi (misalnya ambang untuk 'baris maksimum kode per fungsi'). Melampaui ambang ini akan melaporkan masalah dan membuat penanda di editor kode sumber.

dengan metrikulator Anda dapat:

  • menganalisis file C / folder / proyek
  • menentukan ambang metrik dan mengaktifkan / menonaktifkan metrik menggunakan halaman preferensi Codans
  • memiliki penanda masalah dalam editor kode sumber
  • jelajahi hasil metrik
  • ekspor hasil metrik sebagai tag cloud (tersedia sebagai fitur opsional melalui situs pembaruan)

Saat ini metrikulator dilengkapi dengan metrik berikut:

  • McCabe (Kompleksitas Siklon)
  • EfferentCoupling per Jenis
  • Baris Kode Sumber Logis
  • Jumlah Anggota per Jenis
  • Jumlah Parameter per Fungsi

1

Anda harus mencoba oo-browser yang memiliki integrasi hebat dengan xemacs


1

Satu juga dapat kode ekstensi GCC di MELT (bahasa domain khusus yang dirancang untuk memperluas GCC) atau plugin GCC di C (jauh lebih sulit) untuk melakukan beberapa analisis khusus.


2
Telah membaca salah satu PDF tentang MELT dan memperluas gcc dengan lelehan, perasaan saya adalah bahwa masih terlalu rumit / sulit untuk menambahkan plugin Anda sendiri ke gcc. Bukan cara praktis untuk pengguna biasa.
zhaorufei

1
Memperluas GCC itu rumit, apa pun cara Anda melakukannya (melalui plugin C, melalui MELT atau bahkan melalui Python). Ini karena GCC itu kompleks. Dan menyesuaikan alat analisis statis C ++ apa pun sulit karena spesifikasi bahasa C ++ sangat kompleks, dan Anda harus menangani sebagian besar kerumitan itu (program C ++ non-sepele menggunakan banyak fitur C ++, mungkin melalui perpustakaan standar C ++) .
Basile Starynkevitch

0

Doxygen melakukan beberapa analisis aliran kontrol dan menghasilkan grafik. Itu mungkin bukan yang Anda cari, tetapi saya telah menemukan mereka berguna untuk dilihat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.