Thật dễ dàng để có được một danh sách các hàm và biến không sử dụng với phản hồi của trình liên kết, nhưng làm thế nào tôi có thể phát hiện những định nghĩa macro chưa sử dụng đó & typedef? Tôi có phải duyệt dòng mã bằng dòng và git grep trong toàn bộ dự án không?Làm thế nào để phát hiện các định nghĩa macro & typedef không sử dụng?
Trả lời
Công cụ phân tích tĩnh cho các chương trình C và C++ có thể bao gồm kiểm tra các macro tiền xử lý không sử dụng.
Ví dụ: xem PC-Lint.
Một khả năng khác là đi vào các tệp cụ thể bao gồm và sử dụng #ifdef 0
để loại bỏ các phần lớn macro và sau đó xem lại lỗi trình biên dịch bằng cách sử dụng thuật toán phân chia và chinh phục.
Tuy nhiên tôi hy vọng rằng một công cụ phân tích tĩnh sẽ là cách tiếp cận tốt hơn nhiều khi kích thước mã nguồn trở nên lớn.
PC-Lint là một công cụ tuyệt vời cần có trong * mọi máy tính của nhà phát triển chuyên nghiệp. –
Ngoại trừ hàng triệu nhà phát triển không bao giờ chạm vào Windoze. –
Flexlint là một giải pháp thay thế cho PC-Lint. –
Đối với các macro chưa sử dụng, bạn có thể muốn xem coan. Nó có các tùy chọn có thể hỗ trợ với nhiệm vụ này. Từ số about page:
Ký hiệu nào sẽ xuất hiện trong chỉ thị tiền xử lý hoạt động trong một cấu hình nhất định?
(Chỉ thị tiền xử lý đang hoạt động nếu nó không nằm trong phạm vi của bất kỳ #if sai nào). Giả sử một lần nữa rằng bạn quan tâm đến nguồn C trong ứng dụng, bạn có thể hiển thị danh sách các ký hiệu này, với tên tệp và số dòng, với lệnh:
$> ký hiệu coan --recurse --locate - active --once --filter c, h app
Nó có các tùy chọn để loại bỏ các đoạn mã có điều kiện (#if 0
và bạn bè), và nhiều tính năng hữu ích khác để xử lý tiền xử lý C. Tôi sẽ sử dụng nó để thu thập tất cả các biểu tượng #define
d và tất cả các biểu tượng và bạn bè #ifdef
hoặc defined
. Tôi sắp xếp và uniq hai bộ sưu tập các biểu tượng và phân biệt chúng. Đây là một cách khá tốt để định vị lỗi chính tả. Sau đó, tôi sẽ lấy một biểu đồ của họ một cách riêng biệt và bắt đầu với ít nhất là thường xuyên và làm việc theo cách của tôi lên danh sách.
Đối với typedef không sử dụng, đó là một thách thức khác. Bạn có thể sử dụng chương trình loại tham chiếu chéo như OpenGrok hoặc GNU Global, nhưng điều đó không thực sự tự động.
Đối với các macro được xác định trong tệp nguồn, bạn có thể thử cờ -Wunused-macros
gcc/clang. Ngoài ra còn có -Wunused-local-typedefs
trong gcc.
Có cscout (nay là mã nguồn mở) tại địa chỉ:
https://github.com/dspinellis/cscout
mà thấy chưa sử dụng 'extern', #define.
- 1. Tôi có thể sử dụng macro được xác định trước nào để phát hiện tiếng kêu?
- 2. Nguyên mẫu hàm typedef có thể được sử dụng trong định nghĩa hàm không?
- 3. Làm cách nào để tôi có thể sử dụng lại các subtrees định nghĩa (AST) trong macro?
- 4. Làm thế nào để phát hiện IE8, sử dụng JQuery?
- 5. Làm thế nào để thêm định nghĩa của macro trong cmake?
- 6. Pragma trong định nghĩa macro
- 7. cách thay thế macro latex bằng định nghĩa của chúng (sử dụng latex)
- 8. Làm thế nào để biết nếu __uint128_t được định nghĩa
- 9. Làm thế nào để sử dụng VisualVM để phát hiện các nút cổ chai/vấn đề
- 10. Phát hiện các định nghĩa hàm trống trong python
- 11. Làm thế nào để sử dụng các hàm do người dùng SQL định nghĩa trong .NET?
- 12. định nghĩa macro chứa #include chỉ thị
- 13. Làm thế nào để sử dụng các biến cho định nghĩa classpath trong các cấu hình khởi chạy Eclipse?
- 14. Làm thế nào để phát hiện các thay đổi định hướng và thay đổi bố cục?
- 15. Làm thế nào để phát hiện các DPI màn hình sử dụng JavaScript
- 16. phát hiện có nghĩa là sử dụng lợn hoặc hadoop
- 17. C/C++ định nghĩa macro mát mẻ?
- 18. Định nghĩa lại typedef trong lớp dẫn xuất?
- 19. Làm cách nào để sử dụng macro TRACE trong các dự án không phải MFC?
- 20. C++ - Làm thế nào để sử dụng template typedef workaround trong khai báo chức năng?
- 21. Sử dụng hợp lệ typedef?
- 22. Phát hiện và báo cáo lỗi typedef ... Đây là gì?
- 23. Làm thế nào để tạo macro NSString?
- 24. Làm thế nào để khai báo extern typedef struct?
- 25. Trong clojure, làm thế nào để làm mã templating khi thực hiện một macro bằng cách sử dụng đệ quy
- 26. Làm thế nào để phát hiện phân phối Linux nào đang được sử dụng
- 27. Sử dụng OpenCV để phát hiện các điểm đỗ xe
- 28. C++: Sử dụng tự động hoặc typedef?
- 29. Sử dụng các macro trong C để xác định cấu trúc dữ liệu
- 30. Sử dụng sự phản chiếu, làm cách nào để phát hiện các thuộc tính có bộ định vị.
Trình biên dịch * không thể vì nó chạy sau bộ tiền xử lý. – chris
Tôi cho rằng một giải pháp khác với mã duyệt và grepping sẽ chạy 'gcc -E' với macro đã cho và không có macro cụ thể, sau đó so sánh kết quả. Nếu chúng giống nhau, macro không được sử dụng trong mã. Có lẽ một cách tốt hơn để làm điều đó, mặc dù. –
@EricFinn, Điều đó nghe có vẻ không tệ với tôi lúc đầu. Tôi biết rằng không phải là khả thi cho các cơ sở mã lớn, mặc dù. – chris