Làm thế nào để tôi xác định vị trí các chức năng chưa được kiểm tra? [đóng cửa]


8

Tôi đang xem xét một số mã C / C ++ có vẻ như có các hàm được xác định, nhưng không bao giờ được sử dụng. Đây là một quá trình khá tẻ nhạt để theo dõi mã và xác minh. Tôi đã thực hiện một số khảo sát và có một số công cụ có thể thực hiện loại phân tích này.

Bất cứ ai cũng có thể chia sẻ bất kỳ kinh nghiệm hoặc mẹo về công cụ và kỹ thuật nào là phương pháp tốt nhất hoặc thay thế để xác minh mã này trong thực tế không được sử dụng?


Câu trả lời:


10

Có một số công cụ có thể tìm thấy "mã chết" trong các chương trình của bạn. bạn có thể đọc về chúng trên các chủ đề Stack Overflow tại đâyđây . một tóm tắt nhỏ:

sử dụng các cờ biên dịch gcc -Wunuse và -Wunreachable-code, sau đó sử dụng một công cụ như lcov để tìm các phương thức không sử dụng.


3
Không chắc chắn phương tiện nào tồn tại trong trình biên dịch của bạn, nhưng lưu ý rằng nếu bạn đang sử dụng lệnh gọi dựa trên bất kỳ loại phản xạ hoặc RTTI nào, có thể gọi một phương thức theo tên không được tham chiếu tĩnh ở bất kỳ đâu trong cơ sở mã.
Mason Wheeler

5

Dấu vết? Tại sao? Chỉ cần nhận xét chúng ra và chạy qua trình biên dịch. Nó sẽ nhanh chóng cho bạn biết nếu bạn nhận xét một số chức năng được tham chiếu ở một nơi khác.


3
Sẽ phải lưu ý rằng điều này sẽ chỉ hoạt động trong các ngôn ngữ được biên dịch và không được giải thích những ngôn ngữ như PHP. Ngoài ra, nó không thực tế đối với bất kỳ dự án lớn nào, vì bạn có thể mất nhiều ngày để bình luận / bỏ qua tất cả các phương pháp và kiểm tra chúng.
Thưởng thức Ždralo

1
Anh ấy xác định rõ ràng rằng anh ấy đang ở trong C ++. Việc xây dựng lại tăng dần là cực kỳ nhanh - nếu tất cả những gì bạn đã làm là nhận xét một phương thức trong một tệp nguồn, trình liên kết có thể cho bạn biết rất rõ.
DeadMG

Trong C điều này chủ yếu nên làm việc. Nhưng có những phức tạp như mã sử dụng DEFINE để chuyển đổi giữa các triển khai khác nhau. Trong C ++ không hoạt động đáng tin cậy do quá tải chức năng, chuyên môn hóa mẫu và có thể là một vài tính năng khác.
CodeInChaos

2

Nếu bạn đang tích cực tìm kiếm mã không sử dụng, hãy sử dụng một cái gì đó Jake223 đề xuất .

Nhưng, nếu bạn chỉ vấp phải một số mã dường như không được sử dụng, bạn có thể thực hiện tìm kiếm tên của phương thức trong cơ sở mã của bạn. Nếu đó là một phương thức riêng tư, công việc của bạn rất dễ dàng, chỉ tìm kiếm lớp hiện tại. Nếu đó là một phương pháp công khai, tìm kiếm mọi thứ. Nếu đó là cả một lớp, hãy tìm kiếm tên của nó trong tất cả mã của bạn.

Không đánh? Hoàn hảo. Xóa mã và chạy thử nghiệm . Bạn có bài kiểm tra nào không? Hơn cam kết thay đổi hệ thống phiên bản tài liệu của bạn . Bạn sử dụng một, phải không? Bằng cách đó, nếu bạn phát hiện ra, bao giờ, rằng bạn cần nó trở lại, bạn chỉ cần hoàn nguyên một thay đổi.

