Những công cụ phân tích tĩnh C ++ mã nguồn mở nào có sẵn? [đóng cửa]


301

Java có một số công cụ phân tích tĩnh nguồn mở rất tốt như FindBugs , CheckstylePMD . Những công cụ này rất dễ sử dụng, rất hữu ích, chạy trên nhiều hệ điều hành và miễn phí .

Sản phẩm phân tích tĩnh C ++ thương mại có sẵn. Mặc dù có những sản phẩm như vậy là tuyệt vời, nhưng chi phí chỉ là quá nhiều cho sinh viên và thường khá khó để có được phiên bản dùng thử.

Cách khác là tìm các công cụ phân tích tĩnh C ++ mã nguồn mở sẽ chạy trên nhiều nền tảng (Windows và Unix). Bằng cách sử dụng một công cụ nguồn mở, nó có thể được sửa đổi để phù hợp với các nhu cầu nhất định. Tìm kiếm các công cụ không phải là nhiệm vụ dễ dàng.

Dưới đây là danh sách ngắn các công cụ phân tích tĩnh C ++ được tìm thấy hoặc đề xuất bởi những người khác.

Một số công cụ phân tích tĩnh C ++ mã nguồn mở di động khác mà bất cứ ai cũng biết và có thể được đề xuất là gì?

Một số liên kết liên quan.


Thương mại, Công cụ tái cấu trúc phần mềm DMS, xử lý Java, C, C ++ và COBOL, cung cấp phân tích cú pháp, xây dựng AST, phân giải tên / loại, phân tích luồng dữ liệu / điều khiển, phân tích và chuyển đổi tùy chỉnh. Xem semanticdesigns.com/ Products / DMS / DMSToolkit.html .
Ira Baxter

1
Đối với công cụ thương mại cũng có CppDepend ( cppdepend.com ) và có thể phiên bản dùng thử có thể đủ cho sinh viên.

Câu trả lời:


21

Oink là một công cụ được xây dựng trên đỉnh của Elsa C ++. Thịt lợn của Mozilla là một nhánh của Elsa / Oink.

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


1
Tôi đã biên soạn hơn 1000 chương trình trong đời, nhưng vì tình yêu của Chúa, tôi không thể biên dịch gói này cho dù thế nào đi chăng nữa. Tôi đã thử sử dụng Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - nhưng không. Một cái gì đó luôn luôn thiếu và tài liệu chỉ đơn giản là khủng khiếp. Đừng hiểu lầm tôi, tôi đoán công cụ này là tuyệt vời. Nhưng trang web và tài liệu có vẻ như không ai chạm vào họ trong vòng 10 - 15 năm.
Apache

73

CppCheck là mã nguồn mở và đa nền tảng.

Mac OSX:

brew install cppcheck

1
@gio Tôi chưa thấy vấn đề cá nhân. Tôi tin rằng CppCheck có khả năng bỏ qua hoặc loại trừ các đường dẫn hoặc tệp nhất định, giúp thu hẹp phạm vi.
Soo Wei Tan

1
Trên Windows:choco install cppcheck
KindDragon

53

Liên quan đến trình biên dịch GNU, gcc đã có tùy chọn dựng sẵn cho phép cảnh báo bổ sung cho các trình biên dịch -Wall. Tùy chọn là -weffc ++ và đó là về việc vi phạm một số nguyên tắc của Scott Meyers được xuất bản trong cuốn sách " C ++ hiệu quả và hiệu quả hơn ".

Cụ thể, tùy chọn phát hiện các mục sau:

  • Xác định một hàm tạo sao chép và một toán tử gán cho các lớp có bộ nhớ được cấp phát động.
  • Thích khởi tạo để gán trong hàm tạo.
  • Làm cho các hàm hủy ảo trong các lớp cơ sở.
  • Có "toán tử =" trả về một tham chiếu đến * này.
  • Đừng cố trả lại một tham chiếu khi bạn phải trả lại một đối tượng.
  • Phân biệt giữa các hình thức tiền tố và hậu tố của toán tử tăng và giảm.
  • Không bao giờ quá tải "&&", "||" hoặc ",".

7
Ngoài gcc's -Wall và -weffc ++, -Wextra thực hiện một số phân tích tĩnh miễn phí tốt, ví dụ: các nhánh không trả về giá trị hoặc kiểm tra một dấu không nhỏ hơn 0. Thật đáng chú ý khi các lập trình viên chuyên nghiệp thường nghĩ rằng cái sau là một ý tưởng hay
Flash

