2008-08-05 46 views
54

Tôi đang làm việc trên một dự án mà tôi đang mã hóa trong C trong môi trường UNIX. Tôi đã sử dụng công cụ lint để kiểm tra mã nguồn của mình. Lint đã được khoảng một thời gian dài (từ năm 1979), bất cứ ai có thể đề nghị một công cụ phân tích mã gần đây hơn tôi có thể sử dụng? Tốt hơn là một công cụ miễn phí.Chọn công cụ phân tích mã tĩnh

+1

Xem thêm [công cụ dòng lệnh tốt nhất để là gì clean-up code] (http://stackoverflow.com/questions/393208/what-is-the-best-command-line-tool-to-clean-up-code/) và [Các tùy chọn cảnh báo GCC được đề xuất cho C] (http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c). Nếu bạn có các mẫu thử được tập trung đúng vào các tiêu đề và được sử dụng ở khắp mọi nơi, thì việc kiểm tra chéo tập tin mà 'lint' cũng được thực hiện bởi trình biên dịch (mặc dù một tệp tại một thời điểm). –

+0

Bỏ phiếu để đóng như công cụ rec. –

+0

Máy phân tích PVS-Studio hiện đã có cho Linux - http://www.viva64.com/en/b/0441/ –

Trả lời

29

Đừng bỏ qua trình biên dịch.

Đọc tài liệu của trình biên dịch và tìm tất cả các cảnh báo và lỗi mà nó có thể cung cấp, sau đó bật nhiều ý nghĩa cho bạn.

Ngoài ra, hãy đảm bảo trình biên dịch của bạn xử lý các cảnh báo như lỗi để bạn buộc phải sửa chúng ngay lập tức. ("-Werror" trên gcc)

Ngoài ra: "-Wall" trên gcc không không bật tất cả cảnh báo, đừng bị lừa.

Ngoài ra còn: kiểm tra valgrind (miễn phí!) - nó "tự động phát hiện [s] nhiều quản lý bộ nhớ và lỗi luồng và lược tả chi tiết các chương trình của bạn."

Valgrind không phải là trình kiểm tra tĩnh, nhưng đó là một công cụ tuyệt vời! http://valgrind.org

+17

Làm thế nào đến đây là câu trả lời được chấp nhận? Điều gì sẽ xảy ra nếu tôi muốn kiểm tra an toàn tài nguyên, chẳng hạn như khóa/mở khóa? Trình biên dịch không thể làm bất cứ điều gì. Và valgrind là phân tích mã động ... – UmNyobe

14

Đối với mã C, chắc chắn bạn chắc chắn nên sử dụng Flexelint. Tôi đã sử dụng nó gần 15 năm và thề. Một trong những tính năng thực sự tuyệt vời của nó là cảnh báo có thể được tắt một cách có chọn lọc và bật thông qua các chú thích trong mã ("/ * lint -e123 * /"). Điều này hóa ra lại là một công cụ tài liệu mạnh mẽ khi bạn muốn một thứ gì đó bình thường. "Tôi đang tắt cảnh báo X, do đó, có một số lý do chính đáng tôi đang làm X."

Đối với bất kỳ ai trong các câu hỏi C/C++ thú vị, hãy xem một số ví dụ của họ trên trang web của họ và xem liệu bạn có thể tìm ra các lỗi mà không xem xét các gợi ý hay không.

+8

Flexelint rất đắt tiền. – nwp

+2

@ nwp, tôi sẽ không nói nó đắt tiền. Với chi phí một chỗ ngồi là 1000 đô la (unix) hoặc 400 đô la (cửa sổ), nó có thể trả cho chính nó với một vấn đề của khách hàng. –

+0

@MarkHarrison: Tôi có thể sử dụng trực tuyến không? –

12

Tôi đã nghe những điều tốt đẹp về clang static analyzer, IIRC sử dụng LLVM làm phụ trợ. Nếu điều đó được triển khai trên nền tảng của bạn, đó có thể là một lựa chọn tốt.

Từ những gì tôi hiểu, nó không hơn một chút so với phân tích cú pháp. Ví dụ: "Tìm kiếm lỗi tự động".

5

Chúng tôi đã sử dụng Coverity Prevent để xem mã nguồn C++.

Đây không phải là công cụ miễn phí (mặc dù tôi tin rằng chúng cung cấp quét miễn phí cho các dự án mã nguồn mở), nhưng đây là một trong những công cụ phân tích tĩnh tốt nhất mà bạn sẽ tìm thấy. Tôi đã nghe nó thậm chí còn ấn tượng hơn trên C so với C++, nhưng nó đã giúp chúng ta tránh được khá nhiều lỗi cho đến nay.

0

Có một "-WeffC++" tùy chọn cho gcc mà theo man page Mac OS X sẽ:

Cảnh báo về hành vi vi phạm các hướng dẫn phong cách sau đây từ Scott Meyers' Effective C++ cuốn sách:

[snip]

tôi biết bạn hỏi về C, nhưng điều này là gần nhất tôi biết ..

+0

Đối với một cơ sở mã hiện có, -WeffC++ có quá nhiều cảnh báo "naggy" để biện minh cho việc sử dụng kết hợp với -Werror. – Tom

1

Bạn có thể tìm thấy Uno tool hữu ích. Đây là một trong số ít tùy chọn không đồ chơi miễn phí. Nó khác với lint, Flexelint, v.v.tập trung vào một số lượng nhỏ các lỗi "ngữ nghĩa" (các derefs con trỏ rỗng, các chỉ mục mảng ngoài giới hạn và sử dụng các biến chưa được khởi tạo). Nó cũng cho phép kiểm tra người dùng xác định, như kỷ luật khóa mở khóa.

Tôi đang làm việc hướng tới một công bố công khai một công cụ kế, Orion (CONTENT không có sẵn nữa)

0

lint được cập nhật liên tục ... vậy tại sao bạn sẽ muốn có một gần đây .

BTW flexelint lint

+2

FlexeLint là một sản phẩm thương mại không có lịch sử phát triển chung với Unix Lint, AFAIK gốc của Johnson. Một lựa chọn phi thương mại là Splint. –

1

cụ Lint như thường bị một "báo động giả" vấn đề: họ báo cáo rất nhiều vấn đề hơn thực sự tồn tại. Nếu tỷ lệ cảnh báo thực sự hữu ích quá thấp, người dùng sẽ học cách bỏ qua công cụ. Nhiều công cụ hiện đại hơn dành một số nỗ lực để tập trung vào các cảnh báo có khả năng/thú vị nhất.

0

G'day,

Tôi hoàn toàn đồng ý với các đề xuất để đọc và phân tích những gì trình biên dịch nói cho bạn sau khi thiết lập -Wall.

Công cụ phân tích tĩnh tốt cho bảo mật là FlawFinder được viết bởi David Wheeler. Một công việc tốt là tìm kiếm các khai thác bảo mật khác nhau,

Tuy nhiên, nó không thay thế việc có một người hiểu biết đọc mã của bạn. Như David nói trên trang web của mình, "Một kẻ ngốc với một công cụ vẫn là một kẻ ngốc!"

cổ vũ,

Rob

5

Gần đây tôi đã biên soạn một danh sách tất cả các công cụ phân tích tĩnh tôi đã sắp xếp của tôi, tôi vẫn còn trong quá trình đánh giá tất cả. Lưu ý, đây chủ yếu là các công cụ phân tích bảo mật.

+1

+1 cho nẹp, công cụ tuyệt vời và miễn phí (như trong tự do ngôn luận, không phải là trong bia miễn phí) – bortzmeyer

+5

Nó miễn phí trong cả hai ý nghĩa của thuật ngữ. – sebnow

1

PC-lint/Flexelint rất mạnh mẽ và công cụ phân tích tĩnh hữu ích, và cấu hình cao, mặc dù buồn bã không được tự do.

Khi lần đầu tiên sử dụng công cụ như thế này, chúng có thể tạo ra một số cảnh báo rất lớn, điều này có thể gây khó khăn cho việc phân biệt giữa các cảnh báo lớn và nhỏ. Vì vậy, tốt nhất là nên bắt đầu sử dụng công cụ trên mã của bạn càng sớm càng tốt trong dự án và sau đó chạy nó trên mã của bạn càng thường xuyên càng tốt để bạn có thể xử lý các cảnh báo mới khi chúng xuất hiện.

Với việc sử dụng liên tục như thế này, bạn sẽ sớm tìm hiểu cách viết mã theo cách xác nhận các quy tắc được công cụ áp dụng.

Vì điều này, tôi thích các công cụ như Lint chạy tương đối nhanh và khuyến khích sử dụng liên tục, thay vì các công cụ cồng kềnh hơn mà bạn có thể sử dụng ít thường xuyên hơn, nếu có.

0

Tôi thấy rằng tốt nhất là nên sử dụng nhiều công cụ phân tích tĩnh để tìm lỗi.Mọi công cụ đều được thiết kế khác nhau và họ có thể tìm thấy những thứ rất khác nhau.

Có một số cuộc thảo luận tốt trong một số cuộc hội đàm here. Đó là từ một hội nghị được tổ chức bởi Bộ An ninh Nội địa Hoa Kỳ về phân tích tĩnh.

0

Sparse là một công cụ phần mềm máy tính, đã có sẵn trên Linux, được thiết kế để tìm các lỗi mã hóa có thể có trong hạt nhân Linux.

Có hai dự án đang hoạt động là Linux Verification Center nhằm cải thiện chất lượng của các mô-đun hạt nhân có thể nạp được.

  1. Xác minh trình điều khiển Linux (LDV) - bộ công cụ toàn diện để xác minh mã nguồn tĩnh của trình điều khiển thiết bị Linux.
  2. KEDR Framework - một khuôn khổ mở rộng để phân tích động và xác minh mô-đun hạt nhân.
  3. Một dự án đang diễn ra khác là Xác minh hệ thống tệp Linux nhằm mục đích phát triển một bộ công cụ chuyên dụng để xác minh việc triển khai hệ thống tệp Linux.
4

Bạn có thể sử dụng cppcheck. Nó là một công cụ phân tích mã tĩnh dễ sử dụng.
Ví dụ:
cppcheck --enable=all .
sẽ kiểm tra tất cả các tệp C/C++ trong thư mục hiện tại.

1

Bạn có thể thử CppDepend, một phân tích tĩnh khá hoàn chỉnh có sẵn trên Windows và Linux, Xuyên VS Plugin, IDE hoặc dòng lệnh, và nó hoàn toàn miễn phí cho open source contributors