2009-02-13 41 views
7

Tôi hiện đang trong quá trình học C++, và vì tôi vẫn đang học, tôi tiếp tục phạm sai lầm.
Với ngôn ngữ được chấp nhận như C++, thường mất một thời gian dài để tìm ra chính xác những gì sai - bởi vì trình biên dịch cho phép tôi tránh xa rất nhiều. Tôi nhận ra rằng sự linh hoạt này là một trong những điểm mạnh chính của C++, nhưng nó làm cho việc học ngôn ngữ cơ bản trở nên khó khăn.
Có một số công cụ tôi có thể sử dụng để phân tích mã của mình và đưa ra đề xuất dựa trên các phương pháp hay nhất hay chỉ là mã hóa hợp lý? Tốt hơn là một ứng dụng Linux hoặc plugin của Eclipse.Công cụ phân tích mã C++

Trả lời

17

Bật cảnh báo trình biên dịch tối đa (đó là tùy chọn -Wall nếu bạn đang sử dụng trình biên dịch Gnu).

'Lint' là công cụ phân tích tĩnh nguyên mẫu.

valgrind là trình phân tích thời gian chạy tốt.

+2

+1 cho valgrind. Nó tìm thấy nhiều lỗi newbie subtile như tắt bởi một. – ypnos

+0

+1 cho lint, một công cụ tuyệt vời như vậy – JaredPar

+1

Hãy coi chừng rằng hầu hết phiên bản lint được viết cho C và khá vô dụng đối với C++. Gimple PC-Lint là một ngoại lệ. –

2

lint - có rất nhiều phiên bản nhưng nếu bạn google cho lint, bạn nên tìm một phiên bản hoạt động. Điều khác cần làm là bật cảnh báo trình biên dịch của bạn - nếu bạn đang sử dụng gcc/g ++ tùy chọn là -Wall.

Bạn có thể tìm thấy CppChecker hữu ích như một plugin cho Eclipse hỗ trợ gcc/PC lint.

3

Hỗ trợ công cụ cho C++ khá kém so với Java, C#, v.v. vì nó không có ngữ pháp ngữ cảnh. Trên thực tế, có một số phần của ngữ pháp C++ không thể xác định được. Về cơ bản, điều đó có nghĩa là việc hiểu mã C++ ở cấp cú pháp đòi hỏi phải thực hiện khá nhiều phần đầu biên dịch với phân tích ngữ nghĩa. Không thể phân tích cú pháp C++ thành một AST độc lập với phân tích ngữ nghĩa, và hầu hết các công cụ phân tích mã trong IDE,… hoạt động ở cấp độ AST. Đây là một phần của sự cân bằng mà bạn thực hiện để đổi lấy tính linh hoạt và khả năng tương thích ngược của C++.

+0

Và đây chính xác là lý do tại sao tôi muốn hét lên khi tôi nhìn thấy "tính năng" mới mà ủy ban tiêu chuẩn sẽ thêm vào trong C++ 0x! –

+0

C++ có ngữ pháp hoàn toàn không có ngữ cảnh, và có thể được phân tích cú pháp mà không cần phân tích ngữ nghĩa nếu tất cả những gì bạn muốn là một cây cú pháp (và một số sự mơ hồ). Bạn phải ngừng sử dụng công nghệ phân tích cú pháp yếu như LALR (ví dụ: YACC). Xem trình phân tích cú pháp GLR và đặc biệt xem Elsa www.eecs.berkeley.edu/~smcpeak/elkhound/sources/elsa/ và Bộ công cụ quản lý lại phần mềm DMS www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Cả hai các công cụ cũng cung cấp đầy đủ "phân tích ngữ nghĩa" theo nghĩa xác định ý nghĩa của biểu tượng và loại bỏ sự mơ hồ khỏi cây phân tích, nếu được yêu cầu. –

+0

Có, nhưng một số phần không rõ ràng là điểm tôi đã cố gắng thực hiện. – dsimcha

5

Đối với g + +, cũng như bật -Wall, bật tính năng quá lớn, và chuẩn bị để được ngạc nhiên về số lượng sự cố tìm thấy!