24
Yuck, -Weffc++cảnh báo về hàng tấn các công trình hoàn toàn tốt trong một cơ sở mã lớn. Tôi thứ hai gợi ý về -Wextra, mặc dù; Đừng rời khỏi nhà mà không có nó!
Tom

29

Hiện đang được phát triển, nhưng clang thực hiện phân tích C và được nhắm mục tiêu để xử lý C ++ theo thời gian. Đây là một phần của dự án LLVM .

Cập nhật : Mặc dù trang đích cho biết "Bộ phân tích là một công việc đang tiến hành liên tục", tuy nhiên hiện tại nó vẫn được ghi nhận là một bộ phân tích tĩnh cho cả C và C ++.

Câu hỏi: Làm cách nào tôi có thể chạy GCC / Clang để phân tích tĩnh? (chỉ cảnh báo)

Tùy chọn trình biên dịch: -fsyntax-only


1
LLVM là một dự án rất thú vị so với gcc, tạo ra các nhị phân được tối ưu hóa trong thời gian ngắn hơn; và clang, khi hoàn thành, sẽ là mặt trước của nó ...
Nicola Bonelli

Một biên tập viên khác đã thêm thông tin vào công tắc chỉ -fsyntax. Chỉ cần lưu ý rằng về cơ bản, đó là một yêu cầu để chạy phân tích rằng trình biên dịch sẽ chạy mà không thực sự biên dịch và phát ra các cảnh báo. Tôi không chắc, nhưng tôi nghĩ nó khác với phân tích tĩnh.
Don Wakefield

17

Một số người khác đã đề cập-Weffc ++, nhưng đó thực sự là một trong những cảnh báo GCC duy nhất tôi không bật theo mặc định. Tuy nhiên, tập hợp các cảnh báo mà tôi bật là công cụ phân tích tĩnh quan trọng nhất trong bộ công cụ của tôi. Bạn có thể xem danh sách đầy đủ các cảnh báo được đề nghị .

Tóm tắt:

-pedantic -Wall -Wextra -Wcast-align -Wcast-Qual -Wctor-dtor-Privacy -Wdisables-Optimization -Wformat = 2 -Winit-self -Wlogical-op -Wmissing-tuyên bố -Wmissing-include-dirs -style-cast -Woverloaded-virtual -Wredplus-Decs -Wshadow -Wsign-convert -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno

Lưu ý rằng một số trong số này yêu cầu một phiên bản gcc mới, vì vậy bạn có thể cần loại bỏ chúng khỏi danh sách của mình nếu bạn bị kẹt lại trên 4.5 hoặc một cái gì đó.



7

Nếu theo Nguồn mở, bạn thực sự có nghĩa là "miễn phí", thì phân tích đúc sẵn của Microsoft là một cách tốt. Windows chỉ có khóa học. Nó được tích hợp đầy đủ trong Visual Studio & trình biên dịch. ví dụ:

cl /analyze Sample.cpp

Phiên bản & phiên bản này có sẵn trong?
twk

Có vẻ như được tích hợp vào trình biên dịch, miễn phí. Việc tích hợp chỉ là phiên bản Team.
JBRWilkinson


4

Nẹp dường như điền vào hóa đơn cho C.

Nếu bạn không chỉ định nguồn mở, tôi nói PCLint của Gimpel Software có lẽ là một trong những công cụ tốt nhất có sẵn để kiểm tra mã tĩnh trong C ++. Nhưng, tất nhiên, nó không phải là nguồn mở.

Mac OSX:

brew install splint

2
Nhưng đắt cho một nhà phát triển duy nhất :) Tôi thích miễn phí tốt hơn
Robert Gould

6
nẹp là dành cho C, không phải C ++. Tôi không biết họ có kế hoạch mở rộng phạm vi bảo hiểm hay không. Hy vọng là như vậy!
Harold Bamford

Có, pclint đáng để thử, phần đối tác trong unix được gọi là flexe-lint, phiên bản 9.0 phải nhanh hơn phiên bản 8.x, phiên bản 9.0 cũng hỗ trợ tiêu đề được biên dịch sẵn để tăng tốc độ phân tích. Phải mất thời gian để bạn chế ngự pc-lint, nó có kết quả dương tính giả có thể khiến bạn gặp rắc rối nếu bạn không thể chọn lọc bỏ qua nó.
zhaorufei