Xóa mã nên là điều bạn làm mỗi ngày. Có thể bạn cấu trúc lại một số mã và xóa mã cũ. Hoặc tìm mã cũ, không sử dụng và xóa nó. Và ngay cả khi bạn không có bản sao lưu, việc viết lại một hoặc hai chức năng khó đến mức nào? Và lần thứ hai bạn chắc chắn sẽ viết chúng tốt hơn trước.


+1 để đề xuất quy trình tốt, lỗi thời, tẻ nhạt của việc tìm kiếm thủ công các tên hàm. Không có nhiều niềm vui, nhưng nó hoạt động!

1
Và nó cũng không tẻ nhạt. Bất kỳ IDE hiện đại nào cũng có thể rất thông minh tìm kiếm bất kỳ văn bản nào. Hơn nữa, đối với C, C ++, Java và thậm chí một mức độ nào đó đối với PHP, bạn có thể chỉ cần nhấp chuột phải vào một chức năng và nhấn "Tìm cách sử dụng".
Patkos Csaba

0

Trừ khi bạn đang tìm kiếm rắc rối (tức là, bạn biết họ nên được gọi) tại sao phải bận tâm. Nếu chúng thực sự chưa được khám phá, chúng có thể sẽ bị xóa bởi trình liên kết, và trong mọi trường hợp, không gian bị lãng phí là không đáng kể. Mặt khác, nếu bạn loại bỏ chúng và sau đó thấy chúng là cần thiết (có thể trong một số cấu hình trình biên dịch mà bạn không biết), bạn sẽ có nhiều việc phải làm để khôi phục chúng. Điều này đặc biệt khó khăn nếu việc loại bỏ và khám phá lại được phân tách bằng nhiều thời gian.


3
Lý do là nếu chúng chưa được mở, thì bạn đang duy trì mã không nên duy trì và do đó lãng phí thời gian kỹ thuật có giá trị.
Michael Kohne

Khi bạn đang làm việc trên một cái gì đó, vâng, sẽ có nhiều chức năng chưa được khám phá, do đó bạn có thể cần phải giữ chúng xung quanh ngay cả khi trình biên dịch của bạn cảnh báo rằng chúng không nên tồn tại. Một ý tưởng tốt sẽ là nhận xét chúng nếu có ít khả năng được sử dụng. Nhưng thêm một điểm đánh dấu rõ ràng cho biết mã này không phải là rác, hãy thêm một ngày và nếu bạn là thành viên của một nhóm, người sẽ liên hệ trước khi xóa chúng.
DPD

Theo DO-178, các chức năng không được sử dụng mà không được thiết kế hợp lý sẽ không xuất hiện.
jinawee

0

Ý tưởng lựa chọn của tôi là Eclipse, và mặc dù lúc đầu nó thật rắc rối và hơi khó khăn để thiết lập, nhưng nó cũng đáng để nỗ lực xem xét tất cả các công cụ tôi có. Một công cụ như vậy (và tôi không biết tên chính thức của nó là gì) thông báo cho bạn về mã không được sử dụng, chẳng hạn như các lớp, hàm, biến, v.v. IDE chỉ đơn giản hiển thị một dòng màu vàng bên dưới khai báo. Tôi không chắc chắn 100% nếu điều này hoạt động với các dự án nhiều tệp, nhưng bạn luôn có thể cung cấp cho nó một shot!


0

IDE thường có tính năng này được triển khai tốt và nó hoạt động theo mặc định (nó thường có thể bị tắt).

Dù bạn chọn phương pháp nào từ các câu trả lời khác để tìm mã chết, hãy luôn chú ý đến các vấn đề phản ánh. Một số phương thức / trường có thể được truy cập thông qua sự phản ánh một mình. Loại bỏ các phương thức đó sẽ không kích hoạt bất kỳ báo động nào, ngoại trừ trong thời gian chạy.

Nếu bạn có các bài kiểm tra (tốt) được viết cho các dự án của mình, chúng sẽ có giá trị lớn trong tình huống này.


0

Bạn có thể sử dụng Cppcheck cho mục đích này:

$ cppcheck --enable=unusedFunction .
Checking foo.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[foo.c:1]: (style) The function 'foo' is never used.
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.