2

Tôi nghĩ rằng thực sự những gì bạn cần tìm hiểu ở đây là cách gỡ lỗi bên ngoài IDE. Đây là một kỹ năng có giá trị theo ý kiến ​​của tôi, vì bạn sẽ không còn đòi hỏi một bộ công cụ nặng để phát triển phần mềm nữa, và nó sẽ áp dụng cho phần lớn các ngôn ngữ bạn đã biết và sẽ học.

Tuy nhiên, đây là một khó khăn để làm quen với nó. Bạn sẽ phải viết mã chỉ cho mục đích gỡ lỗi, ví dụ: viết kiểm tra sau mỗi dòng chưa được gỡ lỗi, để đảm bảo rằng kết quả như mong đợi, hoặc in các giá trị cho bàn điều khiển hoặc trong hộp tin nhắn để bạn có thể tự kiểm tra. Tẻ nhạt của nó nhưng sẽ cho phép bạn nhận những sai lầm của bạn dễ dàng hơn, bên trong hoặc bên ngoài một IDE.

Tải xuống và thử một số công cụ gỡ lỗi miễn phí như GDB quá, chúng có thể giúp bạn tìm kiếm bộ nhớ, v.v. mà không cần phải viết mã của riêng bạn.

6

Tôi nghĩ bạn nên có một số bài giảng về thực hành tốt và lý do tại sao chúng tốt. Điều đó sẽ giúp bạn nhiều hơn một công cụ phân tích mã (ngay từ đầu).

Tôi khuyên bạn nên đọc loạt các ảnh Effective C++ và ** Effective STL sách ít nhất.Xem alsot The Definitive C++ Book Guide and List

+0

Tôi thứ hai bình luận lại đọc những cuốn sách này (+1). –

+1

+1 cho sách C++ hiệu quả của Meyer. –

3

Bật tất cả cảnh báo trình biên dịch (ít nhất là lúc đầu) và hiểu ý nghĩa của chúng, cách khắc phục sự cố được đánh dấu và cảnh báo nào thể hiện cấu trúc chính hãng mà người biên dịch có thể coi là mơ hồ.

Nếu bạn cần một nhiệm vụ nặng nề hơn, bạn có thể thử PC-Lint nếu bạn đang sử dụng Windows, đây vẫn là một trong những công cụ lint tốt nhất cho C++. Chỉ cần ghi nhớ rằng bạn sẽ cần phải cấu hình các công cụ này để phản ánh phong cách mã hóa của bạn, nếu không bạn sẽ nhận được đầm lầy với cảnh báo và sẽ không thể nhìn thấy gỗ cho cây. Có, nó chi phí tiền bạc và nó có thể là một chút overkill nếu bạn không làm C + + trên một "nhận được trả tiền cho nó" cấp, nhưng tôi thấy nó vô giá.

3

Có danh sách các công cụ phân tích mã tĩnh tại wikipedia. Tuy nhiên, cảnh báo nói chung là tốt nhưng một vấn đề với việc kích hoạt tất cả các cảnh báo với pedantic và Wall là số cảnh báo bạn có thể nhận được từ các tiêu đề mà bạn không có quyền kiểm soát, điều này có thể tạo ra nhiều tiếng ồn. Tôi thích để biên dịch phần mềm của riêng tôi với tất cả các cảnh báo được kích hoạt mặc dù. Như tôi đã lập trình trong linux Tôi thường làm như thế này:

Đặt tiêu đề bên ngoài Tôi cần phải bao gồm trong một file riêng biệt, và trong phần đầu của tập tin đó trước bao gồm đặt:

#pragma GCC system_header 

Và sau đó bao gồm tệp này từ mã của bạn. Điều này cho phép bạn xem tất cả các cảnh báo từ mã của riêng bạn mà không bị chìm trong cảnh báo từ mã bên ngoài. Nhược điểm là nó là một giải pháp cụ thể gcc, tôi không biết về bất kỳ giải pháp nền tảng độc lập nào cho điều này.