3

PREFast của Microsoft cũng có sẵn trong Windows Driver Kit. Phiên bản 7.0 có thể tải xuống tại đây .

Các tài liệu của Microsoft tuyên bố rằng nó chỉ nên được chạy với mã trình điều khiển nhưng bài đăng trên blog (cũ) này đưa ra các bước để chạy nó. Có lẽ nó có thể được tích hợp vào một quá trình xây dựng bình thường?


PREFast sẽ làm chậm quá trình xây dựng của bạn rất nhiều, đối với bất kỳ dự án thực tế nào, máy chủ xây dựng của bạn có thể không đủ khả năng.
zhaorufei

@zhaorufei: Hầu hết các phân tích tĩnh không "nhanh"; họ có một công việc phân tích mã khá phức tạp để làm, theo định nghĩa. Nếu bạn không thích chi phí xây dựng mọi lúc, chỉ cần làm cho nó tùy chọn.
Ira Baxter

2

Chúng tôi đã làm việc trên một trình cắm thêm CDT của Eclipse được gọi là bộ số liệu. Nó vẫn đang được phát triển nhưng một số số liệu chính (ví dụ LSLOC, McCabe, EfferentCoupling) đã được triển khai.

Xem http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation để biết thêm chi tiết như trình diễn và tài liệu video.

Bản dựng hàng đêm mới nhất có sẵn để cài đặt qua trang cập nhật tại: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Mô tả thêm

Bộ số hóa phân tích tĩnh mã nguồn C ++ và tạo số liệu phần mềm. Số liệu được thực hiện dưới dạng kiểm tra Codan. Các kết quả phân tích có thể được khám phá trong một cái nhìn riêng biệt. Mỗi số liệu có các thuộc tính có thể định cấu hình (ví dụ: ngưỡng cho 'dòng mã tối đa cho mỗi chức năng'). Vượt quá các ngưỡng này sẽ báo cáo sự cố và tạo điểm đánh dấu trong trình chỉnh sửa mã nguồn.

với bộ số liệu bạn có thể:

  • phân tích tập tin / thư mục / dự án C ++
  • xác định ngưỡng số liệu và bật / tắt số liệu bằng trang tùy chọn Codans
  • có các dấu hiệu vấn đề trong trình soạn thảo mã nguồn
  • khám phá kết quả số liệu
  • xuất kết quả số liệu dưới dạng đám mây thẻ (có sẵn dưới dạng tính năng tùy chọn qua trang web cập nhật)

Hiện tại bộ số liệu đi kèm với các số liệu sau:

  • McCabe (Độ phức tạp theo chu kỳ)
  • EfferentCoupling mỗi loại
  • Dòng mã nguồn hợp lý
  • Số lượng thành viên mỗi loại
  • Số lượng tham số cho mỗi hàm

1

Bạn nên thử oo-browser nó có tích hợp tuyệt vời với xemacs


1

Người ta cũng có thể mã các phần mở rộng của GCC trong MELT (một ngôn ngữ cụ thể theo miền được thiết kế để mở rộng GCC) hoặc các plugin GCC trong C (khó hơn nhiều) để thực hiện một số phân tích tùy chỉnh.


2
Đã đọc một trong những bản PDF về MELT và mở rộng gcc với sự tan chảy, cảm giác của tôi là nó vẫn quá phức tạp / khác biệt để thêm các plugin của riêng bạn vào gcc. Cách không thực tế cho người dùng thông thường.
zhaorufei

1
Việc mở rộng GCC rất phức tạp, bất kể bạn làm gì (thông qua các plugin C, thông qua MELT hoặc thậm chí thông qua Python). Điều này là do GCC phức tạp. Và việc tùy chỉnh bất kỳ công cụ phân tích tĩnh C ++ nào cũng khó vì đặc tả ngôn ngữ C ++ rất phức tạp và bạn sẽ cần xử lý hầu hết sự phức tạp đó (bất kỳ chương trình C ++ không tầm thường nào cũng sử dụng nhiều tính năng của C ++, có lẽ là thông qua thư viện chuẩn C ++) .
Basile Starynkevitch

0

Doxygen thực hiện một số phân tích dòng điều khiển và tạo ra các biểu đồ. Đó có thể không phải là những gì bạn đang tìm kiếm, nhưng tôi cho rằng chúng hữu ích để xem xét.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.